www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C167 - ASC0 Interrupts


Autor: Nobbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will gerade eine RS232 Kommunikation mit dem C167 programmieren.
Dafür sind ja Pin3.10 und P3.11 vorgesehen.

Jetzt habe ich aber das Problem, dass die Interruptfunktionalität nicht 
funktioniert. Das manuelle Senden funktioniert.
Sicherlich habe ich wieder etwas bei der Initialisierung vergessen.

Anbei mal der Code. Habt ihr eine Idee, warum die ISR nicht ausgelöst 
wird???
unsigned int counter = 0;
sbit sb_Dir_TX = DP3^10;
sbit sb_Pin_TX = P3^10;
sbit sb_Dir_RX = DP3^11;


void init_RS232(void)
{

  sb_Dir_TX = 1;
  sb_Pin_TX = 1;
  sb_Dir_RX = 0;
  S0BG  = 0x0020;      // 38400Baud

  S0TIC = 0x0080;
  S0RIC = 0x0000;
  S0CON = 0x8011;
  S0REN = 1;        // receiver enable    
  S0TIE = 1;        // enable transmit interrupt
  S0RIE = 1;        // enable receive interrupt

} 

void send_RS232(void)
{
  S0TBUF = 'a';
  P2 ^= 0x000f;
  while(!S0TIR);
  S0TIR = 0;
  S0TBUF = 'c';
}

void rs232_SendInterrupt(void) interrupt 0x2A
{
  counter++;
  P2 ^= 0x000f;
  if (counter <= 12)
  {
    while(!S0TIR);
    S0TIR = 0;
    S0TBUF = 'c';
    
  }  
}


void rs232_ReceiveInterrupt(void) interrupt 0x2B
{
  P2 ^= 0x000f;
  //S0RBUF
}

void main(void)
{
    IEN     = 0;            // global interrupt disable

  
    DP3 |= 0xFFFF;
    ODP3 = 0x0000;

    IEN     = 1;            // global interrupt enable
    init_RS232();
    send_RS232();
 
    while(1);
}


Danke Nobbie

Autor: Mark de Jong (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Nobbie,

Du hast keine interrupt level eingestellt.

Also register S0RIC richtig setzten.

Grüße Mark,

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Sende-(Interrupt)routine passt auch nicht so richtig:

Zum Starten des Sendens reicht es aus dem S0TBUF einen Wert zuzuweisen

S0TBUF = 'a';

wenn das Interrupt-Enable-Bit korrekt gesetzt ist, wird
das nächste zu sendende Zeichen per Interrupt angefordert

Finger weg vom S0TIR !
Nimm mal aus der send_RS232
die While schleife und vor allem das setzen des S0TIR='0' raus
analog in der Interruptroutine !

in der Int.Routine reicht es dem S0TBUF einen neuen Wert zuzuweisen.

zu was wird P2 mit 0x000F verxordert ?

Gruss

Autor: Nobbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das mit dem receive Interrupt habe ich jetzt sauber hinbekommen.
Den Transmitinterrupt nehme ich mir jetzt noch einmal vor.

danke Nobbie

Autor: helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
he Nobbie !

mich würde deine Lösung interessieren!
bei mir funzt das mit den interrupts nicht!

Autor: Nobbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo helmi

anbei der code
unsigned char init_RS232(void)
{  
  sb_Dir_TX = 1;
  sb_Pin_TX = 1;
  sb_Dir_RX = 0;
  S0BG    = 0x0020;      // 38400Baud @ 40MHz
  S0TIC   = 0x00C6;
  S0RIC   = 0x0047;
  S0CON   = 0x8011;
  S0REN   = 1;      // receiver enable    
  S0TIE   = 1;      // enable transmit interrupt
  S0RIE   = 1      // enable receive interrupt

  return F_OK;
} 

void rs232_SendInterrupt(void) interrupt 0x2A
{  
   getChar(&ucSendChar);
  S0TBUF = ucSendChar;
}

void rs232_ReceiveInterrupt(void) interrupt 0x2B
{
  
  ucDat = S0RBUF;
}

gruss

Autor: J_uri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, kurze Frage:

Wie, bzw. wann genau wird der Interrupt 0x2a (=S0TINT) ausgelöst? Wenn 
ich das im Manual richtig verstehe, ist er gesetzt, bis das letzte Bit 
des Datenrahmens gesendet wurde. Demnach wird er doch aber auch nur dann 
gesetzt, wenn man eine Datenübertragung in Gang setzt.

Im obigen Quellcode von Nobbie wird diese aber erst durch das Auftreten 
des Interrupts in gestartet (nämlich mit dem Schreiben eines Wertes in 
S0TBUF).

Bitte korrigiert mich, wenn ich das falsch verstehe. Der obige Code soll 
ja so funktioniert haben.

MfG

J_uri

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.