- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Problem mit Timer0 und ATMega128

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.05.2006
    Beiträge
    27

    Problem mit Timer0 und ATMega128

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich habe versucht, auf meinem STK500 ein Lauflicht zu implementieren, bei dem die Verzögerungen mittels Timer0 erzeugt werden, mein Programmcode sieht wie folgt aus:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define SIG_CNT_LIMIT 10
    unsigned short i=0; /* count interrupt events */
    volatile int zaehler=1;
    int up=1;
    
    void init_timer0(void);
    
    
    ISR(TIMER0_COMP_vect)
    { 
    	i++;
    	/* Did the counter exceed the limit? */
    	if (i>=SIG_CNT_LIMIT ) 
    	{
    		i=0;
    		//PORTB = ~zaehler;
    		
    		if(up == 1)
    			zaehler = zaehler * 2;			//Zaehlerwert auf naechste LED erhoehen
    		else
    			zaehler = zaehler / 2;			//Zaehlerwert auf naechste LED erniedrigen
    		
    		if(zaehler == 128)				//um von der letzten LED rückwaerts zu laufen, up = 0
    			up = 0;
    		else if (zaehler == 1)			//um von der ersten LED wieder nach oben zu laufen
    			up = 1;
    	}
    }
    
    
    void init_timer0() 
    {
    	/* clear timer if timer value matches compare value. */
    	/* CTC Mode in Register TCCR0*/
    	TCCR0=(1<<WGM01)|(0<<WGM00);
    
    	/* set clock divider to "1024" at position CS00..02 */
    	TCCR0=(1<<CS02)|(1<<CS01)|(1<<CS00);
    	
    	/* set timer compare value to 0xFF (=255, 3.68MHz/1024/255)*/
    	OCR0=0xFF; /* highbyte of compare register */
    
    	/* enable compare1a interrupt in the interrupt mask register */
    	TIMSK=(1<<OCIE0);
    
    	/* reset current timer value */
    	TCNT0=0; /*Timer counter 0*/
    }
    
    
    /* This is the main function. */
    int main(void) 
    {
    	init_timer0();
    	DDRB = 0xFF; // all pins are output
    	DDRA = 0x00;	
    	PORTB=0xFF;
    	sei();
    	
    	for(;;) 
    	{
    		PORTB = ~zaehler;				//Ausgabe des aktuellen Zaehlerwertes
    	}
    }
    Bekomme beim erstellen zwar keinen Error, aber ich sehe auch kein Lauflicht, kann mir jemand sagen, woran es liegen kann?[/code]

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    bei init_timer0 setzt Du erst die WGM0x Bits, in der 2. Zeile werden sie aber schon wieder gelöscht, also kein CTC mehr !

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    24.05.2006
    Beiträge
    27
    Hi,
    habe die beiden Zeilen jetzt durch folgende ersetzt:

    TCCR0=(1<<WGM01)|(0<<WGM00)|(1<<CS02)|(1<<CS01)|(1 <<CS00);

    Es tut sich aber trotzdem nichts!

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Was geht denn jetzt genau nicht, brennt keine, eine oder alle LEDs ?
    Ich hab das jetzt mal selber probiert, erst im Simulator, dann mit einem M32, da ich kein M128 hab, musste nur auf PortC umbauen, aber es läuft, das Licht, bei ca. 3.2MHz alle 0,8s die nächste LED.

    Jetzt bräuchten wir noch ein paar Infos, wie hast Du compiliert usw., da ich das STK500 auch nicht kenne, darf da jemand anders weitermachen.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    24.05.2006
    Beiträge
    27
    Hi,
    es fängt einfach keine LED zu leuchten an, wenn ich das Lauflicht mit for-Schleifen mache geht es, aber mit Timer nicht!

    ich kompiliere immer mit dem Make All vom Programmers Notepad, Makefile ist das selbe wie beim anderen Lauflicht, nur Name des .c Files geändert.

Berechtigungen

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

Solar Speicher und Akkus Tests