Interrupt, aber wie? (Infineon C509-L)

#3924925
Lesenswert?

Hallo, mein Code sieht folgendermassen aus:
1
#include <REG509.H>
2

3
void main (void)
4
{
5
 TMOD = 0x00;                  //Timer0-Konfiguration
6
 TH0 = 0xFF;
7
 TL0 = 0x0D;
8
 TCON = TCON | 0x10;
9
 while (1)                     
10
 {
11
  if (TF0)                    // Flag Abfrage
12
  {
13
   P5 = 0x01;                 // 1 an Port5 ausgeben
14
   TH0 = 0xFF;                // Timer0 High-Byte setzen
15
   TL0 = 0x0D;                // Timer0 Low-Byte setzen
16
   TF0 = 0;                   // Flag zurücksetzen
17
   P5 = 0x00;                 // 0 an Port5 ausgeben
18
  }
19
  [...]                       // Weiterer Programmverlauf
20
 }
21
}


es geht mir nur um den Teil mit der if-Abfrage von TF0.
TF0 ist eigentlich ein Interrupt-Flag das bei Überlauf des Timers 
(Timer0) gesetzt wird.
Meine Frage ist, wie kann ich diesen Teil als Interrupt-Unterprogramm 
programmieren so, dass die 5 Zeilen immer ausgeführt werden sobald der 
Timer überläuft?

Ich weiss dass ich dafür EAL = 1 setzen muss (Enable all interrupts) & 
dass ich ET0 = 1 setzen muss (Enable Timer0 interrupt). Aber wie muss 
ich den Programmkopf des Interrupt-Programms gestalten?

habe mal etwas gelesen von " void interrupt int_handler (void) " 
funktioniert bei mir aber nicht.
#3925136
Lesenswert?

habe folgende Error-Meldungen bekommen beim kompilieren:

dtex.c(8): error C141: syntax error near 'T0INT', expected 'const'
dtex.c(10): error C132: 'T0INT': not in formal parameter list
dtex.c(10): error C141: syntax error near 'if'
dtex.c(11): error C132: 'TF0': not in formal parameter list
dtex.c(11): error C141: syntax error near '{'
dtex.c(12): error C244: 'P5_0': can't initialize, bad type or class
dtex.c(12): error C132: 'P5_0': not in formal parameter list
dtex.c(13): error C244: 'TH0': can't initialize, bad type or class
dtex.c(13): error C132: 'TH0': not in formal parameter list
dtex.c(14): error C244: 'TL0': can't initialize, bad type or class
dtex.c(14): error C132: 'TL0': not in formal parameter list
dtex.c(15): error C244: 'TF0': can't initialize, bad type or class
dtex.c(15): error C132: 'TF0': not in formal parameter list
dtex.c(16): error C244: 'P5_0': can't initialize, bad type or class
dtex.c(16): error C132: 'P5_0': not in formal parameter list

für folgenden code über dem main:
1
#include <REG509.H>
2

3
sbit P5_0 = P5^0;
4
sbit P5_1 = P5^1;
5

6
void int_handler(void) interrupt T0INT
7
{
8
  if (TF0)
9
  {
10
    P5_0 = 1;
11
    TH0 = 0xFF;
12
    TL0 = 0x0E;
13
    TF0 = 0;
14
    P5_0 = 0;
15
  }
16
}
#3925201
Lesenswert?

Die Interruptvektoren sind nummeriert. Leider habe ich kein Datenblatt 
des 509 zur Hand. Beim 80515 wäre der Timer 0 die "1". Die Zeile wäre 
dann

void int_handler(void) interrupt 1

Falls du die Registerbank für den Interrupt Service selbst festlegen 
willst, wäre es dann (Beispiel: Bank 2)

void int_handler(void) interrupt 1 using 2
#3925204
Lesenswert?

Ich habe gerade auch auf der Keil Seite rumgestöbert und bin auf eine 
Lösung getroffen welche funktioniert. Sie sieht folgendermassen aus:
1
void timer0(void) interrupt 1 using 1
2
{
3
  P5_0 = 1;
4
  TH0 = 0xFF;
5
  TL0 = 0x0E;
6
  TF0 = 0;
7
  P5_0 = 0;
8
}

leider verstehe ich nicht genau was dort genau gemacht wird (interrupt 1 
using 1.

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