Forum: Mikrocontroller und Digitale Elektronik Interrupt der seriellen schnittstelle


von Anfänger (Gast)


Lesenswert?

Hallo,

frage zum Interuppt der seriellen Schnittstelle beim 8051.
Ich will gerne ein Array über sie serielle Schnittstelle versenden.

Das erste Versenden starte ich in main nach der initialisierung.
Ich habe das beispiel so aus dem Keil C51 Baldischweiler seite 202 
kapitel 10.

Ich verstehe nicht ganz wann er genau in den Interrupt der seriellen 
Schnittstelle springt.

void main ()
{

initialisierung....

//First send
ACC = uc_massage[uc_offset];   // Determine parity bit
TB8_bit = P_bit;               // Copy parity bit in TB8
SBUF = uc_massage[uc_offset];  // Begin to send
uc_offset++;

while(1);

}


void Serial_ISR () org 0x0023 ilevel 0{

  TI_bit = 0;                             // Reset TI-flag
  if( uc_massage[uc_offset] != 0 ){
      ACC = uc_massage[uc_offset];        // Determine parity bit
      TB8_bit = P_bit;                    // Copy parity bit in TB8
      SBUF = uc_massage[uc_offset];       // Begin to send
      uc_offset++;                        // Increment index of the 
array
  }
}



Angenommen uc_massage hat zwanzig zeichen. Nach dem ersten SBUF befehl 
in main ist doch der sendevorgang gestartet.
wird uc_offset++ in main noch durchgeführt?
Bleibt er solange in der ISR bis alle zwanzig zeichen gesendet sind?
Bei mir habe ich dann keine endlosschleife sondern weitere befehle die 
aber erst weiter abgearbeitet werden sollen wenn alle zweichen gesendet 
sind.

von Anfänger (Gast)


Lesenswert?

Ansonsten so...,

void Send_massage() {

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

 aber ich würde gerne den Interrupt verwenden.

von Jim M. (turboj)


Lesenswert?

Anfänger schrieb:
> Ich verstehe nicht ganz wann er genau in den Interrupt der seriellen
> Schnittstelle springt.

Genau dann wenn er mit dem Senden eines Bytes fertig ist: Das Stop Bit 
ist raus. Dann wird nämlich TI gesetzt.

von Dampfnilp (Gast)


Lesenswert?

Wir wissen jetzt grad nicht um welche Baudrate wir reden. Bei 9600 Baud 
kommt ein byte pro Millisekunde. Dh alle Millisekunde ist der UART 
Buffer leer und muss nachgefuellt werden. Zwischendurch hat ein 
Controller bei 1MHz jeweils 1000 Befehle fuer Anderes.

Bei den Mir bekannten controllern kommt der Transmitter Empty uebrigens 
wenn das letzte Bit des Bytes drauusen ist. Das Stopbit kommt nachher 
noch. Ist aber hier egal.

von Anfänger (Gast)


Lesenswert?

Okay, danke.
Also wird der uc_offsett++ noch locker ausgeführt.

Danke

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.