Forum: Mikrocontroller und Digitale Elektronik C167 - ASC0 Interrupts


von Nobbie (Gast)


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???
1
unsigned int counter = 0;
2
sbit sb_Dir_TX = DP3^10;
3
sbit sb_Pin_TX = P3^10;
4
sbit sb_Dir_RX = DP3^11;
5
6
7
void init_RS232(void)
8
{
9
10
  sb_Dir_TX = 1;
11
  sb_Pin_TX = 1;
12
  sb_Dir_RX = 0;
13
  S0BG  = 0x0020;      // 38400Baud
14
15
  S0TIC = 0x0080;
16
  S0RIC = 0x0000;
17
  S0CON = 0x8011;
18
  S0REN = 1;        // receiver enable    
19
  S0TIE = 1;        // enable transmit interrupt
20
  S0RIE = 1;        // enable receive interrupt
21
22
} 
23
24
void send_RS232(void)
25
{
26
  S0TBUF = 'a';
27
  P2 ^= 0x000f;
28
  while(!S0TIR);
29
  S0TIR = 0;
30
  S0TBUF = 'c';
31
}
32
33
void rs232_SendInterrupt(void) interrupt 0x2A
34
{
35
  counter++;
36
  P2 ^= 0x000f;
37
  if (counter <= 12)
38
  {
39
    while(!S0TIR);
40
    S0TIR = 0;
41
    S0TBUF = 'c';
42
    
43
  }  
44
}
45
46
47
void rs232_ReceiveInterrupt(void) interrupt 0x2B
48
{
49
  P2 ^= 0x000f;
50
  //S0RBUF
51
}
52
53
void main(void)
54
{
55
    IEN     = 0;            // global interrupt disable
56
57
  
58
    DP3 |= 0xFFFF;
59
    ODP3 = 0x0000;
60
61
    IEN     = 1;            // global interrupt enable
62
    init_RS232();
63
    send_RS232();
64
 
65
    while(1);
66
}

Danke Nobbie

von Mark de Jong (Gast)


Lesenswert?

Hallo Nobbie,

Du hast keine interrupt level eingestellt.

Also register S0RIC richtig setzten.

Grüße Mark,

von T.Stütz (Gast)


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

von Nobbie (Gast)


Lesenswert?

Hallo,

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

danke Nobbie

von helmi (Gast)


Lesenswert?

he Nobbie !

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

von Nobbie (Gast)


Lesenswert?

hallo helmi

anbei der code
1
unsigned char init_RS232(void)
2
{  
3
  sb_Dir_TX = 1;
4
  sb_Pin_TX = 1;
5
  sb_Dir_RX = 0;
6
  S0BG    = 0x0020;      // 38400Baud @ 40MHz
7
  S0TIC   = 0x00C6;
8
  S0RIC   = 0x0047;
9
  S0CON   = 0x8011;
10
  S0REN   = 1;      // receiver enable    
11
  S0TIE   = 1;      // enable transmit interrupt
12
  S0RIE   = 1      // enable receive interrupt
13
14
  return F_OK;
15
} 
16
17
void rs232_SendInterrupt(void) interrupt 0x2A
18
{  
19
   getChar(&ucSendChar);
20
  S0TBUF = ucSendChar;
21
}
22
23
void rs232_ReceiveInterrupt(void) interrupt 0x2B
24
{
25
  
26
  ucDat = S0RBUF;
27
}

gruss

von J_uri (Gast)


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

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.