-         

Ergebnis 1 bis 10 von 10

Thema: Timer0 vom Atmega644 spinnt?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388

    Timer0 vom Atmega644 spinnt?

    Anzeige

    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:
    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 habe alles mehrfach durchgerechnet und es scheint zu stimmen.

    Ich hab mir überlegt ob mein Controller vieleicht doch nicht mit meinen eingestellten 16Mhz läuft Aber auch bei den Fusebits habe ich auf "8.0Mhz -" gestellt.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    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"...

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Ja, es hängt ein 16Mhz Quarz dran.
    Fuse sind auf:
    Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 16K CK + 65 ms; [CKSEL=1111 SUT=11]
    eingestellt

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Du solltest den "Full Swing Oszillator" nehmen und den "CLKDIV8" abschalten
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    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?

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    31
    Beiträge
    388
    Danke, ich werds ausprobieren
    Wozu ist das den gut? Und betrifft das nur externe Quarze oder sogar den Internen?

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    29
    Beiträge
    1.221
    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

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •