Forum: Mikrocontroller und Digitale Elektronik Atmega32 Wartezeit mit Timer1 (16bit-timer)


von Gregor007 (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei eine Servosteuerung über pwm mit einem Atmega32 (8 
Mhz)zu programmieren.
Dabei soll der servo ein paar Sekunden in einer position stehen und dann 
in eine andere Position drehen (Lenkung: von links nach rechts).
Dabei bereitet mir genau diese Wartezeit Probleme. Und zwar ist Timer 2 
(8-bit-timer) für das pwm signal zuständig und für die Wartezeit möchte 
ich Timer 1 (16 Bit-timer) verwenden.

Dafür habe ich mir folgendes überlegt: als Prescaler wähle ich 1024
---> 8 Mhz/1024 = 7812,5 Hz
---> 65534 / 7812,5 = 8,39 Sekunden, d.h. der Timer benötigt 8,39 
Sekunden für einen Durchgang und 4,2 sekunden um bis 32767 zu zählen. 
Diese 4,2 Sekunden passen sehr gut für meine Verweilzeit des Servos in 
einer Position.
Also dachte ich mir ich programmiere zwei if-Entscheidungen um diese 
beiden zustände (Timer <32767 bzw. > 32767) abzufragen und ordne die 
jeweils gewünschten Sensorpositionen zu.

Hier der Quelltext:

//Timer 1 für Wartezeit, Initialisierung
void timer_warte_initial (void) {

  TCCR1A = 0x00;       //Normal Mode, Prescaler 1024
  TCCR1B = 0x05;

  TCNT1 = 0x0000;  //Startwert 0
}

//Initialisierung des Timer 2 für PWM-Lenkung (Lenkservo)
void timer2_initial(void) {

  TCCR2 = 0x73;        //Mode 1, Signale invertieren,Prescaler 64
  DDRD |= (1<<PD7);    //OC2 (Pin 21) als PWM-Ausgang setzen
}

int main(void) {

  timer_warte_initial();
  timer2_initial ();

if ( TCNT1 < 0x7FFF)    // Grenzwert:32767
    OCR2 = 0xC4;           //Servoposition ganz rechts
if (TCNT1 > 0x7FFF)
    OCR2 = 0x71;           //Servoposition ganz links

}


DasProblem ist, das OCR2 immer auf 0xC4 bleibt und auch bei 
überschreiten des Grenzwertes (TCNT1>0x7FFF) nicht auf 0x71 umschaltet. 
Und ich habe keine Ahnung warum er das nicht macht.
DieSensorpositionen stimmen alle, nacheinander angesteuert funktionieren 
die Werte einwandfrei.
Hat hier jemand Vorschläge, warum es nicht funktioniert? Oder auch 
generell für Tipps die Wartezeit zu realisieren bin ich dankbar. mit 
delay möchte ich das nicht machen, da der Controller noch einen zweiten 
servo steuern muss, und ich ihn deswegen nicht blockieren möchte.

Vielen Dank für alle Tipps/Hinweise, ich hoffe mein Problem ist klar 
geworden.Wenn nicht, beantworte ich gerne alle auftretenden Fragen.

Herzliche Grüße,
Gregor

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gregor007 schrieb:

> Und ich habe keine Ahnung warum er das nicht macht.

Weil du die ganze Abfrage nur ein einziges Mal machst -- danach schickst
du den Controller in die ewigen Jagdgründe, ähem, in die Funktion
exit() (wird implizit beim Verlassen von main() aufgerufen).

Mit anderen Worten: dein Programm braucht eine Hauptschleife.

p.s.: bitte benutze die Formatierungskennzeichen, siehe auch
Formatierung im Forum

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.