ATMEGA169 Timer1 Overflow Interrupt richtig deklarieren

OP #3592590
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
}
OP #3592678
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
}
OP #3592741
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;
#3592763
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 ;)
OP #3592815
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ß
#3593191
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.
Gast #3593577
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 ;)

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