edit: sorry, hab mich verguckt...
Hast du einen 16MHz Quarz am Controller?
Was genau hast du bei den Fusebits eingestellt?
Der muss auf "chrystal" stehen, nicht auf "8MHz"...
Guten Abend,
Ich lasse auf einem Atmega644 den Timer0 mit 100khz laufen.
Resp. ich fange alle 0.01ms einen Interupt ab.
Dort lasse ich eine Variable mitzählen um ein PWM Signal zu erzeugen.
Leider ist die Ausgangsfrequenz viel zu tief. Ca. 10mal geringer als erwartet.
So sieht mein Code aus:
Ich habe alles mehrfach durchgerechnet und es scheint zu stimmen.Code:#include <avr/io.h> // I/O Port definitions #include <avr/interrupt.h> // Interrupt macros #define F_CPU 16000000 #define timer (256-F_CPU/8/100000) #define SERVOPORT PORTA #define DDRSERVO DDRA volatile unsigned int ms; void timer_init(void) { TCCR0B |= (1<<CS01) | (!(1<<CS00)) | (!(1<<CS02)); //Prescaler 8 TCNT0 = timer; TIMSK0 |= (1<<TOIE0); //Interupts aktivieren }; ISR(TIMER0_OVF_vect) { ms++; TCNT0 = timer; if(ms>=1850) { PORTA |= (1<<PORTA0); } if(ms>=2000) { PORTA &= ~(1<<PORTA0); ms = 0; } }; int main(void) { DDRA |= (1<<PORTA0); //KOMPLETTE PINS A AUSGANG PORTA &= ~(1<<PORTA0); //PIN 0 LOW sei(); //GLOBALE INTERUPTS AKTIVIERT timer_init(); //FUNKTIONSAUFRUF for(;;) { } }
Ich hab mir überlegt ob mein Controller vieleicht doch nicht mit meinen eingestellten 16Mhz läuftAber auch bei den Fusebits habe ich auf "8.0Mhz -" gestellt.
edit: sorry, hab mich verguckt...
Hast du einen 16MHz Quarz am Controller?
Was genau hast du bei den Fusebits eingestellt?
Der muss auf "chrystal" stehen, nicht auf "8MHz"...
Ja, es hängt ein 16Mhz Quarz dran.
Fuse sind auf:
eingestelltExt. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms; [CKSEL=1111 SUT=11]
Hallo,
der hat doch auch das "Divide Clock by 8" Bit. Hast du dran gedacht?
Sonst beschreib doch einmal wie du die Ausgangsfrequenz misst. Machst du das mit dem Oszi, kanst du davon Bilder machen?
Gruß
Jens
Du solltest den "Full Swing Oszillator" nehmen und den "CLKDIV8" abschalten
Danke für eure Antworten.
@McJenso
Ich habe eine Led dran die fröhlich blinkt.
Ich könnt aber auch mal mit dem Oszi messen, aber die Led hat vieleicht 5Hz... definitiv viel zu wenig.
"Divide Clock by 8" ist eingeschalten. Was heisst den das?
@Hubert.G
Ich dachte "Full Swing Oszillator" sind richtige Oszillatoren und keine Quarze??
Was ist den ein CLKDIV8?
Hallo,
mit dem CLKDIV8 oder auch divide clock by 8 wird der Takt durch 8 geteilt. Sprich aus 16 mach 2 Mhz. Stell das um und alles wird gut.
Gruß
Jens
Danke, ich werds ausprobieren
Wozu ist das den gut? Und betrifft das nur externe Quarze oder sogar den Internen?
Das betrifft jede Chiptaktquelle, warum? Keine Ahnung, vielleicht um einen stabileren Takt zu bekommen, ich bin gerade im Datasheet über den Hinweis gestolpert, dass man diese Option nutzen kann, wenn VCC zu niedrig für den "normalen" Takt ist.
Ein weiterer Punkt der mit den Teilern in Verbindung erwähnt wird, ist Stromsparen.
mfG
Markus
Full Swing Oszillator ist der Ersatz für das CKOPT der vorhergehenden Serien. Dieses CKOPT sollte bei Quarze höher 8MHz eingeschalten werden um ein sicheres Schwingen zu gewährleisten. Das ist zumindest meine Interpredation des Datenblatts.
Lesezeichen