Forum: FPGA, VHDL & Co. Mico32 Timer ISR


von Peter (Gast)


Lesenswert?

Hallo,
ich verwende einen Lattice ECP2 und möchte einen Timer im Mico32 
verwenden, der mir alle 10msec ein Flag setzt, welches ich im 
Hauptprogramm abfrage.

Im MSB habe ich einen Timer mit dem Namen "timer" hinzugefügt 
(Standardeinstellungen habe ich beibehalten) und mit dem WishboneBus 
verdrahtet.

Im C File habe ich folgendes:
1
// globale Defintion:
2
const char *SYSTEM_TIMER = "timer";
3
unsigned short flag_10msec;
4
// im main (void):
5
MicoTimerCtx_t *timer = (MicoTimerCtx_t *)MicoGetDevice(SYSTEM_TIMER);
6
7
  MicoTimerStart(timer,
8
            TimerISR,                
9
(void *)&flag_10msec,            
10
MILLISECONDS_TO_TICKS(10), 
11
  1);

Die ISR für diesen Timer sieht so aus:
1
void TimerISR(void *ctx)   
2
{
3
  flag_10msec = 1; 
4
  return;
5
}

und im main:
1
while (1)
2
{
3
  if (flag_10msec == 1)
4
  {
5
    flag_10msec = 0;
6
    // code durchfuehren
7
  }
8
9
}

Allerdings wird der Interrupt nicht ausgelöst.
Wenn jemand eine Idee hat warum, bitte posten.

Vielen Dank
Peter

von Ralf (Gast)


Lesenswert?

Bist du dir sicher, dass der Interrupt icht
ausgelöst wird?

Vielleicht musst du auch
1
volatile unsigned short flag_10msec;

im Sourcecode schreiben.

Gruß

Ralf

von Peter (Gast)


Lesenswert?

Hallo,
ja, ich bin mir sicher dass der Interrupt nicht ausgelöst wird, ich 
toggle im main einen Pin alle 10msec und genau das wird nicht 
durchgeführt.
Am Pin selbst kann es nicht liegen, wenn ich den Pin ausserhalb der if 
Anweisung behandle wird das gemacht was ich erwarte.

Ralf schrieb:
> volatile unsigned short flag_10msec;

das werde ich ausprobieren, danke!

Peter

von Duke Scarring (Gast)


Lesenswert?

Vielleicht mußt Du die Interrupts auch noch global aktivieren.

Duke

von Peter (Gast)


Lesenswert?

Hallo,

Duke Scarring schrieb:
> Vielleicht mußt Du die Interrupts auch noch global aktivieren.

Kannst du mir sagen wie und wo man die Interrupts aktivieren muss?

Vielen Dank
Peter

von Peter (Gast)


Lesenswert?

Hallo,

Ralf schrieb:
> Vielleicht musst du auch
>
>
>
> volatile unsigned short flag_10msec;
>
>
> im Sourcecode schreiben.


Jetzt funktioniert es! Vielen Dank!

Was mich nur wundert, ich habe ein Beispiel für die Timer ISR gefunden, 
in der das Sperrflag nicht als volatile deklariert wurde.
Komisch, aber egal, Hauptsache es funktioniert.

Vielen Dank
Peter

von Ralf (Gast)


Lesenswert?

Hab ich mir gedacht. Hatte mal ein
ähnliches Problem bei einem Atmel ATtiny.
Der Compiler hatte die Variable weg optimiert.

Gruß

Ralf

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.