Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Interrupts!


von MC (Gast)


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

von Falk B. (falk)


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

von Peter D. (peda)


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

von MC (Gast)


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.

von Johannes M. (johnny-m)


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.

von Falk B. (falk)


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

von MC (Gast)


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

von Peter D. (peda)


Lesenswert?

Empfang sperren:
1
REN = 0;

Peter

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.