Guten Abend Forum:-) Bin leider überfordert. Also wenn der Timer laufen beginnt, dann soll ein Ausgang (Portb) auf high gehen. Bei dem 200sten Takt soll er dann auf low gehen. Dann soll er weiter auf 2000 Takte hochzählen, damit er dann in den timer overflow springt. Ist das mit dem Timer 2 oder generel mit dem AVR möglich? Programmiere in asm mit dem Mega8 Danke für eure Hilfe LG Stefan
Verzögerung im Interrupt??? Das geht mal überhaupt nich. Ich würd im Interrupt nen Teiler in sw Programmieren
1 | div--; |
2 | |
3 | if(!div) { |
4 | //tu was
|
5 | div = 200; |
6 | }
|
so z.b.
Timer2 ist nur 8 Bit breit. Deine Aufgabe erfordert also etwas mehr Software... Man könnte ihn im CTC-Mode (TOP =199 setzen) betreiben und in der zugehörigen ISR dann mit einer weiteren Variablen die Durchläufe zählen. Sollte also eigentlich kein Problem sein. Dein "timer overflow" musst du dann aber per Hand "auslösen".
"Also eigentlich will ich folgendes machen..." Tipp: Nicht zulange damit warten. Wenn die Leute ihr Interesse an einem Thread verloren haben, ist es meist vorbei.
Hi >ausgang setzen, 200 nop's und optimierung aus ;-) Besonders der Teil mit der Optimierung in ASM ist interessant. >Also wenn der Timer laufen beginnt, dann soll ein Ausgang (Portb) auf >high gehen. Der Timer läuft los, wenn eines der CS2x-Bits in TCCR2 gesetzt wird. Also hast du das selbst in der Hand. >Dann soll er weiter auf 2000 Takte hochzählen, damit er dann in den >timer overflow springt. Das ist ein 8-Bit-Timer. Und der kann nur von 0..255 zählen. >Ist das mit dem Timer 2 oder generel mit dem AVR möglich? Ja, aber nicht in einem Rutsch. Solltest OCRx auf z.B. 200 setzen und die Anzahl der Interrupts in einer Variable zählen. Beim Erreichen von 2000 die Aktion auslösen. MfG Spess
Wäre das mit dem Timer 1 besser realisierbar? Wäre echt froh, wenn nicht der ISR 9mal umsonst ausgelöst wird.
>Wäre echt froh, wenn nicht der ISR 9mal umsonst ausgelöst wird. Wo ist das Problem? >Wäre das mit dem Timer 1 besser realisierbar? Ja.
Also ich möchte mit dem mega 8 einen Servo ansteuern. Laut Datenblatt sollen alle 20ms das Signal neu gesendet werden. Also alle 20000 Takte @ 1MhZ. (Sorry, nicht 2000). Und um die Stellung des Servos anzufahren muss am Anfang ein high Signal zwischen 1 und 2ms gesendet werden. 1ms ist ja dann links 1,5ms die Mitte und 2ms ist dann rechts. So und um die Stellungen anzufahren z.B. die Mitte, dann sollte die pwm 0 bis 1500 Takte auf high sein und die restlichen 18500 Takte auf low. nach 20000 Takte dann wieder neustart des Timers 1 mitPin Bauf high. Könnte das so funktionieren oder macht man sowas anders?
>Also ich möchte mit dem mega 8 einen Servo ansteuern.
Da bist du (hier im Forum) der allererste, der sowas machen will.
Benutz die Suche!
Stefan V. schrieb: > Also ich möchte mit dem mega 8 einen Servo ansteuern. > > Laut Datenblatt sollen alle 20ms das Signal neu gesendet werden. Also > alle 20000 Takte @ 1MhZ. (Sorry, nicht 2000). Vergiss die 20ms, die sind nicht wichtig. Wichtig ist einzig und alleine der 1ms bis 2ms Puls. In diesem Puls steckt die Positionsinformation. Die Pause bis zum nächsten Puls ignoriert das Servo sowieso. Diese Pause hat Ursachen, die nichts mit dem Servo selbst zu tun haben. > Und um die Stellung des Servos anzufahren muss am Anfang ein high Signal > zwischen 1 und 2ms gesendet werden. 1ms ist ja dann links 1,5ms die > Mitte und 2ms ist dann rechts. Genau. Das ist der für dich wichtige Teil. > So und um die Stellungen anzufahren z.B. die Mitte, dann sollte die pwm > 0 bis 1500 Takte auf high sein und die restlichen 18500 Takte auf low. > nach 20000 Takte dann wieder neustart des Timers 1 mitPin Bauf high. > Wie kommst du auf 1500 Takte? Oder anders ausgedrückt: Woher nimmst du die Erkentnis, das 1500 Timertakte genau 1.5ms entsprechen?
Also ich dachte mir: 1 MhZ - 1sec 1000000 Hz - 1000ms 1000 Takte - 1ms 1500 Takte - 1,5ms 2000 Takte - 2ms Ist das so nicht in Ordnung?
Stefan V. schrieb: > Also ich dachte mir: > > 1 MhZ - 1sec > 1000000 Hz - 1000ms > 1000 Takte - 1ms > 1500 Takte - 1,5ms > 2000 Takte - 2ms > > Ist das so nicht in Ordnung? OK. Du willst also den Timer mit der CPU-Frequenz betreiben. Kann man machen. Damit hast du schon mal die erste Zutat identifziert. Da du weiter als bis 255 zählen willst, brauchst du den 16 Bit Timer. Zweite Zutat identifiziert. Jetzt schnappst du dir das Datenblatt zu deinem Prozessor und siehst erst mal nach, welche Modi der Timer 1 kann. Dann überlegst du dir, welcher Modus, zumindest dem Prinzip nach, schon fast das macht, was du willst. Hinweis: es ist einer der PWM Modi
>Jetzt schnappst du dir das Datenblatt zu deinem Prozessor und siehst >erst mal nach, welche Modi der Timer 1 kann. Dann überlegst du dir, >welcher Modus, zumindest dem Prinzip nach, schon fast das macht, was du >willst. Hinweis: es ist einer der PWM Modi Man könnte auch bei Hannes Lux vorbeigucken... http://www.hanneslux.de/
Wobei sich Hannes mehr mit der Decodierung der Signals befasst hat...
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.