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
hi, bei RXCIE = 0 wird zwar der Interrupt unterdrückt aber sobald RXCIE = 1 wird der Interrupt ausgelöst. 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...
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.