Atmega168 Timer initialisieren und an/aus-schalten
Hallo!
Ich versuche einen optimalen Code für meinen Quadrupped mit 12 Modellbauservos zu schreiben und stehe vor vor folgendem Problem:
Hierfür möchte ich 2 Timer verwenden.
Ein Timer (Timer1 16-Bit) der alle 20 Sekunden auslöst und den 2. Timer (Timer0 8-Bit) aktiviert. Der 2. Timer arbeitet dann alle Servoimpulslängen ab und beendet sich danach bis er wieder vom 1. Timer aktiviert wird.
Das klappt eigentlich auch schon fast, aber beim "Anschalten" des 2. Timers löst dieser sofort aus anstatt der vorgegebenen Zeit zu warten.
Danach hält er sich an die Zeiten.
Also habe ich den Timer0 wie folgt aktiviert:
Code:
TCNT0 = 0; // um sicherzustellen, dass er von Null aufwärtszählt
OCR0A = 50;
TIMSK0 |= (1 << OCIE0A); // Timer0 aktivieren
Aber egal welchen Wert ich für OCR0A eingebe, er startet immer sofort...
Der andere Timer wartet artig seine 20 ms ab bevor er zum ersten mal auslöst.
Hier nochmal ein bisschen mehr Code zur Übersicht:
Code:
...
int main(void)
{
// Timer0 - 8-Bit
TCCR0A |= (1 << WGM01); // Clear Timer on compare
TCCR0B |= (1 << CS02); // Prescaler 256, Interrupt max Verzögerung 4,1 ms
//TIMSK0 |= (1 << OCIE0A); // Compare-mode aktivieren
// Timer1 - 16-Bit
// Servo Impuls-Zeit
TCCR1B |= (1 << WGM12) | (1 << CS12); // Prescaler 256, Clear Timer on compare
OCR1A = 1249; // Interrupt Verzögerung 20 ms
TIMSK1 |= (1 << OCIE1A); // Compare-mode aktivieren
sei(); // Interrupts global ein
....
}
...
ISR (TIMER0_COMPA_vect)
{
....
OCR0A = wartezeit[zaehler]; // Hier gibts die neue Wartezeit - diese wird auch eingehalten!
}
ISR (TIMER1_COMPA_vect)
{
...
TCNT0 = 0;
OCR0A = 50; // <-------------------------------------dieser Wert wird ignoriert
TIMSK0 |= (1 << OCIE0A); // Timer0 aktivieren
}
Zum beenden des Timer0 setze ich TIMSK0 = 0.
Vielleicht sieht hier jemand meinen Fehler? Ich wäre für jede Hilfe dankbar :)
Zur Herangehensweise:
Ich habe schon einen anderen Code zur Ansteuerung der 12 Servos verwendet, dieser ist aber sehr unsauber und die Servos bewegen sich nur sehr ungenau.
Deshalb möchte ich UNBEDINGT diese Methode zum laufen bekommen um auch die Pausenzeiten konstant zu halten.
Gruß Erik
Liste der Anhänge anzeigen (Anzahl: 1)
Rückmeldung:
Heute bin ich fertig geworden, er läuft! Zwar erstmal nur geradeaus, aber mit einem guten Tempo (20 mm/s).
Die Servos laufen auch unerwartet gut (nachdem mir beim frühzeitigen Testen schon einer durchgebrannt ist).
Aus diesem Grund gabs bis jetzt auch nur 5 V bei einem durchschnittlichen Strom von knapp 1 A für alle 12 Servos.
Der Code zum Ansteuern der Servos ist jetzt sehr übersichtlich, leider muss ich den restlichen Code noch "aufarbeiten" - das Vorzeichen-wirrwarr ist sehr unübersichtlich.
Der Aufbau ist, wie auf dem Foto zu sehen sehr provisorisch. Die Beine sowie der Rahmen sind aus Acrylglas CNC-gefräst. Eigentlich hatte ich eine eigene Steuerung/Platine geätzt - leider mit Layout-Fehler. Die Masse der Servos ging zu dicht am Microcontroller vorbei und hatt diesen bei größeren Strömen resetet. Deshalb habe ich mir provisorisch einen Adapter für die RNMini-Control gefräst. Dem entsprechend sieht die Verkabelung aus...
Leider habe ich keinen passenden Akku - darum hängt der Roboter am Kabel...
Ein kleines (unscharfes) Video gibt es auch:
http://www.youtube.com/watch?v=S9qdJ...8qQyZw&index=1
(Alte Handykamera - das Smartphone-Zeitalter hat mich noch nicht erreicht)
Gruß Erik