Forum: Compiler & IDEs Timer Interrupt


von jkhgkj (Gast)


Lesenswert?

Hallo

ich wollte einen CRC Timer Interrupt programmieren. Damit ich aber nicht 
mehrere Interrupts brauche wollte ich nur einen programmieren wo ich 
dann in die jeweilige Funktion einen Zähler setze.

Irgendwie steh ich da jetzt auf der Leitung. Würdet ihr da eine globale 
Variable setzen oder kann man die vermeiden.

Würde ich die Funktion im ISR ausführen könnte ich einen Zähler 
programmieren. Da ich den Zähler aber im main brauche wollte ich fragen 
was für ein Zeichen ich im ISR setzen könnnte um im Main den Zähler 
hochzuzählen.

MfG

von Karl H. (kbuchegg)


Lesenswert?

jkhgkj schrieb:

> Irgendwie steh ich da jetzt auf der Leitung. Würdet ihr da eine globale
> Variable setzen oder kann man die vermeiden.

globale Variable. Anders geht es nicht.

volatile nicht vergessen.

von Ingo L. (Gast)


Lesenswert?

Hi,

main.c
1
volatile unsigned char count=0;
2
3
while(1)
4
{
5
 // count auswerten
6
}


main.h
1
extern volatile unsigned char count;



timer.c
1
#include "main.h"
2
3
ISR ("COMPARE_MATCH")
4
{
5
   count++;
6
}


Grüße,
Ingo

von hallooooo (Gast)


Lesenswert?

Danke

Im main.c ist ja schon eine Deklaration, brauche ich das dann noch 
einmal im main.h mit extern.

Mich verwirrt jetzt dass auf diese Weise nie b() ausgeführt wird wenn 
das eine globale Variable ist.
1
a()
2
{
3
if (count == 5)
4
count=0;
5
}
6
7
b()
8
{
9
if (count == 10)
10
count=0;
11
}
12
13
ISR ("COMPARE_MATCH")
14
{
15
   count++;
16
}

von Walter S. (avatar)


Lesenswert?

ich weiß ja nicht was du eigentlich willst,
aber du darfst z.B. auch 2 counter(-Variablen) verwenden

von hallooooo (Gast)


Lesenswert?

Das ist auch eine Möglichkeit an die ich nicht gedacht habe.

Ich war darauf fixiert dass das Interrupt ein Signal sendet und zb. bei 
einer for-Schleife bzw. bei einem Counter in den Funktionen immer um 
eins weiter gezählt wird.

Braucht man eigentlich
1
extern volatile unsigned char count;

genügt nicht nur
1
volatile unsigned char count;

von Ingo L. (Gast)


Lesenswert?

hallooooo schrieb:
> Mich verwirrt jetzt dass auf diese Weise nie b() ausgeführt wird wenn
> das eine globale Variable ist.

Wie denn auch? Du setzt ja count immer wieder auf 0 wenn sie 5 ist. Dann 
kann sie ja garnicht 10 werden.

Am Besten für sowas immer ein Interval auf 2^n Basis nehmen:
1
if(count%2)
2
{
3
  ...;
4
}
5
6
if(count%4)
7
{
8
  ...;
9
}
Dann brauchste count nicht löschen.

> Braucht man eigentlich
> extern volatile unsigned char count;
> genügt nicht nur
> volatile unsigned char count;

Ja, du musst deiner timer.c ja mitteilen, dass es diese variable gibt.
Guck ma ins GCCTutourial.


Grüße,
Ingo

von hallooooo (Gast)


Lesenswert?

>Ja, du musst deiner timer.c ja mitteilen, dass es diese variable gibt.
>Guck ma ins GCCTutourial.

Eine globale Variable ist ja wenn ich sie außerhalb von main deklariere. 
Somit müßte ja die Variable auch für alle anderen Dateien bekannt sein.

von Walter S. (avatar)


Lesenswert?

hallooooo schrieb:
> Eine globale Variable ist ja wenn ich sie außerhalb von main deklariere.
> Somit müßte ja die Variable auch für alle anderen Dateien bekannt sein.

der Compiler übersetzt die Quellen einzeln,
d.h. wenn du in einer eine Variable deklarierst, kennt er sie in der 
anderen deswegen noch lange nicht.

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.