mikrocontroller.net

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


Autor: Mark G. (donluis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube es ist sehr ungünstig sprintf in der ISR auszuführen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eine Vorstellung davon, wie lange
ISR (TIMER1_CAPT_vect)
{  
  sprintf((char*)s, "Time of delay:%d", ICR1);
  uputs(s);
}
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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Timer1
>  TIMSK =  (1<<TICIE1);

>  timer_init0();
>  timer_init1();


MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark G. (donluis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was erwartest du dir von einem Timer
  ...
  uputs("###*RST*###\n\r");
  timer_init0();
//  timer_init1();

der nicht initialisiert wird?

Ausserdem
   ...
  for(i=0;i<10;i++)
  {
    sprintf((char*)s, "Time of delay:%d", capture);
    uputs(s);
  }
  ...

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!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Problem besteht immernoch...

Weil es in einer von deinen Timer-Inits liegt

Lies dir alle Antworten durch.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und die Variable capture muss
* volatile sein
* atomar zugegriffen werden

Autor: Mark G. (donluis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark G. (donluis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark G. (donluis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Problem ist leider noch nicht gelöst...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So.
Und jetzt bitte alles einmal im kompletten Code.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark G. (donluis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das wars danke jetzt laufen beide timer :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.