- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Atmega8 Timer0

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.08.2007
    Beiträge
    31

    Atmega8 Timer0

    Anzeige

    Praxistest und DIY Projekte
    Nabend,
    ich habe folgendes problem. ich möchte gerne den Timer0 meines atmega8 in gang bringen. und bei einem overflow einen interrupt auslösen.
    also habe ich, wie im datenblatt und in etlichen beispielen beschrieben den timer in gang gesetzt:
    timer aktivieren F_CPU/1024 (TCCR0)
    interrupt durch timer0 erlauben (TIMSK)
    interrupts allgemein einschalten
    ISR routine für timer0 overflow schreiben ISR(TIMER0_OVF_vect)

    soweit von meiner seite ersichtlich, ist an dem code nichts auszusetzen

    da ich gehört habe, dass es da durchaus drauf ankommt, wie man seinen code compiliert, habe ich das beigefügt.

    Hier das Compileren und Flashen:
    Code:
    > avr-gcc file.c -c -o file.o -Os -g -mmcu=atmega8
    > avr-gcc file.o -o file.elf -mmcu=atmega8
    > avr-objcopy -j .text -j .data -O ihex file.elf file.hex
    > avrdude -c avrispv2 -p m8 -P USB -U flash:w:file.hex:i
    Hier der Code:

    Code:
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    #include <stdlib.h> 
    #define F_CPU    1000000
    
    ISR(TIMER0_OVF_vect)
    {
    		DDRB	= 0xfd; // Alles ausgang ausser PB1 -> Eingang
    		PORTB	= 0x03; // Ausgang für PB0 high , Pull-Up für PB1 an
    }
    
    
    int main(void)
    {
    	TCCR0	= (1<<CS02)|(1<<CS00); // TCCR0 = 0x03;
    	TIMSK	= (1<<TOIE0);	
    	sei();	
    	while(1)
    	{
    
    	}
    	/* Wird nie erreicht */
    	return 0;
    }
    Ich weis, dass die Anweisung in der Interrupt-Funktionen für nen timer keinen sinn hat. es geht hier auch lediglich um den test des timers

    In einer fertigen beispieldatei funktioniert der timer.
    suchfunktion des forums ergab für mich keine weiterhelfenden themen.

    ich hoffe, dass mir jemand helfen kann.
    danke schonmal im vorraus.
    gruß
    Krampfda

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    Ich kann kein Fehler im Code entdecken.
    Auch beim compilieren mit WinAVR kommt keine Fehlermeldung.
    Gruß Stefan

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Krampfda,

    bis auf 2 Dinge scheint alles ok:
    1. Was hat eine DDRx-Festlegung in einer ISR zu suchen?
    2. TCCR0 ist nicht 0x03 (Kommentar), sondern 0x05, aber der Code selbst ist ok.

    Schreib doch mal einen Code, der wirklich etwas macht (LED einschalten o.ä.).

    Gruß Dirk

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.08.2007
    Beiträge
    31
    habe die DDRB festlegungen aus der ISR genommen und in main() eingefügt. und die andere anweisung ssollte ja eine LED o.ä. in gang bringen (was mit genau dem code in main() auch funktioniert), aber offensichtlich klappt das auch nicht nachdem DDRB schon vorher festgelegt wird.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ... aber offensichtlich klappt das auch nicht ...
    Was klappt nicht? Poste evtl. das ganze Programm und sag, was es machen soll.

    Gruß Dirk

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.08.2007
    Beiträge
    31
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #define F_CPU    1000000
    
    ISR(TIMER0_OVF_vect)
    {
          PORTB   = 0x01;
    }
    
    
    int main(void)
    {
       DDRB   = 0x01; 
       TCCR0   = (1<<CS02)|(1<<CS00); 
       TIMSK   = (1<<TOIE0);   
       sei();   
       while(1)
       {
    
       }
       /* Wird nie erreicht */
       return 0;
    }
    DDRB steht nun in main().
    und wenn ich nun PORTB ebenfalls in main() so belege, wie momentan in ISR, dann leuchtet die an PB0 angeschlossene LED einwandfrei.

    nur so, wie es im moment ist, passiert gar nichts.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    frag doch mal das Overflow Flag TOV0 in TIFR inerhalb der Endlosschleife ab. Dann weißt du, ob es am Timer oder am Interrupt liegt.

    Gruß

    Jens

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich kann mir nicht erklären wo dein Problem liegt, sicher nicht im Programm. Die Zeile in der ISR geändert auf : PORTB ^= 0x01; und die LED flimmert munter vor sich hin.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    24.01.2007
    Beiträge
    53
    Hallo Krampfda,

    hast du eigentlich den Interrupt initialisiert?

    Hier ein auszug aus meinem Code:

    ISR Initialisierung:
    Code:
    void init_ISR(void) {
    	sei();		// Globalen Interrupt aktivieren
    	TIMSK |= ( 0x01 << TOIE0 )	;	// Timer0 Overfloe Interrupt aktivieren
    	TCCR0 |= ( 0x01 << CS02 | 0x00 << CS01 | 0x01 << CS00 ) ; // Prescaler 1024 / Clock <- CPU
    	TCNT0 = 0x64;	// Timer0 Counter mit 0x64 laden für 20ms bei 8Mhz
    }
    und hier meine ISR Schleife:
    Code:
    ISR(TIMER0_OVF_vect) {
    	Counter_X_20ms++;
    	TCNT0 = 0x64; 				// Timer0 Counter mit 0x64 laden
    	TIFR |= ( 0x01 << TOV0 ) ; 	// das Interruptflag sicher zurücksetzen
    }
    Ich hoffe, ich konnt dir weiterhelfen

    Michael

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.08.2007
    Beiträge
    31
    ich habe mal deinen rat befolgt und das noch etwas ausgebaut:

    Code:
    	while(1)
    	{
    		if(TIFR==(1<<TOV0))
    		{
    			PORTC	= (1<<PC5);
    		}
    
    		if(TCNT0==0xff)
    		{
    			PORTB   = 0x02;			
    		}
    	}
    die LED an PortB leuchtet. PORTC bleibt aus. da der timer hochzählt, scheint es nicht an diesem zu liegen, aber wo ist der fehler in meiner interrupt geschichte ?

    komischerweise ergab
    Code:
                    TIFR = (1<<TOV0);
    		if(TIFR==(1<<TOV0))
    		{
    			PORTC	= (1<<PC5);
    		}
    nicht das gewünschte ergebnis, auch hier blieb PB5 aus.

    die codeabschnitte sind jeweils in die endlosschleife meines codes eingebaut worden, den ich oben erwähnt habe.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test