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