Mahlzeit,
vermutlich ein banales Problem, bei dem ich irgendwas übersehe.
Ich sende über einen FT232R Daten an den USART0 eines Mega644p. Immer
ein Byte dann eine Sekunde Pause. Beim Pollen werden die Daten gelesen
ohne Probleme.
Jetzt will ich auf Interrupt umstellen und stelle fest, der
USART0_RX_vect wird nicht ausgelöst, nachdem das Byte übertragen wurde.
Hier der Code im Mega:
1 | #include "main.h"
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include "Delay.h"
|
5 |
|
6 | #ifndef F_CPU
|
7 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
|
8 | #define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
|
9 | #endif
|
10 |
|
11 | #define BAUD 38400UL // Baudrate
|
12 | // #define BAUD 250000UL // Baudrate
|
13 |
|
14 | // Berechnungen
|
15 | #define UBRR_VAL ((F_CPU + BAUD * 8) / (BAUD * 16) - 1) // clever runden
|
16 | #define BAUD_REAL (F_CPU / (16 * (UBRR_VAL + 1))) // Reale Baudrate
|
17 | #define BAUD_ERROR ((BAUD_REAL * 1000) / BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
18 |
|
19 | #if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
|
20 | #error Systematischer Fehler der Baudrate $BAUD_ERROR gr�sser 1% und damit zu hoch!
|
21 | #endif
|
22 |
|
23 | int main(){
|
24 | init_uart0();
|
25 | init_uart1();
|
26 | init();
|
27 |
|
28 | DDRC = 0xFF;
|
29 | PORTC = 0x55;
|
30 |
|
31 | for(;;){
|
32 | }
|
33 | }
|
34 |
|
35 | int init(){
|
36 | sei();
|
37 | cli();
|
38 |
|
39 | return 0;
|
40 | }
|
41 |
|
42 | int init_uart0(){
|
43 | UCSR0B |= (1 << RXEN0);
|
44 | UCSR0B |= (1 << RXCIE0);
|
45 | UCSR0B |= (1 << TXEN0); // UART TX einschalten
|
46 |
|
47 | UCSR0C |= (1 << USBS0) | (3 << UCSZ00); // Asynchron 8N1
|
48 |
|
49 | UBRR0H = UBRR_VAL >> 8;
|
50 | UBRR0L = UBRR_VAL & 0xFF;
|
51 |
|
52 | return 0;
|
53 | }
|
54 |
|
55 | int init_uart1(){
|
56 | UCSR1B |= (1 << RXEN1);
|
57 | UCSR1B |= (1 << RXCIE1);
|
58 | UCSR1B |= (1 << TXEN1); // UART TX einschalten
|
59 |
|
60 | UCSR1C |= (1 << USBS1) | (3 << UCSZ10); // Asynchron 8N1
|
61 |
|
62 | UBRR1H = UBRR_VAL >> 8;
|
63 | UBRR1L = UBRR_VAL & 0xFF;
|
64 |
|
65 | return 0;
|
66 | }
|
67 |
|
68 | ISR(USART0_RX_vect){
|
69 | uint8_t b = UDR0;
|
70 | // while (!(UCSR0A & (1 << RXC0)));
|
71 | PORTC = 0x00;
|
72 | Delay_ms(1000);
|
73 | }
|
Baudrate ist 38400 auf beiden Seiten, Schnittstelle auf 8N1.
Fuses stehen auf
HFuse: D9
LFuse: FF
Quarz hängt einer mit 16MHz dran. Kompiliert mit avr-gcc unter
Debian/Lenny und geflashed mit avrdude, falls das relevant sein könnte.
Wie gesagt, ich gehe davon aus, es ist was ganz banales und ich bin nur
blind, aber ich sitze da jetzt seit 2 tagen und komm auf keinen grünen
Zweig, da mir Google und Co. auch nicht weiterhelfen können.
Kann mich mal jemand mit der Nase auf den Fehler stossen?