Forum: Mikrocontroller und Digitale Elektronik Mit Timer 2 zwei Dinge gleichzeitig tun


von Stefan V. (Gast)


Lesenswert?

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

von Ephraim H. (ephi)


Lesenswert?

ausgang setzen, 200 nop's und optimierung aus ;-)

von Stefan V. (Gast)


Lesenswert?

Sehr hilfreich danke....

und im ernst?

von Gast (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Stefan V. (Gast)


Lesenswert?

Wäre das mit dem Timer 1 besser realisierbar?

Wäre echt froh, wenn nicht der ISR 9mal umsonst ausgelöst wird.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Stefan V. (Gast)


Lesenswert?

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?

von STK500-Besitzer (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Stefan V. (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.