Forum: Mikrocontroller und Digitale Elektronik senden des UART unterbrechen


von marten (Gast)


Lesenswert?

Hallo,

angenommen der uC (8051) ist gerade dabei eine massage über die serielle 
schnittstelle zu senden...
Darf ein externer interrupt in dann unterbrechen und er sendet dann ganz 
normal wieder weiter.
Ich ändere in der isr nur ein flag das nichts mit dem uart bzw. der 
baudrate zu tun hat.

  for( uc_i=0; uc_i<=27 ; uc_i++){
       SBUF=uc_massage[uc_i];
       while( TI == 0);
       TI_bit = 0;
       }

Darf unterbrochen werden wenn er hier drin steckt?

von Daniel V. (danvet)


Lesenswert?

Sobald du
SBUF = uc_message[uc_i];
ausgeführt hast, wird die Hardware der UART loslegen und die Bits 
versenden. Ein Interrupt wird diesen Vorgang nicht unterbrechen.

Der Programmablauf an sich wird natürlich unterbrochen. D.h. wenn deine 
Interruptroutine zu lange dauert, werden die Pausenzeiten zwischen dem 
Versenden der einzelnen DatenBytes entsprechend verlängert.

Deswegen sollte man die INterruptroutinen so kurz wie möglich halten. 
Also z.B. keine Displays ansteuern oder Delays verwenden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

marten schrieb:
> Darf unterbrochen werden wenn er hier drin steckt?
Das musst du wissen. Du musst abklären, ob deine Anwendung ab und zu ein 
kurzes "Ruckeln" in der Übertragung verträgt...
Normalerweise lautet die Antwort darauf: Ja.

von Georg (Gast)


Lesenswert?

marten schrieb:
> Darf unterbrochen werden wenn er hier drin steckt?

1. Ein UART sendet ein ganzes Zeichen unabhängig vom Prozessor, i.a. 
steht das nächste auch schon im Senderegister bereit, es ist also fast 2 
Zeichen lang Zeit, bevor ein weiteres Zeichen ins UART geschrieben 
werden sollte.

2. Reicht das nicht, entsteht eine Pause zwischen Zeichen, aber das ist 
bei asynchroner Übertragung ja zulässig. Ein Problem entsteht erst, wenn 
die Gegenseite wegen Timeout abschaltet, aber dazu muss die Pause länger 
als einige Zeichenlängen sein, i.a. weit mehr als 1 ms.

3. ISRs müssen schnell abgearbeitet werden, i.a. unter 1 ms.

Fazit: es kann nichts passieren, wenn nicht die ISR viele ms zur 
Ausführung braucht, das ist aber sowieso immer ein Programmierfehler.

Georg

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.