- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Problem mit Timer und Atmega168

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2007
    Beiträge
    14

    Problem mit Timer und Atmega168

    Anzeige

    Powerstation Test
    Guten Abend zusammen

    Ich programmiere nun schon den ganzen Abend am Timer, doch aus unerklärlichen Gründen funktioniert das ganze nicht. Was ich machen will: Eine LED in (vorerst beliebigen Takt) blinken zu lassen.

    Folgende ausgangslage: Atmega168, interne Frequenz (8 Mhz, ausser ich hätte die Fusebits falsch gesetzt, ich glaube aber nicht).
    LED an PD2.
    Zuerst habe ich versucht, es nach dem Wiki von Roboternetz (und auch noch anderen Tutorials) zu programmiere, da bekam ich aber immer die Meldung vom Compiler, er kenne TCCR nicht.

    Also habe ich das Datenblatt zur Hand genommen und gesucht. Da habe ich andere Registernamen gefunden, mit denen funktioniert zwar das Compilieren, aber die LED bleibt auf AN.

    Code:
    #include <avr/interrupt.h>
    #include <avr/io.h>
    #define F_CPU 8000000
    
    volatile unsigned int counter0;
    
    ISR(SIG_OVERFLOW1)  //ISR
    {
    	counter0++;  //counter erhöhen
    }
    
    void init_interrupts(void)		//interrupt initialisieren
    {
    	TCCR1B |= (1<<CS00); //prescaler auf 64
    	TCCR1B |= (1<<CS01); //prescaler
    	
    	sei();
    	TIMSK1 |= (1<<TOIE1); //interrupts starten
    }
    
    inline void sleepms(uint16_t msec)
    {
    	uint16_t i;
    	for(i=0; i<msec; i++)
    	{
    		sleep(100);
    	}
    }
    
    inline void sleep (uint8_t t)
    {
    	counter0 = 0;
    	while (counter0 < t);
    }
    
    
    
    int main(void)
    {
    while(1)
    	{
    		DDRD |= (1<<PD2);
    		PORTD |= (1<<PD2); //LED einschalten
    		
    		sleepms(1000);
    		
    		PORTD &= ~(1<<PD2); //LED ausschalten
    		
    		sleepms(1000);
    		
    		return 0;
    	}
    }
    Hier noch der Code. Ich nehme an, dass der Interrupt nicht (richtig) startet.

    Ach ja, ich arbeite mit avr-gcc (falls es noch andere avr-c-compiler gibt, wüsste ich jetzt gar nicht) und avrdude unter Linux.

    Im voraus Danke, falls mir jemand helfen kann...

    Gruss Dave

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

    2. versuch

    die Function init_interrupts wird nicht aufgerufen, also läuft der Timer nicht !

    PS:
    Und auch mal das Fusebits CKDIV8 anschauen, das ist standardmäsig aktiviert, mit diesem wird der Takt nochmal durch 8 geteilt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2007
    Beiträge
    14
    Zuerst mal danke für die sowohl schnelle wie auch späte Antwort...

    Den Clock-Teiler habe ich deaktiviert, das hat auch funktioniert...

    Wegen der Warteschleife: Ich habe es mal kurz durchgelesen und werde es nun ausprobieren, aber irgendwo habe ich mal gelesen, man solle das nicht so machen (weiss nicht mehr wieso). Aber im Momment werde ich es wohl doch dabei belassen, so sollte es immerhin funktionieren...

    gruss Dave

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    11.03.2007
    Beiträge
    14
    Guten Morgen nochmals...

    So... mitlerweile funktioniert es.
    Code:
    #include <avr/io.h>
    //#include <inttypes.h>
    #define F_CPU 8000000  // 8 MHz
    #include <util/delay.h>
    
    void sleepms(unsigned int ms)
    /* delay for a minimum of <ms> */
    {
    	// we use a calibrated macro. This is more
    	// accurate and not so much compiler dependent
    	// as self made code.
            while(ms)
    		{
    			_delay_ms(0.96);
    			ms--;
            }
    }
    
    int main(void)
    {
    	while(1)
    	{
    		DDRD |= (1<<PD2);
    		
    		
    		PORTD |= (1<<PD2); //LED einschalten
    		
    		sleepms(1500);
    		
    		PORTD &= ~(1<<PD2); //LED ausschalten
    		
    		sleepms(500);
    		
    	}
    return 0;
    }
    Und nicht, dass ich noch Urheberrechtsprobleme bekomme: der Code ist grösstenteils vom tuxgraphics.org

    gruss dave

Berechtigungen

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

Labornetzteil AliExpress