Hi,
nachdem sich nun das Problem mit den Interrupts gelöst hat, macht der
USART nun nicht das, was er soll.
ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider
kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen
an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der
korrekten Baudrate verschickt. Jetzt wird der geneigte Btrachter sagen,
dass die serielle Schnittstelle defekt wäre, ist sie aber nicht.
getestet. Vielleicht ist es wieder eine dieser kleinigkeiten, über die
ich immer stolpere. Den Code habe ich nochmal gepostet. Vielleicht hat
jemand ja Anregungen oder tips ?
1 | //uart0.c
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <avr/interrupt.h>
|
9 |
|
10 |
|
11 | #define myBRR0 51 // BAUDRATE 9600 bps
|
12 |
|
13 | volatile unsigned char i = 0;
|
14 | volatile unsigned char rxFlag = 0;
|
15 | unsigned char rxCh;
|
16 |
|
17 | void Uart0Init(void);
|
18 | void putc(unsigned char ch);
|
19 | void puts(unsigned char *str);
|
20 |
|
21 | void Timer0(unsigned char time);
|
22 |
|
23 |
|
24 | ISR( TIMER0_OVF_vect )
|
25 | {
|
26 |
|
27 | }
|
28 |
|
29 | ISR( USART_RX_vect )
|
30 | {
|
31 | rxCh = UDR0;
|
32 | putc(rxCh);
|
33 | }
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | void main(void)
|
40 | {
|
41 |
|
42 | //STATUS LEDs
|
43 | DDRC = (1<<5);
|
44 | DDRB = (1<<7);
|
45 |
|
46 | //POWER REDUCTION REGISTER
|
47 | PRR = (1<<7) | (1<<2) | (1<<0);
|
48 |
|
49 | Uart0Init();
|
50 |
|
51 |
|
52 | sei(); // Interrupts einschalten
|
53 |
|
54 |
|
55 | Timer0(0);
|
56 |
|
57 | for(;;)
|
58 | {
|
59 |
|
60 | while( !( TIFR0 & (1<<TOV0) ) )
|
61 | ;
|
62 |
|
63 |
|
64 | while( !( UCSR0A & (1<<UDRE0) ) )
|
65 | ;
|
66 | UDR0 = 'a';
|
67 |
|
68 | }
|
69 |
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | void Uart0Init(void)
|
77 | {
|
78 |
|
79 |
|
80 | UBRR0H = (unsigned char)(myBRR0 >> 8);
|
81 | UBRR0L = (unsigned char)myBRR0;
|
82 |
|
83 | UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
|
84 |
|
85 | UCSR0C = (3<<UCSZ00); // 8-Bit Charaktersize
|
86 |
|
87 |
|
88 | }
|
89 |
|
90 |
|
91 | void puts(unsigned char *str)
|
92 | {
|
93 | while(*str)
|
94 | {
|
95 | putc(*str);
|
96 | str++;
|
97 | }
|
98 | }
|
99 |
|
100 |
|
101 |
|
102 | void Timer0(unsigned char time)
|
103 | {
|
104 | //time = vielfaches von 0,128ms
|
105 | /* time Lookuptable der aktueller Konfiguration 19.03.07
|
106 | time 0.. - 255
|
107 | 00 = 0,00 ms
|
108 | 10 = 1,28 ms
|
109 | 20 = 2,56 ms
|
110 | 30 = 3,84 ms
|
111 | 40 = 5,12 ms
|
112 | 50 = 6,40 ms
|
113 | ...
|
114 | */
|
115 |
|
116 |
|
117 | TCNT0 = 128;
|
118 | TIMSK0 |= (1 << TOIE0); // Timer 0 Overflow Interrupt
|
119 | TCCR0B = (1<<CS01) | (1<<CS00); // Teiler 1024
|
120 |
|
121 |
|
122 | }
|
mfg,
Simon