www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Interrupts!


Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Empfang sperren:

REN = 0;


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.