Interupt überfordert? ATMega644, Timer0 ..
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:
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();
}
}
Das mache ich eigentlich 18mal.
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.