Forum: Mikrocontroller und Digitale Elektronik ATmega32 nur UART Interrupt deaktivieren


von Umbrecht (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Probiere es mal mit RXCIE.

MfG Spess

von Umbrecht (Gast)


Lesenswert?

hi,

bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1 
wird der Interrupt ausgelöst.

mfg
Umbrecht

von VIA (Gast)


Lesenswert?

Umbrecht schrieb:
> bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1
> wird der Interrupt ausgelöst.


Genau das wolltest du doch erreichen, oder?

siehe:


Umbrecht schrieb:
> ist es möglich nur die UART interrupts zu deaktivieren und nach gewisser
> Zeit wieder zu aktivieren?

von Umbrecht (Gast)


Lesenswert?

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

von Ingo L. (corrtexx)


Lesenswert?

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.

von C.K. (Gast)


Lesenswert?

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.

von Ingo L. (corrtexx)


Lesenswert?

C.K. schrieb:
> 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.
Oder kurz das RXEN bit togglen...

von Peter D. (peda)


Lesenswert?

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.

von Ingo L. (corrtexx)


Lesenswert?

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...

: Bearbeitet durch User
von Umbrecht (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.