ATmega32 nur UART Interrupt deaktivieren

Gast #5006708
Hi,

ist es möglich nur die UART interrupts zu deaktivieren und nach gewisser 
Zeit wieder zu aktivieren?
Habe den Befehl UCSRB &= ~(1<<RXEN); mal getestet, allerdings wird hier 
der komplette UART ausgeschaltet.. Bzw. der RX channel.
Habe auch alle anderen BITs vom UCSRB getestet, auf Seite 161 im 
Datasheet zu finden.

Warum? - Weil ich in der Main schleife ein Zeichen empfangen will, im 
Hintergrund ein Timer laufen soll, aber nicht in die UART ISR gesprungen 
werden soll.

Danke im voraus.

mfg
Umbrecht
Gast
Hi,

in der Zeit, in der die Interrupts deaktiviert sind, sollen auch keine 
Zeichen gespeichert werden, die dann danach einen Interrupt auslösen.

mfg
Umbrecht
Umbrecht schrieb:
> bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1
> wird der Interrupt ausgelöst.
Du musst vorher einfach den Reciever deaktivieren, dann wird alles 
vorherige verworfen:
If the Receiver is disabled, the receive buffer will be flushed and 
consequently
the RXCn bit will become zero. The RXCn Flag can be used to generate a 
Receive Complete interrupt (see
description of the RXCIEn bit).
Zitat aus nem Megaxx8 DB.
Gast
Umbrecht schrieb:
> hi,
>
> bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1
> wird der Interrupt ausgelöst.
>
> mfg
> Umbrecht

Dass ist richtig, da must du vorher das UDR auslesen, damit der 
Interrupt gelöscht wird. Dann kannst du RXCIE auf 1 setzen. Ohne das du 
sofort in die ISR springst.
Umbrecht schrieb:
> bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1
> wird der Interrupt ausgelöst.

Du wolltest doch empfangen.
Mit RXEN = 1 werden bis zu 3 Bytes gepuffert.
Wenn Du die Bytes verwerfen willst, ist RXEN = 0 schon richtig gewesen.
Du mußt Dich mal entscheiden, empfangen oder verwerfen.
Peter D. schrieb:
> Mit RXEN = 1 werden bis zu 3 Bytes gepuffert.
Das wusste ich auch nicht, aber wenn man genauer liest findet man es:
Bit 3 – DOR: Data OverRun
This bit is set if a Data OverRun condition is detected. A Data OverRun 
occurs when the receive buffer is
full (two characters), it is a new character waiting in the Receive 
Shift Register, and a new start bit is
detected. This bit is valid until the receive buffer (UDR) is read. 
Always set this bit to zero when writing to UCSRA.

Nur doof, dass man das erst merkt, wenn es zu spät ist bzw. das 4. Byte 
schon unterwegs ist. Besser wäre doch ein Flag zu setzen, wenn der 
Buffer voll ist und auch das Input-Shift-Register voll ist...
Gast
hi,

Peter D. schrieb:
> Du mußt Dich mal entscheiden, empfangen oder verwerfen.

beides..

Es sollen Zeichen empfangen werden, aber kein Interrupt ausgelöst 
werden.


Allerdings habe ich bereits eine Lösung gefunden, nach dem Prinzip von 
C.K. und Ingo Less - vielen dank euch

mfg
Umbrecht
Wenn man sauber alle Bytes vor dem Interruptenable wegschmeißen will, 
geht das so:
1
  UDR; UDR; UDR;
2
  UCSRB |= 1<<RXCIE;
Das RXEN = 0 birgt nämlich die Gefahr, das die Synchronisation verloren 
geht, wenn man mitten in einem Byte enabled.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.