www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik C167 - ASC0 Interrupts

Autor: Nobbie (Gast)
Datum: 21.10.2007 17:09

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: 21.10.2007 22:10

Hallo Nobbie,

Du hast keine interrupt level eingestellt.

Also register S0RIC richtig setzten.

Grüße Mark,
Autor: T.Stütz (Gast)
Datum: 22.10.2007 01:04

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: 22.10.2007 08:55

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: 30.10.2007 17:36

he Nobbie !

mich würde deine Lösung interessieren!
bei mir funzt das mit den interrupts nicht!
Autor: Nobbie (Gast)
Datum: 31.10.2007 16:52

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: 27.06.2008 17:50

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net