Forum: Mikrocontroller und Digitale Elektronik C167 Interrupt programm


von Birgit Egger (Gast)


Lesenswert?

Hi,

ich habe folgendes Programm unten in meinem C167 eingespielt.
Leider funktioniert nur das blinken der LED (Port 2.0) aber nicht das 
einschalten der Led mit dem Taster in der Endlosschleife.

Geht das nicht oder hab ich da was falsch gemacht. Normalerweise müsste 
ja die Endlosschleife ausgeführt werden und wenn ein Interrupt 
daherkommt dann wird die Methode viIsrTmr3 ausgeführt.
Lieg ich da falsch bzw. was mach ich da falsch?

Vielen Dank!!
lg
Birgit

1
#include <reg167.h>                    /* include 80C167 header file          */
2
3
sbit P2_9 = P2^9;                      /* declare portpin to use              */
4
sbit DP2_9 = DP2^9;                    /* declare direction bit to use        */
5
sbit P2_10 = P2^10;                      /* declare portpin to use              */
6
sbit DP2_10 = DP2^10;                    /* declare direction bit to use        */
7
8
void Init(void) {
9
  /// ------------ Timer 3 Control Register ----------
10
  /// timer 3 works in timer mode
11
  /// prescaler factor is 512
12
  /// up/down control bit is reset
13
  /// external up/down control is disabled
14
  /// alternate output (toggle T3OUT) function is disabled
15
  T3CON = 0x0006;
16
  T3 = 0x5F00; // load timer 3 register
17
  /// enable timer 3 interrupt
18
  /// timer 3 interrupt priority level(ILVL) = 1
19
  /// timer 3 interrupt group level (GLVL) = 0
20
  T3IC = 0x0044;
21
  T3R = 1; // set timer 3 run bit
22
  // Initialize port 2
23
  DP2 = 0x0001;
24
  P2 = 0x0000;
25
  }
26
27
  void GT1_viIsrTmr3(void) interrupt T3INT = 0x23 {
28
  P2 = ~P2;
29
  }
30
31
void main (void)  {
32
33
  unsigned char neuerZustand = 0;
34
    unsigned char alterZustand = 0;
35
36
    DP2_9 = 1;                                 // DP 2_9 is an output for LED           
37
    DP2_10 = 0;                       // DP 2_10 is an input for the KEY 
38
39
  Init();
40
  IEN = 1; // GLOBALLY ENABLE INTERRUPTS
41
42
    while (1) {                          
43
    neuerZustand = !P2_10;            
44
    if(!alterZustand && neuerZustand) {      // Flanke des Tastendrucks erkennen
45
        P2_9 = !P2_9;                // LED an- oder ausmachen
46
      }
47
    alterZustand=neuerZustand;          // alten/aktuellen Zustand speichern
48
    }
49
}

von Birgit Egger (Gast)


Lesenswert?

mir würde es auch schon reichen, wenn jemand eine Aussage treffen 
könnte, ob das Programm funktioniert oder ob ich da was grundlegendes 
falsch gemacht habe.
Vielen Dank,
Birgit

von Jörg S. (joerg-s)


Lesenswert?

Ich würde erst mal schauen ob Taster und LED grundsätzlich funktionieren
1
if (P2_10) P2_9 = 1;
2
else       P2_9 = 0;

Damit solle bei gedrückter Taste die LED leuchten bzw. ausgehen, je 
nachdem wie sie angeschlossen ist.
Wenn das schon nicht geht, wird wohl irgendwas an der Hardware ein 
Problem sein. Wie ist denn der Taster angeschlossen, mit Pull-Up? Wie 
sieht die LED Schaltung aus, mit Transistor gegen Masse geschaltet?

Bei deinem Programm könnte evt. noch das Prellen ein Problem sein. 
möglicherweise funktioniert es deshalb nicht.

von Birgit Egger (Gast)


Lesenswert?

Vielen Dank mal für die Antwort,
was ich nicht versteh ist, es funktioniert das Einschalten der LED mit 
dem Taster (ohne Code für den Interrupt) und es funktioniert das 
Interrupt handling ohne den Code für das einschalten der LED mit dem 
Taster aber beides gemeinsam funktioniert nicht - das versteh ich nicht.

Ich hab beim Interrupt "interrupt T3INT = 0x23" hinzugefügt - das ist 
von mir - vielleicht liegt es an dem?

Oder was kann ich da sonst noch machen?

lg
Birgit

von TManiac (Gast)


Lesenswert?

Hallo Birgit,

ich glaube du hast ein paar Kleinigkeiten noch nicht so recht 
verstanden.
1
void GT1_viIsrTmr3(void) interrupt T3INT = 0x23 
2
{
3
  P2 = ~P2;
4
}
Das ist deine Interrupt-Routine. Mit dem "interrupt T3INT" gibst du an 
das dies die für den Timer 3 Overflow Interrupt ist. Das "=0x23" müsste 
doch einen Compiler-Fehler produzieren?
1
// Initialize port 2
2
  DP2 = 0x0001;
3
  P2 = 0x0000;
Damit hast du nur einen einzigen Ausgangs Pin am Port 2. Und zwar den am 
P2_0.

Die Zeilen
1
DP2_9 = 1;    // DP 2_9 is an output for LED           
2
DP2_10 = 0;  // DP 2_10 is an input for the KEY
sind recht sinnlos, da du danach in der Init() Funktion die zuvor 
aufgeführten Zeilen ausführst.

Ändere also deine Init()-Routine so ab das dort deine vollständige 
Initialisierung geschieht und schmeiße die anderen Zeile raus (immer 
logischen Code schreiben!!!). Zum Beispiel so:
1
// Initialize port 2
2
  DP2 = 0x0201;   // DP2_0 und DP2_9 sind ausgangspins, alle anderen sind eingang
3
  P2 = 0x0000;

Dein (vielleicht gewolltes) Programm sieht also so aus:
Der Controller invertiert im Hintergrund, gesteuert durch einen 
Interrupt, den gesamten Port 2. Das heißt das auf Grund deiner 
Port-Initialisierung zu beginn nur der Pin 0 des Ports 2 blinkt.

Wird dann der Taster an P2_10 gedrückt, wird der Zustand an P2_9 
invertiert. Wenn alles Gut geht, müsste also danach die LED entgegen der 
anderen Blinken.

Ich selber arbeite mit dem Tasking Compiler anstatt dem Keil, daher mag 
man mir verzeihen wenn ich mich an manchen Stellen geirrt habe.

Gruß,
TManiac

von Birgit Egger (Gast)


Lesenswert?

Vielen Dank für die hilfreichen Informationen,
1
void GT1_viIsrTmr3(void) interrupt T3INT = 0x23 
2
{
3
  P2 = ~P2;
4
}
5
6
Das ist deine Interrupt-Routine. Mit dem "interrupt T3INT" gibst du an 
7
das dies die für den Timer 3 Overflow Interrupt ist. Das "=0x23" müsste 
8
doch einen Compiler-Fehler produzieren?

wenn ich das = 0x23 weglasse dann bekomm ich einen Fehler, deshalb hab 
ich das dazugeschrieben - das hab ich auch nicht verstanden, was der 
Compiler da nicht mag.
Ich werd das heute Abend mal ausprobieren.
lg und vielen Dank,
Birgit

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.