Guten Abend,
Für die Ansteuerung meiner Servos benutze ich den Timer0 eines ATMega644.
Das funktioniert auch super.. aber nur bis 3Servos und dann "zerfällt" das Signal.
Folgend Ausschnitte aus meinem Code:
Das mache ich eigentlich 18mal.Code:void servoposH(void) { //HÜFTEN // (1) if(countH1>=posH1) PORTA &= ~(1<<PORTH1); else PORTA |= (1<<PORTH1); // (2) if(countH2>=posH2) PORTA &= ~(1<<PORTH2); else PORTA |= (1<<PORTH2); // (3) //........... -6 }; //INTERUPT ISR(TIMER0_OVF_vect) { TCNT0 = TIMER; if(countH1<=(1740-posH1)) countH1++; else countH1 = 0; if(countH2<=(1740-posH2)) countH2++; else countH2 = 0; if....... //.....-6 }; int main(void) { //INITIALISIEREN DER PORTS initialisieren(); //TIMER LADEN timer_init(); //GLOBALE INTERUPTS AKTIVIERT sei(); posH1 = 135; posH2 = 119; posH3 = 130; posH4 = 127; posH5 = 135; posH6 = 132; //HAUPTSCHLEIFE for(;;) { servoposH(); } }
Also in der funktion servoposH() 6x, servoposSCH() 6x, servoposK 6x.
Die Lowabfragen mache ich 18x im ISR.
Ich hoffe ihr versteht was ich meine, die High abfragen sind auf 3 Funktionen verteilt und die Lowabfragen stecken im ISR.
Der obige Quelltext ist natürlich nicht vollständig.
Die Variablen posH^n sind mit Testwerten initialisiert. Wie gesagt es funktioniert auch alles.. aber sobald ich mehr als 3 Servos (Sprich abfragen) im Interupt verarbeite geschehen mit meinem Signal die merkwürdigtsen Dinge. Ich habe in meinem Programm die restlichen Abfragen einfach ausgeklammert.
Mir scheint als sei der Interupt damit überfordert. Kann das sein?
Der Interupt läuft auf 100kHz, also alle 0.01s einmal. Naja nicht genau, aber in etwa.
Ursprünglich wollte ich ja alle abfragen im ISR machen aber das klappt niemals.
Danke fürs lesen und allfällige Inputs
Ich kann auch gerne mehr Code posten aber ich denke, der Rest ist nicht nötig resp. in Ordnung... also alles initialisiert.
Lesezeichen