Tag an alle,
ich benutze in meinem 8051-Derivat von ATMEL den Interrupt der seriellen
Schnittstelle. Das funktioniert auch soweit alles super.
Nun möchte ich aber via UART Daten senden u. empfangen, ohne dass der
Interrupt ausgelöst wird.
Dazu sperre ich in meinen Routinen den Interrupt des UARTs und löche am
Ende der Routinen die Interruptflags scon.0 u. scon.1, bevor ich den
Interrupt wieder aktiviere.
Für den Sende-Betrieb klappt das auch, aber nicht für den
Empfangsbetrieb!? Die Vorgehensweise sollte doch eigentlich richtig
sein, oder???
Vielen Dank schon mal im Voraus,
MC
@ MC (Gast)
>Nun möchte ich aber via UART Daten senden u. empfangen, ohne dass der>Interrupt ausgelöst wird.
Na dann lass die Interrupts doch einfach ausgeschaltet!
>Dazu sperre ich in meinen Routinen den Interrupt des UARTs und löche am>Ende der Routinen die Interruptflags scon.0 u. scon.1, bevor ich den>Interrupt wieder aktiviere.
Braucht man AFAIK nicht. Einfach die UART-Interrupts NICHT einschalten.
>Für den Sende-Betrieb klappt das auch, aber nicht für den>Empfangsbetrieb!? Die Vorgehensweise sollte doch eigentlich richtig>sein, oder???
Nöö, Polling fragt die Flags ab.
AVR-Tutorial: UART
Ist zwar AVR, aber das Prinzip ist gleich.
MFg
Falk
MC wrote:
> Tag an alle,> ich benutze in meinem 8051-Derivat von ATMEL den Interrupt der seriellen> Schnittstelle. Das funktioniert auch soweit alles super.> Nun möchte ich aber via UART Daten senden u. empfangen, ohne dass der> Interrupt ausgelöst wird.> Dazu sperre ich in meinen Routinen den Interrupt des UARTs und löche am> Ende der Routinen die Interruptflags scon.0 u. scon.1, bevor ich den> Interrupt wieder aktiviere.> Für den Sende-Betrieb klappt das auch, aber nicht für den> Empfangsbetrieb!? Die Vorgehensweise sollte doch eigentlich richtig> sein, oder???
Nein.
Wenn Du Flags löscht, ohne das Ereignis behandelt zu haben, geht Dir das
Ereignis durch die Lappen.
Wozu überhaupt in einem Programm zwischen Polling und Interrupt
umschalten?
Das ergibt doppelten Code und kann Umschaltprobleme machen, wenn man
nicht genau auf die Reihenfolge achtet.
Wenn Du kurzen Code hast, der nicht durch den seriellen Interrupt
unterbrochen werden darf, dann sperre einfach den Interrupt (ES = 0).
Und statt des Pollens gibst Du den Interrupt für 2 Zyklen frei, damit er
das Byte in den Puffer schreiben kann.
Peter
Danke schon mal für eure Antworten.
>Wenn Du Flags löscht, ohne das Ereignis behandelt zu haben, geht Dir das>Ereignis durch die Lappen.
Genau das ist mein Ziel. Ich möchte Daten über Powerline übertragen
(bitte nicht auf Powerline eingehen, ist nicht zu umgehen), aber mein
dämliches PL-Modem sperrt beim Senden den eigenen Empfangskanal nicht,
sodass der µC seine gesendeten Daten unmittelbar zurückbekommt. Die
möchte ich aber nicht von meiner ISR auslesen lassen, und versuche, die
irgendwie zu umgehen.
Ich hab lange nichts mehr mit 8051ern gemacht und bin deshalb ein wenig
raus, aber: Wenn die 8051er den Empfangspuffer genauso behandeln wie die
AVRs das tun, dann ist es gar nicht möglich, das Empfangsflag manuell zu
löschen. Bei den AVRs kann das entsprechende Flag nur gelöscht werden,
indem das Empfangsdatenregister eingelesen wird, und zwar so oft, bis
keine Daten mehr im Puffer sind.
@ MC (Gast)
>dämliches PL-Modem sperrt beim Senden den eigenen Empfangskanal nicht,>sodass der µC seine gesendeten Daten unmittelbar zurückbekommt. Die
Ja und? Das hat doch mit Interrupts wenig zu tun. Mach einen MUX vor
dein RX Pin am uC und schalte mit einem freien IO-Pin während des
Sendens den Eingang auf HIGH. Geht auch Low Cost mit zwei Dioden und dem
Pull-Down, wired OR.
MFG
Falk
Danke für eure Antworten.
>AVRs das tun, dann ist es gar nicht möglich, das Empfangsflag manuell zu>löschen. Bei den AVRs kann das entsprechende Flag nur gelöscht werden,>indem das Empfangsdatenregister eingelesen wird, und zwar so oft, bis>keine Daten mehr im Puffer sind.
Möchte jetzt nichts falsches sagen, aber bei den 8051 sollte das über
das Löschen des Flags gehen (außer bei mir natürlich)
Dein Post hat mich aber auf die Idee gebracht, den Empfangskanal
komplett zu sperren. Das funzt!!! Danke noch mal.
>Mach einen MUX vor dein RX Pin am uC und schalte mit einem freien IO-Pin >während
des Sendens den Eingang auf HIGH
Super Idee, falls sich die jetzige Lösung nicht bewährt, werde ich das
machen.
Danke noch mal für eure Hilfe,
MfG
MC