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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
|
Anzeige
|
ATMEGA169 Timer1 Overflow Interrupt richtig deklarierenSorry für die banale Frage, aber ist dass so richtig wenn ich Timer1 mit Prescaler 8 für den OVERFLOW Interrupt deklarieren möchte?
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? 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 ? 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.
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 ? 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; 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 ;) 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ß 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.
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
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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|