www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zahl >1Byte über USART-Interrupt auswerten


Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich sende aus meiner SW ein High- und LowByte und empfange es mit meinem 
ATmega32 via USART-Interrupt. Allerdings funktioniert das nicht mit 
Zahlen >1 Byte.
Wie stelle ich es an um Werte bis 512 auszuwerten?
Vielen Dank!

RESET_START:

LDI temp, LOW(RAMEND)
OUT SPL, temp
LDI temp, HIGH(RAMEND)
OUT SPH, temp

//outputs
LDI temp, 0xFF
OUT DDRA, temp
LDI temp, 0x0F
OUT DDRC, temp

// init Interrupts
LDI temp, (1<<ISC01) | (1<<ISC11)
OUT MCUCR, temp
LDI temp, (1<<INT0) | (1<<INT1)
OUT GICR, temp
//InitUSART
CLR temp
OUT UBRRH, temp
LDI temp, ((CLOCK/4000000)-1)
OUT UBRRL, temp

LDI temp, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS)
OUT UCSRC, temp
IN temp, UDR
CLR temp
OUT UCSRA, temp
SBI UCSRB, RXCIE
SBI UCSRB, RXEN
      SEI
loop:    RJMP  loop
//Interrupt
USART_RXC:
    in R4, HIGH(udr)
    in R5, LOW(udr)

    //rcall  binBCD

    OUT    PORTA, R3
    OUT    PORTC, R2

    RETI

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das UDR ein high-byte hat, ist mir neu. Falls du an das 8. Datenbit 
heran möchtest, geht der Weg über ein "UART Control and Status 
Register". Schau dazu am besten mal ins Datenblatt:

USART-->Register Description


Gruß Skriptkiddy

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
USART_RXC:
    in R4, HIGH(udr)
    in R5, LOW(udr)

    //rcall  binBCD

    OUT    PORTA, R3
    OUT    PORTC, R2

    RETI

Du musst schon warten, bis beide Bytes da sind!
Wenn 2 Bytes daherkommen, werden auch 2 Interrupts ausgelöst. Für jedes 
einer. Das heißt du zählst mit, der wievielte Interrupt es ist und bei 
jeweils jedem 2.ten sind beide Bytes da. Das jeweils andere musst du 
eben in der Zwischenzeit irgendwo zwischenspeichern.



    in R4, HIGH(udr)
    in R5, LOW(udr)

darüber schweigen wir mal lieber.

Autor: Andreas Vogt (tico)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BerndB schrieb:
> in R4, HIGH(udr)
>     in R5, LOW(udr)

Dein UDR ist nur 8 bit lang. Folglich ist obiges Unsinn. Zahlen, die 
länger als 8 bit sind, müssen in 8 bit große Stücke zerlegt und 
nacheinander empfangen und wieder zusammengesetzt werden.

Gruss
Andreas

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werde also die Interrupts mitzählen!
danke euch.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der ATMega32 kann auch 9 Datenbits auf einmal empfangen. Wenn der Sender 
das auch kann, lassen sich Werte von 0...511 auch in einem Rutsch 
übertragen.

MfG Spess

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.