Forum: Mikrocontroller und Digitale Elektronik CAPCOM (Timer12) Interrupt wird nur einmal ausgeführt


von Kay F. (kayf)


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
}

von M. J. (manfred-64)


Lesenswert?

Hi,

nur so als Idee, da ich mich nur mit Assembler auskenne.

InteruptFlag zurücksetzen !?

von Kay F. (kayf)


Lesenswert?

1
void timerInterrupt(void) interrupt T12INT
2
{
3
  statusledSetRed();
4
 T12IR = 0; // INTERRUPT REQUEST ENABLED
5
  T12IE = 1; // INTERRUPT ENABLED
6
}

hab ich auch gedacht. Aber das klappt auch nicht.

von M. (Gast)


Lesenswert?

Fehlt da vielleicht ein statusledSetRedOff() irgendwo? Wenn die blinken 
soll, sollte sie auch ausgeschaltet werden.

von M. J. (manfred-64)


Lesenswert?

Hat das Ding vielleicht ne Globale Interruptsperre die noch zu betreuen 
ist.

von Peter D. (peda)


Lesenswert?

Kay F. schrieb:
> Rote LED blinkt nur einmal. (1x Interrupt)

Kay F. schrieb:
> statusledSetRed();

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


Peter

von Kay F. (kayf)


Lesenswert?

1
IEN=1; // enable interrupts (global)

sollte interrupts erlauben ja.


@Gast:
"Fehlt da vielleicht ein statusledSetRedOff() irgendwo"

Da die Grüne LED die Rote LED ausschaltet sollte das nicht nötig sein.

von TManiac (Gast)


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

von Kay F. (kayf)


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;}

von M. J. (manfred-64)


Lesenswert?

Kay F. schrieb:
> IEN=1; // enable interrupts (global)
>
> sollte interrupts erlauben ja.

ich meinte eigentlich ob das durch den Interrupt automatisch gesperrt 
wird.

von Kay F. (kayf)


Lesenswert?

Also IEN=1; nach dem Interrupt bewirkt auch keine Lösung. Wem es hilft, 
hier ist das Manual.
https://rapidshare.com/files/14163211/c164_um_v20.pdf

von Kay F. (kayf)


Lesenswert?

ACHTUNG!!!!!

Tests haben ergeben, dass der Code auf dem Simulator den Interrupt 
startet!!!! Und auf dem Microcontroller NICHT!!!


IDEENN???

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.