Ob der Mega mit dem 8-MHZ quartz arbeitet, wird durch die Fuses entschieden. Das ist in deinem Beispiel natürlich nicht ersichtlich.
Remark:
Sowas ist natürlich sinnlos, Null verschieben gibt wieder Null
(0<<WGM01)
Hi,
wir sind so langsam am verzweifeln, da die von uns durchdachte Servoansteuerung nicht funktioniert.
Wir arbeiten mit einem AtMega32 8MHz
Plan war es das Signal für die Servosteuerung durch Interrupts zu erstellen (Interrupts alle 10µs)
Nur leider ist das Ergebnis nicht das von uns Gewünschte 1,5ms(High) zu 17,5ms(Low) Verhältnis. wir bekommen eine Highzeit von ca. 9ms und demenstprechender Lowzeit.
Der Fehler tritt sowohl bei der Benutzung des internen, als auch bei der Benutzung eines Externen Taktes auf.
Der Timer scheint zu langsam zu sein, aber warum? woran kann das liegen
Habt ihr eine Idee?Code:#include <avr/io.h> #include <avr/interrupt.h> // volatile Interupt Zugriff volatile int s_AnZeit = 150; // "Lenkzeit" in microsecond volatile int s_AnZeit_tmp = 150; // Sicherheits Zwischenspeicher für Lenkzeit volatile long int s_Counter = 0; // Zählervariable für den Servo PORTD =0x00; // PORTD auf Low setzen ISR(TIMER0_OVF_vect) { TCNT0 = 176; if (s_Counter == 0) { PORTD =0x40; // PORTD6 auf High setzen } if (s_Counter == s_AnZeit_tmp) { PORTD =0x00; // PORTD auf Low setzen } s_Counter++; if (s_Counter == 2000) { s_AnZeit_tmp = s_AnZeit; // Holen der neuen "Lenkzeit" s_Counter = 0; // Zurücksetzen der Zählervarible } } int main () { DDRD=0xff; // PORTD6 auf Ausgang PORTD =0x00; // PORTD vorsichtshalber mal auf Low gesetzt TCCR0 |= (0<<WGM01)|(1<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS00); TCNT0 = 176; TIMSK |= (1<<TOIE0); sei(); do { } while (1); }
gruß marcus
Ob der Mega mit dem 8-MHZ quartz arbeitet, wird durch die Fuses entschieden. Das ist in deinem Beispiel natürlich nicht ersichtlich.
Remark:
Sowas ist natürlich sinnlos, Null verschieben gibt wieder Null
(0<<WGM01)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja weiß ich doch, ich nutze das STK500 und hab da halt den Quarz bz. den internen Takt benutzt, aber bei beiden war das Ergebniss gleich, also muss der AVR wohl auf 8Mhz laufen.
Das mit der 0 auf 0 schieben, ist noch drin da wir verschieden Einstellungen getestet haben.
Der Punkt ist aber der, das der Timer ja so (also 8Mhz AVR takt) das gewünschte Ergebnis liefern sollte, macht er aber leider nicht, nur warum?
Ich hab in eine Prog von mir nachgesehen, ich schreibe in TCCR0 nur den Prescaler rein, alles andere auf NULL (also KEIN WGMxx).
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ok das habe ich jetzt mal Versuch, dann müsste die Zeile also so sein:
TCCR0 |= (1<<CS00); //Prescaler auf 1
und halt den Vorladewert TCNT0 = 176;
Aber er macht immernoch genau das selbe
Muss annehmen, dass der Mega mit dem internen Oszillator läuft.
d.h. die STK und auch der Quartz sind ihm völlig egal, daher auch das gleiche Ergebnis.
TImer0 ist in der Grundfunktion wirklich nix mystisches.
http://www.rn-wissen.de/index.php/Ba...erste_Programm
Ich nehm aber lieber das Ponyprog (for free), das scheint mir persönlich intuitiver.
Erstmal die Fuses lesen, dann schauen, was eingestellt ist. sind nur zwei Häkchen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi,
Ja da der Timer in normaler Grundfunktion ist, dachten wir ja auch, kann nicht so schwer sein. Aber es geht nicht richtig, er ist ein Stück zu langsam, also der Takt zu lange.
Das mit dem Quarz ist auch nicht das Problem, die Fuse-Bits sind jetzt auf extern gesetzt, wenn ich den Quarz rausnehme, generiert er überhaupt kein Signal, von daher denke ich, läuft der Quarz wie es sein sollte.
Kann der Interupt-betrieb eine so lange "Störung" erzeugen, also anstatt 1,5mS ganze 9mS?
Ich habe auch mal den AtMega getauscht, aber keine Besserung.
Hat noch jemand einen Tipp was ich versuchen kann?
Ich hab immer erstmal ein Testprogramm am Laufen, das jede Sekunde einmal blinkt.
Da kann man schon mit freiem Auge abschätzen, ob die Speed passt.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Da muss ich dir recht geben, habe mal eine 1S blinkende LED mit dem Timer gemacht, das funktioniert wie es sollte.
Danach habe ich mich nochmal an mein Programm oben gesetzt und einfach den Port in der ISR auf High und dann sofort wieder auf Low gesetzt...
ISR (Timer0) {
PORTD=0x04;
PORTD=0x00;}
Der Port bleibt für ca. 9mS high.
Woran kann das liegen, Rest-Kapazität die den Pegel oben hält?
Oder einfach am 8 Bit-Timer?
ich kenne mich mit dem mega32 nicht so aus, aber ist es nicht so, dass
du hier TCCR0 |= (0<<WGM01)|(1<<WGM00) in den PWM-Modus schaltest
statt: TCCR0 |= (0<<WGM01)|(0<<WGM00) für Normalmodus.
Ist auch glaube ich das was PicNick meinte.
Lesezeichen