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
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.