644p-USART und Interrupt

Gast #1653004
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren