mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART1 ISR mit Atmega162


Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal die Initialisierung!

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE);

Muß natürlich

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

oder so ähnlich heissen.

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh ok,. habs jetzt hinbekommen!
Vielen Dank für deine Hilfe @ WM-Rahul.
War ein Fehler ganz wo anders (DAO-Fehler).

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

> unsigned int a= 103;
> UBRR1H = a<<8;
> UBRR1L = a;
soll wohl so nicht sein, oder?

Grüße, Freakazoid

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und warum nicht?
Beim 16 MHz Quarz und 9600 Baud ist es richtig. Funktioniert ja auch.

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, es sollte
> UBRR1H = a>>8;
heissen...

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der inoffizielle WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Der inoffizielle WM-Rahul:

Hatte das DB gerade nicht hier, aber dafür war ich schon nah dran. 103
ist jedenfalls ungut.

Grüße, Freakazoid

Autor: xp3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab aber 103 nach der Formel da oben berechnet. Und Baud wird von mir
sicherlich nicht geändert oO

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie geasgt, UBRR ist auch vom Quarz abhängig.
Letztlich ist es jedem selbst überlassen was er
schon vorher ausrechnet, allerdings ist so ein Code
eine ungünstige Bedingung für das Debugging - und
das wurde ja hier gefordert.

Grüße, Freakazoid

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.