Hi, ich möchte gerne eine 40 Khz Frequenz generieren und am Empfänger den Flankenwechsel mithilfe eines ICP detektieren. Ich benutze einen ATMEGA32 und 2 Ultraschallsensoren. Leider hab ich noch nicht allzuviel Erfahrung bei der Programmierung des MK. Mein Problem ist jetzt, sobald ich TIMER1 dazu nehme läuft TIMER0 nicht mehr. Ich hab schon mehrere Variationen ausprobiert und TIMER1 im CTC Modus laufen lassen. Wenn ich Timer1 auskommentiere läuft Timer0 normal, lass ich beide laufen funktioniert nur Timer1. Hat vielleicht einer ne Idee wo das Problem liegt?
Ich glaube es ist sehr ungünstig sprintf in der ISR auszuführen...
Hast du eine Vorstellung davon, wie lange
1 | ISR (TIMER1_CAPT_vect) |
2 | {
|
3 | sprintf((char*)s, "Time of delay:%d", ICR1); |
4 | uputs(s); |
5 | }
|
dauert? Dein Programm trödelt praktisch ausschliesslich in diesem Catpture Interrupt herum, weil es zu nichts anderem mehr kommt, als diese Ausgabe zu machen. In dem Moment, in dem diese Ausgabe fertig ist, ist bei 40kHz schon der nächste Capture Interrupt zur Bearbeitung fertig.
Hi Timer0 > TIMSK |= (1<<OCIE2); Timer1 > TIMSK = (1<<TICIE1); > timer_init0(); > timer_init1(); MfG Spess
spess53 schrieb: > Hi > > Timer0 >> TIMSK |= (1<<OCIE2); Schau dir den Rest an. Er redet zwar immer vom Timer 0, verwendet aber durchgängig den Timer 2 :-) Soviel zum Thema: Maximale Konfusion
danke schon mal für die schnellen Antworten. Hab main.c umgeschrieben so dass ich nicht mehr in der ISR die Ausgabe habe. Die Flags im TIMSK Reigister habe ich nicht in main.c sondern in timer.c gesetzt. Hab die Datei auch oben angehängt. Problem besteht immernoch...
Und was erwartest du dir von einem Timer
1 | ...
|
2 | uputs("###*RST*###\n\r"); |
3 | timer_init0(); |
4 | // timer_init1();
|
der nicht initialisiert wird? Ausserdem
1 | ...
|
2 | for(i=0;i<10;i++) |
3 | {
|
4 | sprintf((char*)s, "Time of delay:%d", capture); |
5 | uputs(s); |
6 | }
|
7 | ...
|
du willst den µC niemals, unter keinen Umständen aus dem main rauslassen. Auch nicht nach 10 Durchgängen. Poste doch bitte alles in einem Source-File (und kompilier das auch so). Dann braucht man nicht dauernd zwischen mehreren Files hin und herspringen um sich die 5-Zeiler anzusehen. Mach dir doch nicht selber und uns das Leben schwer!
Hi
>Problem besteht immernoch...
Weil es in einer von deinen Timer-Inits liegt
Lies dir alle Antworten durch.
MfG Spess
Und die Variable capture muss * volatile sein * atomar zugegriffen werden
stimmt benutze den TIMER2 mit der funktion timer_init0()! Das liegt daran das ich vorher den TIMER0 benutzt habe. Wollte einfach mal den TIMER wechseln aber TIMER0 und TIMER2 sind ja identisch ist also egal denke ich... ... habe aber in meinem Programm jetzt aus timer_init0() -> timer_init2() gemacht da ich ja auch TIEMR2 initialisiere
hab jetzt die capture variabel als flüchtig deklariert und noch eine endlos schleife nach der 10maligen Ausgabe mit rein genommen, sonst kann er ja die 40Khz nicht dauerhaft generieren ist ja klar. Hab ein Oszilloskop mit dem Sender verbunden, damit ich sehen kann das die 40Khz generiert werden.
...Problem ist leider noch nicht gelöst... Timer2 läuft einfach nicht wenn gleichzeitig Timer1 läuft???
Hi
>Timer2 läuft einfach nicht wenn gleichzeitig Timer1 läuft???
Du schaltest in der timer_init1() den Interrupt vom Timer2 wieder ab.
MfG Spess
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.