mikrocontroller.net

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


Autor: Gregor007 (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.