mikrocontroller.net

Forum: Compiler & IDEs Problem mit M64 Uart1 RXC-Interrupt


Autor: Rainer Engelhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich programmiere momentan an einem Mega64 und will eine
Interrupt-gesteuerte Empfängerroutine benutzten, hier die Routine für
uart0:

Initialisierung:
 UCSR0B  = 0x00;
 UBRR0L = 0x40;
 UCSR0B  = 0x98;
Interrupt service Routine:
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{ if (rec_num<127)
  { rec_field[rec_num]=UDR0;
    rec_num++;
  }
  if (rec_field[0]!=0x2a) rec_num=0;
}

Funktioniert alles bestens, nun das Problem: ich brauche eine 2.
serielle Schnittstelle und benutze selbige Routine (nur UDR1 statt UDR0
usw.), Ergebnis: die Routine empfängt das erste Zeichen korrekt,
scheint dann aber immer wieder neu angesprungen zu werden, ohne dass
neue Zeichen gesendet und damit empfangen würden -> der Zähler rec_num
ist in NullKommaNix auf 127 und im Buffer rec_field nur Müll.

Hat jemand eine Idee, was hier passiert? Ich habe mir angesehen, was
der C-Compiler (Imagecraft ICCAVR) daraus macht:

UDR1 wird via  LDS  R2,0x9C
und UDR0 via   IN   R2,0x0C

gelesen. Kann es sein, dass auch UDR1 über einen IN-Befehl gelesen
werden muss, damit das Zeichen aus dem Empfangs-Fifo der Uart gelöscht
wird? Imagecraft behauptet, dass auf Reg. 0x9c (UDR1) nur mit dem
LDS-Befehl zugegriffen werden darf, weil es im erweiterten Adressraum
(mega103 compatibility) liegt, allerdings ist uart1 ja nur dann
verfügbar, wenn der m64 nicht im m103c-Modus läuft - die entsprechende
Fuse ist daher auch gelöscht.

Vollkommen ratlos bin ich dankbar für jeden Tipp

Rainer

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.