1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #ifndef F_CPU
|
6 | /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
|
7 | F_CPU im Makefile definiert werden, eine nochmalige Definition
|
8 | hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
|
9 | #ifndef/#endif
|
10 |
|
11 | Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
|
12 | verwendet wird und dort eine andere, nicht zur Hardware passende
|
13 | Taktrate eingestellt ist: Dann wird die folgende Definition
|
14 | nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
|
15 | von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
|
16 | noch nicht definiert: */
|
17 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
18 | #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
19 | // Ohne ergeben sich unten Fehler in der Berechnung
|
20 | #endif
|
21 |
|
22 | #define BAUD 9600UL // Baudrate
|
23 |
|
24 | // Berechnungen
|
25 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
26 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
27 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
28 |
|
29 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
30 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
31 | #endif
|
32 |
|
33 | int uart_putc(unsigned char c)
|
34 | {
|
35 | while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
|
36 | { }
|
37 |
|
38 | UDR0 = c; /* sende Zeichen */
|
39 | return 0;
|
40 | }
|
41 |
|
42 | void uart_puts (char *s)
|
43 | {
|
44 | while (*s)
|
45 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
|
46 | uart_putc(*s);
|
47 | s++;
|
48 | }
|
49 | }
|
50 |
|
51 | int main(void)
|
52 | {
|
53 | int16_t i = 0;
|
54 | char s[7];
|
55 |
|
56 | // PORTB |= (1<<PB7);
|
57 | DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5) | (1<<DDB6) | (1<<DDB7);
|
58 |
|
59 | UBRR0H = UBRR_VAL >> 8;
|
60 | UBRR0L = UBRR_VAL & 0xFF;
|
61 |
|
62 | UCSR0B |= (1<<TXEN0); // UART TX einschalten
|
63 | UCSR0C = (1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1
|
64 |
|
65 |
|
66 |
|
67 | for (;;) { /* loop forever */
|
68 |
|
69 | uart_putc(0x1B); // erase Screen
|
70 | uart_putc('[');
|
71 | uart_putc('2');
|
72 | uart_putc('J');
|
73 |
|
74 | itoa(i++, s, 10);
|
75 | uart_puts(s);
|
76 |
|
77 | PORTB ^= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
|
78 |
|
79 | _delay_ms(250);
|
80 | _delay_ms(250);
|
81 |
|
82 | }
|
83 | }
|