senden des UART unterbrechen

Gast #4000604
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?
#4000751
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.
Gast #4000783
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

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