Forum: Mikrocontroller und Digitale Elektronik Interrupt, aber wie? (Infineon C509-L)


von Klaus R. (hpw70)


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.

von Georg G. (df2au)


Lesenswert?

Wenn du noch verrätst, welchen Compiler du verwendest, wird das Problem 
lösbar.

von Klaus R. (hpw70)


Lesenswert?

Ich benutze Keil uVision v.4.72.9.0
Der genaue C-Compiler im uVision ist C51 v.9.52.0.0

von Kalli L. (knl)


Lesenswert?

Hallo,
versuche mal Folgendes:

void int_handler(void) interrupt T0INT

von Klaus R. (hpw70)


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
}

von Kalli L. (knl)


Lesenswert?

Du musst den Vektor noch definieren
1
#define T0INT   1  // Interruptvektoren

siehe auch

http://www.keil.com/support/man/docs/c51/c51_le_interruptfuncs.htm

von Georg G. (df2au)


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

von Klaus R. (hpw70)


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.

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.