Hilfe bei Interrupts!

Gast #773736
Lesenswert?

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
#773748
Lesenswert?

@ 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
#773752
Lesenswert?

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
Gast #773762
Lesenswert?

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.
#773767
Lesenswert?

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.
#773768
Lesenswert?

@ 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
Gast #773788
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren