C167 - ASC0 Interrupts

Gast #681690
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
Gast #681986
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
Gast #689988
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
Gast #909432
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

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