Hallo Ich versuche den 8 bit timer des atmega 64 zum laufen zu bekommen, doch ich kann machen was ich möchte es klappt einfach nicht. ich habe eine extra initialisierungs funktion für den timer geschrieben. void timer0Init(void) { //initialisiert Interrupt bit im statusregister SREG |= 0x80; //timerinterrupt aktivieren TIMSK |= (1<<OCIE0); //CTC Mode Prescaler 256 TCCR0 |= (1<<WGM01) | (1<<CS01) | (1<<CS02); //vergleichswert OCR0 = 0xFF; } jedes mal wenn der timer überläuft soll über den uart etwas rausgeschrieben werden. (uart funktion funktioniert habe ich getestet) ISR(SIG_OUTPUT_COMPARE0) { usartPuts("test\r\n"); } die initialisierungs funktion wird aufgerufen. avr/signal.h u. interrupt.h werden eingebunden.
ich habe im sreg das I bit per SREG |= 0x80; gesetzt was ist der unterschied zu sei(); ?
Gizmo wrote: > ich habe im sreg das I bit per SREG |= 0x80; gesetzt was ist der > unterschied zu sei(); ? 2 CPU-Takte. Dein Code ist reichlich altmodisch. SIGNAL, Vektornamen mit SIG_ und <avr/signal.h> sind schon einige Jahre lang "deprecated". UART-Ausgaben in einer ISR sind auch nicht das Gelbe. Bei 9600 Bd würde diese Ausgabe stolze 6 ms dauern. Wenn F_CPU = 1 MHz ist, dann würde sich die Katze etwa bei einem OCR0 von 23 in den Schwanz beißen, weil die UART-Ausgaben länger dauern als das CTC-Intervall. Aber einen wirklichen Fehler finde ich da nicht, und ich verwette meine (nicht vorhandene :) Perücke, dass der Code funktionieren würde, wenn ich ihn bei mir auf einem ATmega128 (praktisch baugleich bis auf die Speichergrößen) implementiere. Ach, *klick*: hast du die M103C-Fuse abgeschaltet?
Hallo Jörg danke für deine Antwort mein atmega 64 läuft mit internem oszillator auf 8 Mhz das calibration byte ist geschrieben. was ist denn das M103C-Fuse ? hab das noch nie gehört.
Gizmo wrote: > was ist denn das M103C-Fuse ? hab das noch nie gehört. Datenblatt?? http://www.mikrocontroller.net/articles/AVR_Fuses#Kompatibilit.C3.A4tsfuses_und_manchmal_l.C3.A4stige_Defaults
Gizmo wrote:
> was wäre der richtige interrupt handler ?
TIMER0_COMP_vect
Das ist der Name aus dem Datenblatt, "_vect" angehängt.
hi jörg wenn ich den von dir genannten interrupt vektor verwende bekomme ich folgendes warning. : warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler
Gizmo wrote: > hi jörg > > wenn ich den von dir genannten interrupt vektor verwende bekomme ich > folgendes warning. > : warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler wie wäre es dann jetzt mal mit einem Blick ins Datenblatt??
Gizmo wrote: > wenn ich den von dir genannten interrupt vektor verwende bekomme ich > folgendes warning. Den habe ich nicht vorgeschlagen... Aber der Vektorname ist ein Schönheitsfehler, nicht dein eigentliches Problem. Das wird wohl nach wie vor die M103C-Fuse sein.
hab das flag vor meinem letzten post schon rauß genommen. ich prüfe gerade das überlaufs flag im TIFR register um sicherzustellen ob der timer überhaupt läuft. das steht gerade als erstes in meiner (while(1)) programmschleife. if(TIFR & 0x04) { usartPuts("tov1\r\n"); } so wie es aussieht wird das überlaufsflag nie gesetzt da auf hyperterminal nichts erscheint. sprich der timer läuft garnicht erst an. heul
Nochmal: Solange du die M103 Fuse nicht korrekt einstellst, stürzt dein µC beim ersten Funktionsaufruf ab. Solange diese Fuse nicht korrekt steht (und bei einem nagelneuen M128 steht sie falsch!) ist es sinnlos, sich über andere Fehler Gedanken zu machen.
Gizmo wrote: > sprich der timer läuft garnicht erst an. > > *heul* laut deinem ersten Post startest du Timer0, jetzt prüfst du plötzlich Timer1... was red ich, du ignorierst ja eh alles...
@ Justus Skorps kannst du eigentlich auch mal was schreiben was einem weiterhilft ? na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast, leute die wissen von was sie reden wie alle anderen die mir hier helfen wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt sparen. Ein Tip an dich: Wenn du gerne was tippen möchtest schreib ein Tagebuch. Bin halt Einsteiger und irgendwann weiß man halt nicht mehr weiter. zum datenblatt: glaubst da hab ich noch net rein geschaut. es kann sein das man beim lesen was übersieht, dann fragt man halt wenn was nicht klappt. wozu ist ein forum bitte schön da ? ich wünsche dir noch nen schönen tag servus
Gizmo wrote: > @ Justus Skorps > > kannst du eigentlich auch mal was schreiben was einem weiterhilft ? du meinst sowas >http://www.mikrocontroller.net/articles/AVR_Fuses#Kompatibilit.C3.A4tsfuses_und_manchmal_l.C3.A4stige_Defaults oder > laut deinem ersten Post startest du Timer0, jetzt prüfst du plötzlich > Timer1... ? > na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast, wie soll man aus deinen hingeworfenen Code-Fetzen denn Ahnung bekommen? > leute die wissen von was sie reden wie alle anderen die mir hier helfen > wollen denen du auch nicht antwortest, und darauf hab ich mich bezogen...siehe Frage nach M103C-Fuse... > glaubst da hab ich noch net rein geschaut. anscheinend nicht, sonst wäre > was ist denn das M103C-Fuse ? hab das noch nie gehört. nicht gekommen...
Gizmo wrote: > kannst du eigentlich auch mal was schreiben was einem weiterhilft ? > na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast, > leute die wissen von was sie reden wie alle anderen die mir hier helfen > wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt > sparen. Nun werd' hier mal nicht pampig, sonst redet ganz schnell keiner mehr mit dir. Er hat doch mit seiner Frage völlig Recht: du hast anfangs immer von Timer 0 geschrieben, jetzt prüfst du den Überlauf von Timer 1 (und noch dazu mit 0x04 statt _BV(TOV1), bei dem man wenigstens gleich erkennen würde, wofür das Flag gut ist). Wenn du den Timer im CTC-Modus betreibst, wird er außerdem nie überlaufen, da er ja vorher zurück gesetzt wird. Daher benutzt du ja auch die ISR für compare match statt der für overflow. Am besten, du postest mal einen kompletten, compilierbaren Code, und zwar den, den du auch zum Testen benutzt. (Bitte als Anhang.)
Na denn, zum Testen ob der Timer überhaupt anläuft, sollte das reichen
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | unsigned char count; |
5 | |
6 | ISR( TIMER0_OFV_vect ) |
7 | {
|
8 | PORTB = count++; |
9 | }
|
10 | |
11 | int main() |
12 | {
|
13 | DDRB = 0xFF; |
14 | |
15 | TIMSK = ( 1 << TOIE0 ); |
16 | TCCR0 = ( 1 << CS00 ) | ( 1 << CS01 ); |
17 | |
18 | sei(); |
19 | |
20 | while( 1 ) { |
21 | }
|
22 | }
|
Viel Spass.
>Na denn, zum Testen ob der Timer überhaupt anläuft,
Nö. Dafür braucht er dafür schon sowas:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | unsigned char count; |
5 | unsigned char count2; |
6 | |
7 | ISR( TIMER0_OFV_vect ) |
8 | {
|
9 | PORTB = count++; |
10 | }
|
11 | |
12 | int main() |
13 | {
|
14 | DDRB = 0xFF; |
15 | |
16 | TIMSK = ( 1 << TOIE0 ); |
17 | TCCR0 = ( 1 << CS00 ) | ( 1 << CS01 ); |
18 | |
19 | sei(); |
20 | |
21 | while( 1 ) |
22 | {
|
23 | PORTA = count2++; |
24 | }
|
25 | }
|
:-) Oliver
Oliver wrote: >>Na denn, zum Testen ob der Timer überhaupt anläuft, > > Nö. Dafür braucht er dafür schon sowas: Hast recht. Könnte ja auch noch ein Fehler beim Flashen sein. Aber den PORTA noch auf Ausgang setzen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.