Forum: Mikrocontroller und Digitale Elektronik TIMER1 und TIMER0 laufen nicht zusammen


von Mark G. (donluis)


Angehängte Dateien:

Lesenswert?

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?

von sven (Gast)


Lesenswert?

Ich glaube es ist sehr ungünstig sprintf in der ISR auszuführen...

von Karl H. (kbuchegg)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Timer0
>  TIMSK |= (1<<OCIE2);

Timer1
>  TIMSK =  (1<<TICIE1);

>  timer_init0();
>  timer_init1();


MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

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

von Mark G. (donluis)


Angehängte Dateien:

Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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!

von spess53 (Gast)


Lesenswert?

Hi

>Problem besteht immernoch...

Weil es in einer von deinen Timer-Inits liegt

Lies dir alle Antworten durch.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Und die Variable capture muss
* volatile sein
* atomar zugegriffen werden

von Mark G. (donluis)


Lesenswert?

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

von Mark G. (donluis)


Angehängte Dateien:

Lesenswert?

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.

von Mark G. (donluis)


Lesenswert?

...Problem ist leider noch nicht gelöst...

Timer2 läuft einfach nicht wenn gleichzeitig Timer1 läuft???

von Karl H. (kbuchegg)


Lesenswert?

So.
Und jetzt bitte alles einmal im kompletten Code.

von spess53 (Gast)


Lesenswert?

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

von Mark G. (donluis)


Lesenswert?

ja das wars danke jetzt laufen beide timer :)

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.