Forum: Mikrocontroller und Digitale Elektronik Atmega16 UART-Interrupt löst nicht aus.


von Überfragter (Gast)


Lesenswert?

Hallo,

Das ist vielleicht das 1000te mal das so etwas hier gefragt wird.
Habe schon einiges durchgesehen, komme aber nicht drauf warum der 
Interrupt nicht auslößt.

int main(void)
{
  DDRD  = 0xFE;    //RXD auf Eingang
  sei();           //Global Interrupt Enable
  UBRRL = 0x18;    //25 für 9600Baud bei 4000000HZ
  UBRRH = 0x00;
  UCSRB = (1<<RXEN);   //Empfänger ein
  UCSRB = (1<<RXCIE);  //Interrupt-Enable-Bit Setzen
  while(1){out(Zeile);}
}

ISR(USART_RXC_vect)
{
  while(1);
}

Wenn er nun auslösen würde, müsste mein Programm doch anhalten?

von Steve (Gast)


Lesenswert?

liegt ein signal an / wird ein usart protokoll gesendet dass den 
interrupt auslösen kann ?

von Stefan E. (sternst)


Lesenswert?

Der Interrupt kann nicht auslösen, weil du den Receiver nach dem 
Einschalten gleich wieder ausschaltest.

: Bearbeitet durch User
von Überfragter (Gast)


Lesenswert?

@Steve
Ja es liegt ein eingangssignal an, und wenn ich den UART Polle dann 
kommt auch immer was richtiges raus.

@Stefan Ernst
Ich Schalte den UART gleich wieder ab?
Warum, wie mach ich das?

--> Es gibt keine Verändeung wenn ich
UCSRB = (1<<RXEN);   //Empfänger ein
UCSRB = (1<<RXCIE);  //Interrupt-Enable-Bit Setzen
vertausche.

von Stefan E. (sternst)


Lesenswert?

Überfragter schrieb:
> --> Es gibt keine Verändeung wenn ich
> UCSRB = (1<<RXEN);   //Empfänger ein
> UCSRB = (1<<RXCIE);  //Interrupt-Enable-Bit Setzen
> vertausche.

Natürlich nicht. Dann schaltest du den Receiver zwar nicht wieder aus, 
dafür disablest du dann den Interrupt gleich wieder.

X = 1;
X = 2;
Was ist nach diesen beiden Zeilen der Wert von X?

von Überfragter (Gast)


Lesenswert?

Ja!!

UCSRB |=(1 << RXCIE) | (1 << RXEN);  //Interrupt ein, Empfänger ein!

Jetzt Klapts, danke für den Tip.

So konnte es nicht gehen, da ich das Byte permanent mit dem Falschen 
wert überschrieben hatte.

Grüße
Überfragter

von H.Joachim S. (crazyhorse)


Lesenswert?

Überfragter schrieb:
> UCSRB = (1<<RXEN);   //Empfänger ein
>   UCSRB = (1<<RXCIE);  //Interrupt-Enable-Bit Setzen

Macht natürlich hier nicht so viel Sinn (vor allem wenn die Befehle 
direkt hintereinander liegen), aber wenn doch einzeln, dann so:

UCSRB = (1<<RXEN);   //Empfänger ein
UCSRB |= (1<<RXCIE);  //Interrupt-Enable-Bit Setzen

Sollte man immer so machen, wenn man einzelne Bits gezielt 
setzen/rücksetzen will, ohne den Rest zu verändern.

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.