Forum: Mikrocontroller und Digitale Elektronik ATmega1284P, USART1 und Rec_Interrupt


von Andreas H. (heilinger)


Lesenswert?

Hallo,

ich habe zwar schon ein paar USART-Schnittstellen auf nem AVR 
programmiert, jedoch funzt mein Receive-Interrupt diesmal nicht, also 
der Interrupt wird nicht aufgerufen.

Hier mal der relevante Code:
1
#define UBRR_19k2  129 //für Baudrate 19,231k
2
3
int main(void)
4
{
5
  [...]
6
  USART1_init(UBRR_19k2); //USART1 intialisieren
7
  PORTD &= ~(1<<PD7);
8
  sei();   
9
  [...]                                               
10
}
11
12
void USART1_init(unsigned int ubrr1)
13
{
14
  UBRR1H = (unsigned char) (ubrr1>>8); 
15
  UBRR1L = (unsigned char) ubrr1;
16
  
17
  UCSR1C = (1<<UCSZ11) | (1<<UCSZ10); //frame format: 8data, 1stop bit, asynchronous USART, No parity
18
  UCSR1B = (RXCIE1)    | (1<<TXEN1)  | (1<<RXEN1); //Enable receiver & transmitter and receiver interrupt
19
  UCSR1A = (1<<U2X1);                 //Double speed mode
20
}
21
22
23
ISR(USART1_RX_vect)
24
{
25
  static unsigned char uc_zaehler_RXD_Bytes = 0;
26
27
  PORTD |= (1<<PD7); 
28
29
  uc_Receive_RX1[uc_zaehler_RXD_Bytes] = UDR1;
30
31
  if (uc_Receive_RX1[uc_zaehler_RXD_Bytes] == 0x0D) //Ende der Übertragung
32
  {
33
    uc_zaehler_RXD_Bytes = 0;
34
    f120_Flag.O2_Sensorkommunikation_komplett = 1;
35
  }
36
  else
37
    uc_zaehler_RXD_Bytes++;
38
}

PD7 geht nicht auf high, weswegen ich annheme, dass der Interrupt nicht 
aufgerufen wird.
Ich benutze nen ATmega1284P mit 20MHz

von Andreas H. (heilinger)


Angehängte Dateien:

Lesenswert?

kleiner Nachtrag:

An PD2 liegt folgendes Signal an.
Es sind 9 Byte, die mit 19.2kHz gesendet werden.

von Andreas H. (heilinger)


Lesenswert?

okay, hab den Fehler gefunden.

Vielleicht sollte ich anstatt

UCSR1B = (RXCIE1)    | (1<<TXEN1)  | (1<<RXEN1);
lieber
UCSR1B = (1<<RXCIE1)    | (1<<TXEN1)  | (1<<RXEN1);

schreiben, sch*****

von Andreas H. (heilinger)


Lesenswert?

Ich habe trotzdem noch ein Frage:

Wenn ich den Receive-Interrupt aktiviere, dann ist es nur eine Frage der 
Zeit, bis mein uC abstürzt, was sich darin bemerkbar macht, dass die 
Peripherie rundherum ausfällt (Display, Tasten).

Wenn ich nun einen C=15pF an den PIN des RXD1 gegen Masse hänge, dann 
stürzt er nicht ab. Wieso ist das so?

Es liegt auf jeden Fall an der Aktivierung des Receive-Interrupts, denn 
wenn ich diesen nicht aktiviere, dann habe ich das Problem nicht, auch 
ohne Kondensator.

Dabei ist es egal, ob ein Signal an RXD anhängt oder nicht.

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.