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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.