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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rainer Engelhardt (Gast)


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]
  • [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.