Forum: Mikrocontroller und Digitale Elektronik 644p-USART und Interrupt


von M.B. (Gast)


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?

von Justus S. (jussa)


Lesenswert?

M.B. schrieb:
> cli();

Interrupts ausschalten ist keine gute Idee...

von spess53 (Gast)


Lesenswert?

Hi

>der USART0_RX_vect wird nicht ausgelöst, nachdem das Byte übertragen wurde.

Wie soll er auch:

>int init(){
>  sei();
>  cli();
>return 0;

MfG Spess

von M.B. (Gast)


Lesenswert?

Oh Mann ......
kann mir mal einer ne Bratpfanne überziehen? Ich  brauch dringend Urlaub 
.....

Danke für die Hilfe, ich komme mir verdammt blöd vor :(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.