-         

Ergebnis 1 bis 8 von 8

Thema: timer will nicht starten?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.08.2007
    Ort
    München
    Alter
    26
    Beiträge
    37

    timer will nicht starten?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo zusammen,

    Ich sitze schon seit gestern an diesem Problem rum...
    Warum will der Timer nicht inkrementieren?
    AVR Studio zeigt in der Simulation TCNT0 konstant 0x00 an...
    Und auf meinem STK500 gehts natürlich auch nicht.

    hier der komplette code:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    volatile uint8_t timer = 0; // Speichert den aktuellen Zählerwert
    
    ISR(TIMER0_OVF_vect)
    {
    	timer++;
    }
    
    void initTimer(void)
    {
    	// Initialisierung:
    	TIMSK |= (1<<TOIE0);					// Interrupt aktivieren
     	TCCR0A |= (1 << CS00 ) | (1 << CS02);	// Timer0 initialisierung, Vorteiler ist 1024
    	sei();
    }
    
    void initPorts(void)
    {
    	DDRB = 0xff; //PortB als Ausgang
    	PORTB = 0xff; // alle LEDs aus
    }
    
    int main()
    {
    initPorts();
    initTimer();
    
    while (1)
    {
    	PORTB = ~timer;
    	if(timer==255) timer=0;
    }
    return 0;
    }
    Ich hoffe Ihr könnt mir helfen...

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

    Was verwendest du für einen AVR, wegen der Register ?
    Wie schnell wird der AVR getaktet, wegen Timertakt ?
    Hast Du ausgerechnet wie lange es dauert bis der Timer das erstemal überläuft ?
    Die Abfrage nach 255 kannst Du dir bei einer 8Bit Variaben sparen, denn die kann nicht grösser werden, ebenso das return.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    zunächst es ist irgendein atmega mit 16bit-timer, soweit lieg ich doch richtig

    aber ich finde im mom echt nicht WELCHER das sein soll der timer0 als 16bit hat sonst kenn cih timer0 nur als 8bit und timer1 als 16bit

    jedenfalls hast du rund alle 1minute einen überlauf bei 1MHz takt

    16bit = ~56000
    1MHz / 16bit = ~17,9
    17,9 überschläge / 1024 prescaler = 0,0179 überschläge pro sekunde

    schraub ma den prescaler runter

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Es könnte ein Mega644 sein, der hat einen 8Bit Timer mit einem TCCR0A.
    Jedenfalls wird Deine "Timer" Variable vermutlich nicht hochgezählt, weil Du die Klammern des if-Befehls vergessen hast.
    Gruß

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    26.08.2007
    Ort
    München
    Alter
    26
    Beiträge
    37
    Es ist ein AtTiny2313 mit 4 MHz
    Timer0 ist ein 8-Bit timer
    Den timertakt hab ich nicht ausgerechnet, ich wollte nur erstmal dass er überhaupt zählt, und nachdem er das ja nicht tut, wird das irrelevant sein denk ich...

    wenn ich in einem unsigned char 255 +1 rechne, kommt dann 0 raus? Ich dachte immer, wenn nach einem If nur 1 Befehl steht, kann man die Klammern weglassen? (Sorry, bin kein C-Profi)

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

    uint8_t 255+1 wird zu 0, das ist richtig
    Bei einem Befehl benötigt man keine Klamme hinter der If-Bedingung, ist Geschmackssache und richtig.
    Schau im Datenblatt noch einmal nach zu welchem Register CS00 und CS02 gehören.

    Gruß

    Jens

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.08.2007
    Ort
    München
    Alter
    26
    Beiträge
    37
    ahja wieder dazugelernt

    CS00 CS01 und CS02 gehören zum Register TCCR0B... Aber ich dachte, nachdem TCCr0A und TCCR0A zum selben timer gehören wär das egal? im TCCR0A kann man auch den Prescaler nirgendwo einstellen...
    TCCR0A => COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00
    TCCR0B => FOC0A FOC0B – – WGM02 CS02 CS01 CS00

    Edit: klappt übrigens auch nicht, wenn ich in initTimer() statt TCCR0A TCCR0B schreibe...

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.08.2007
    Ort
    München
    Alter
    26
    Beiträge
    37
    WOW doch es klappt doch^^ Vielen Dank

Berechtigungen

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