USART1 ISR mit Atmega162

Gast #349080
Lesenswert?
• ▲
▼
Hi Leute, ich wollte in meinem Programm warten, bis ein Zeichen an
USART1 empfangen wird und darauf reagieren. Hab es ausprobiert, bis
jetzt aber ohne Erfolgt.
Also zum Anfang erlaube ich interrupts
sei();
Und meine ISR sieht folgendermaßen aus:
ISR(USART1_RXC_vect) // USART1, Rx Complete verctor: 21
{
 printf("USART1 ISR ok\t");
}

Das was ich vom PC aus an USART1 sende, kommt auch am µC an. Jedoch
wird  die ISR nicht ausgeführt. Muss man sonst was beachten? Ich wollte
eigentlich beim Empfang eines Zeichens in die ISR springen und da
weiteren Zeichen einlesen.
Gast #349081
Lesenswert?
• ▲
▼
>printf("USART1 ISR ok\t");
<Sarkasmus>
Sowas gehört auch unbedingt in eine ISR...
</Sarkasmus>

Hast du die Interrupt-Freigabe-Flags (RXCIE und TXIE) und die
UART-Freigabe-Flags (RXC und TXC) freigegeben?
Wirf mal ein Blick ins Datenblatt. Da sind Besipiele für den
Poll-Betrieb angegeben.
Und sonst würde auch ein grösseres Stück deines Codes etwas bringen.
Gast #349082
Lesenswert?
• ▲
▼
Ja hmm, das sollte auch ein Test sein, ob die ISR funktioniert.
Die Datenkommunikation zwischen dem PC und dem µC ist auch i.O., also
was USART1 Initialisierung angeht. Nur der Einsprung in die ISR geht
nicht.
Aus dem Datenblat werde ich auch nicht schlauer, weil da nur ein
Beispiel zu, externen IR in assembler vorhanden ist.
Gast #349084
Lesenswert?
• ▲
▼
void usart1_init(void)
{
  unsigned int a= 103;
  UBRR1H = a<<8;
  UBRR1L = a;
  UCSR1A = 0x00;
  UCSR1B = (1<<RXEN1) | (1<<TXEN1);
  UCSR1C = (1<<UCSZ11) | (1<<UCSZ10) | (1<<URSEL1);
}

Hier :)
Und wie gesagt, ich kann über usart1 Daten senden/empfangen.
Gast #349085
Lesenswert?
• ▲
▼
>UCSR1B = (1<<RXEN1) | (1<<TXEN1);

Muss noch erweitert werden:
UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE); // für
Empfangsinterrupt

Wirf mal einen Blick auf die USART-Register auf Seite 185ff.
Gast #349087
Lesenswert?
• ▲
▼
Ich check das irgendwie nciht. Hab jetzt so initialisiert:
void usart1_init(void)
{

  unsigned int a= 103;
  UBRR1H = a<<8;
  UBRR1L = a;
  UCSR1A = (1 << RXC1);
  UCSR1B = (1<<RXEN1) | (1<<TXEN1)   | (1<<RXCIE1);
  UCSR1C = (1<<UCSZ11) | (1<<UCSZ10) | (1<<URSEL1);
 }

Als Test, will ich im Hauptprogramm eine LED leuchten lassen (die FKT
funzt)

  sei();
  char a;
  unsigned char dummy;
  ISR (USART1_RXC_vect)
  {
    cli();
    eia485_led_on();
                while (UCSR1A & (1<<RXC1) ) dummy = UDR1;
  }

Und das klappt immer noch nicht :(
Hab jetzt  while (UCSR1A & (1<<RXC1) ) dummy = UDR1; reingetan, wegen
der Beschreibung aus dem Datenblatt.


When the Receive Complete Interrupt Enable (RXCIE) in UCSRB is set, the
USART Receive Complete Interrupt will be executed as long as the RXC
Flag is set (provided that global interrupts are enabled). When
interrupt-driven data reception is used, the receive complete routine
must read the received data from UDR in order to clear the RXC Flag,
otherwise a new interrupt will occur once the interrupt routine
terminates.
#349092
Lesenswert?
• ▲
▼
Lesbarer wäre auch so was:

#define Crystal     16000000
#define BAUD        9600
#define UBRR        Crystal/(16*BAUD)-1

...

Damit rechnet der Preprozessor und nicht Du (nicht so fehleranfällig).
Ein Wert von '103' mitten im Quellcode und dann noch als 'a'
deklariert ist unschön. Außerdem läßt sich das Programm so schnell an
einen neuen Quarz anpassen.

Grüße, Freakazoid
Gast #349093
Lesenswert?
• ▲
▼
#define UBRR        Crystal/(16_L_*BAUD)-1

UBRR1H = (unsigned char) (UBRR>>8);
UBRR1L = (unsigned char) UBRR;

Um es ganz korrekt zu machen...
Ist aber auch im Datenblatt beschrieben...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.