CAPCOM (Timer12) Interrupt wird nur einmal ausgeführt

OP #2189160
Lesenswert?

Hi Leute.

Steh derzeit vor einem (scheinbar unlösbaren) Problem.

C164CI (16 Bit Mikrocontroller)
CAPCOM6 (Capture Compare Unit)

Ich will einen Interrupt auslösen, sobald mein Counter den T12Period 
Wert erreicht hat. Derzeit wird der Interrupt nur einmal aufgerufen. 
Dann nicht mehr! Hab schon wirklich alles ausprobiert.

Aktuelles Verhalten:
Grüne LED blinkt dauerhaft Ein - Aus.
Rote LED blinkt nur einmal. (1x Interrupt)

Würde mich über Ideen freuen!!
Dafür benutz ich folgenden Code.
1
#define T12INT       0x4D
2
#define T13INT       0x4E
3
#define CC6INT     0x3F     
4

5

6

7
//*****************************************************************************
8
int n,k; 
9
//*****************************************************************************
10
void main(void)
11
{
12
  IEN=0; // disable interrupt
13
  statusledInit();
14
  statusledSetOff();
15

16
  // init CAPCOM6
17
  // TIMER12
18
  T12IC = ( 1 << 2) | 0; // set level & group
19

20
  T12IR = 0; // INTERRUPT REQUEST ENABLED
21
  T12IE = 1; // INTERRUPT ENABLED
22

23
  T12P  = 1000;  // period register timer counts to 1000
24
  T12OF = 0; // offset
25
  CTCON = 0x0000; // Compare Timer Control Register (use cpu frequence)
26
  
27

28
  ECTP = 1; // enable timer 12 Period Interrupt
29
  CT12R = 1; // start counter
30
  IEN=1; // enable interrupts
31
    for (;;)
32
    {
33
    for(k=0;k<3;k++){for(n=0;n<65535;n++);}
34
         statusledSetGreen();
35
    for(k=0;k<3;k++){for(n=0;n<65535;n++);}
36
    statusledSetGreenOff();
37

38
    }
39

40

41
}
42

43

44

45
void timerInterrupt(void) interrupt T12INT
46
{
47
  statusledSetRed();
48
}
Gast #2189185
Lesenswert?

Interuptflag wird beim xC16x automatisch zurückgesetzt, wenn die ISR 
betreten wird.

Aber eine wesentlich einfacher Frage: Wo setzt du dein Rotes LED zurück?
Das Grüne wird in der main per statusledSetGreen() ein geschalten und 
per statusledSetGreenOff() wieder ausgeschalten.
Die Rote wird in der ISR per statusledSetRed() eingeschalten, aber 
nirgends aus geschalten!

Und wie sehen diese Set-Funktionen aus?

C164CI? Also eine C-Control II. Damit wurde ich auch angefixt :-)

Gruß,
TManiac
OP #2189187
Lesenswert?

"Dann zeig dochmal den Code dieser Funktion, die müßte ja togglen"

Naja in der For-Schleife wird ja diese LED wieder auf 0 gesetzt.

Aber hier der Code
1
sbit STATUS_RED_PORT =         P8^0;      // Declare portpin to use
2
sbit STATUS_RED_PORT_DIR =    DP8^0;      // Declare direction bit to use
3
sbit STATUS_GREEN_PORT =       P8^2;      // Declare portpin to use
4
sbit STATUS_GREEN_PORT_DIR =  DP8^2;      // Declare 
5
//************************************************************
6
#define statusledSetRed()    {STATUS_RED_PORT=0;   STATUS_GREEN_PORT=1; }
7
#define statusledSetGreen()    {STATUS_RED_PORT=1;   STATUS_GREEN_PORT=0; }
8
#define statusledSetGreenOff()  {STATUS_RED_PORT=1;   STATUS_GREEN_PORT=1; }
9
#define statusledSetRedOff()  {STATUS_RED_PORT=1;   STATUS_GREEN_PORT=1; }
10
#define statusledSetGreenO()  {STATUS_GREEN_PORT=0;}
11
#define statusledSetGreenOffO()  {STATUS_GREEN_PORT=1;}
12
#define statusledSetRedO()    {STATUS_RED_PORT=0;}
13
#define statusledSetRedOffO()  {STATUS_RED_PORT=1;}
14
#define statusledSetOrange()  {STATUS_RED_PORT=0; STATUS_GREEN_PORT=0;}
15
#define statusledSetOff()      {STATUS_RED_PORT=1; STATUS_GREEN_PORT=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