Forum: Mikrocontroller und Digitale Elektronik ATMEGA169 Timer1 Overflow Interrupt richtig deklarieren


von Martin A. (airmartl)


Lesenswert?

Sorry für die banale Frage, aber ist dass so richtig wenn ich Timer1 mit 
Prescaler 8 für den OVERFLOW Interrupt deklarieren möchte?
1
int main(void)
2
{
3
TCNT1 = 0;    // set timer1 to 0
4
TCCR1B |= (1<<CS11);  // select prescaler of 8 and start the timer
5
TIFR1 = 0xFF;    // clear interrupt-flags Timer1
6
TIMSK1|= (1<<TOIE1);   // enable Timer1 overflow interrupt
7
while(1)                    
8
    {
9
    //Programm...
10
    }
11
    return (1);
12
13
}
14
ISR (TIMER1_OVF_vect)  
15
{
16
i++; //mach etwas
17
}

von Karl H. (kbuchegg)


Lesenswert?

Wenn du schon so fragst, dann existiert ein Problem, für das du keine 
Lösung hast.

Ich lehne mich mal aus dem Fenster.
Hast du i volatile gemacht?

von Holger L. (max5v)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Hast du denn die #include <avr/interrupt.h> eingebunden und die 
Interrupts mit sei(); freigegeben ?

von Martin A. (airmartl)


Lesenswert?

Hallo Holger, ok hier noch etwas ausführlicher, passt das so (siehe 
unten)?

Hallo Karl, heißt das wenn ich eine zuweisung in der ISR mache, müssen 
alle beteiligten Variablen Volatile sein? Wie ist wenn ich nur in der 
ISR z.B. PortB = 0x01; schreibe? Funktioniert das?

Vielen Dank.
1
volatile long i;
2
#include <avr/interrupt.h>
3
4
int main(void)
5
{
6
TCNT1 = 0;    // set timer1 to 0
7
TCCR1B |= (1<<CS11);  // select prescaler of 8 and start the timer
8
TIFR1 = 0xFF;    // clear interrupt-flags Timer1
9
TIMSK1|= (1<<TOIE1);   // enable Timer1 overflow interrupt
10
sei();
11
while(1)                    
12
    {
13
    //Programm...
14
    }
15
    return (1);
16
17
}
18
ISR (TIMER1_OVF_vect)  
19
{
20
i++; //mach etwas
21
}

von Holger L. (max5v)


Lesenswert?

Martin Airmartl schrieb:
> volatile long i;

"long" schluckt natürlich einiges an Speicher, ein anderer Datentyp wäre 
vermutlich besser.
Da der Timer an und für sich nur hochzählt ( nicht kleiner als Null 
wird) wäre außerdem ein unsigned geeignet.

Es scheint alles soweit zu passen, spricht denn irgendwas dagegen es 
auszuprobieren ?

von Martin A. (airmartl)


Lesenswert?

Holger L. schrieb:
> "long" schluckt natürlich einiges an Speicher, ein anderer Datentyp wäre
> vermutlich besser.
> Da der Timer an und für sich nur hochzählt ( nicht kleiner als Null
> wird) wäre außerdem ein unsigned geeignet.

Hallo Holger, das einzige was dageben spricht es auszuprobieren ist, 
dass ich erst um 17Uhr Feierabend habe :)

Mit unsigned meinst du einen unsigned integer oder? Der hat dann 32bit 
oder?

Hier die neue daklaration:
volatile unsigned int i;

von Holger L. (max5v)


Lesenswert?

Ja das war so gemeint.
Außer dem int gibt es noch den uint16_t ( 0 bis 65.535) und den uint8_t 
( 0 bis 255).
Es kommt ganz darauf an was du mit dem Timer anstellen möchtest.

Martin Airmartl schrieb:
> das einzige was dageben spricht es auszuprobieren ist,
> dass ich erst um 17Uhr Feierabend habe :)

Dafür hat der liebe Gott die Smd -Technik erfunden, solche Boards kann 
man unbemerkt in der Hosentasche mit auf die Arbeit nehmen ;)

von Martin A. (airmartl)


Lesenswert?

Holger L. schrieb:
> Dafür hat der liebe Gott die Smd -Technik erfunden, solche Boards kann
> man unbemerkt in der Hosentasche mit auf die Arbeit nehmen ;)

Achso, ja wenn das der Wille vom lieben Gott wahr, dann werd ich sie 
morgen gleich mal mitnehmen :)

Da ich den 16bit Timer voll ausnutzen will benötige ich auch eine 16bit 
Variable. "uint16_t" ist nur eine andere Schreibweise oder

"uint16_t" ist das gleiche wie "unsigned int" oder?

Gruß

von Holger L. (max5v)


Lesenswert?

Martin Airmartl schrieb:
> Holger L. schrieb:
>> Dafür hat der liebe Gott die Smd -Technik erfunden, solche Boards kann
>> man unbemerkt in der Hosentasche mit auf die Arbeit nehmen ;)
>
> Achso, ja wenn das der Wille vom lieben Gott wahr, dann werd ich sie
> morgen gleich mal mitnehmen :)

Aber laß dich nicht erwischen, manchmal schaut der Typ von ganz oben zu 
:)

Martin Airmartl schrieb:
> Da ich den 16bit Timer voll ausnutzen will benötige ich auch eine 16bit
> Variable.
Nicht zwingend.
Wenn du Sekunden, Minuten und Stunden zählen möchtest genügen 8 Bit 
Variablen.
1
//Pseudocode
2
volatile uint8_t sekunde++;
3
IF (sekunde == 60)
4
   volatile uint8_t minute++;
5
   IF (minute == 60) 
6
     volatile uint8_t Stunde++;

Die Zeitbasis für die Sekunde müßtest du natürlich aus der 
Timerinterruptzeit errechnen.

Martin Airmartl schrieb:
> "uint16_t" ist nur eine andere Schreibweise oder
> "uint16_t" ist das gleiche wie "unsigned int" oder?

Also uint16_t sollte ein 16 Bit großer unsigned Integer sein.
Aber um darüber etwas zu erzählen bin ich zu wenig Profi.

von chris (Gast)


Lesenswert?

bei Variablen größer als 8bit musst du beachten, dass auf diese im 
Hauptprogramm atomar zugegriffen werden muss, indem du den Interrupt 
sperrst vor dem Lesen / Schreiben. Ansonsten gibts irgendwann mal 
merkwürdige Fehler ;)

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.