-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Timer hängt sich auf?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84

    Timer hängt sich auf?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi

    ich beschäftige mich mit dem Timer des Tiny2313.
    In meinem code versuche ich genau jede sekunde die Ausgänge des Port B auf high und in der nächsten wieder auf low zu setzten.

    Ich will das mit dem Timer (soll auch möglichst genau sein) machen (nicht sleep oder so). Der code compiliert fehlerfrei, allerdings bleibt er nach dem 1 durchgang beim Debuggen stehen.

    Habe ich was übersehen oder was ist los?
    Benutze ich den Timer überhaupt richtig? (habe mir das nur im tutorial auf mikrocontroller.net angesehen und extra bei keinem anderen projekt abgeschaut)

    Code:
    #define F_CPU 4096000
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <stdint.h>
    
    int16_t timer=0;
    int8_t status=0;
    
    
    void initTimer(void)
    {
    	TCCR0B |= (1<<CS00)|(1<<CS02);
    }
    
    void initInterrupts(void)
    {
    	sei();
    }
    
    ISR(TIMER1_OVF_vect)
    {
        timer=timer+1;
    }
    
    int main (void) 
    {
       initTimer();
       initInterrupts();
       DDRB = 0xff;
    
       while(1) 
       {                
    	if(timer>=4000)   //hier bleibt der Debugger erst beim 2ten durchgang der schleife stehen
    	{
    		timer=0;
    		if(status==0)
    		{
    		PORTB = 0xff;
    		status=1;
    		}
    		else
    		{
    		PORTB = 0x00;
    		status=0;
    		}
    	}
    
       }                       
       return 0;
    }
    Vielleicht sehe ich auch den wald vor bäumen einfach nicht
    wäre nett, wenn sich das jemand anschaut
    danke

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hi,

    da Du in TIMSK kein Bit gesetzt hast, kommt es nie zu einem Timer-Overflow-Interrupt.

    "Die genaue Sekunde".

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,
    Code:
       TCCR0B |= (1<<CS00)|(1<<CS02);
    ...
    ISR(TIMER1_OVF_vect)
    Welchen Timer benutzt du nochmal?

    Gruß

    Jens

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    hi
    danke erstmal

    beide fehler behoben
    neuer code:
    Code:
    #define F_CPU 4096000
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <stdint.h>
    
    int16_t timer=0;
    int8_t status=0;
    
    
    void initTimer(void)
    {
    	TCCR0B |= (1<<CS00)|(1<<CS02);
    	TCNT0 = 0;  
    	TIMSK |= (1<<TOIE0);
    }
    
    void initInterrupts(void)
    {
    	sei();
    }
    
    ISR(TIMER0_OVF_vect)
    {
        timer=timer+1;
    }
    
    int main (void) 
    {
       initTimer();
       initInterrupts();
       DDRB = 0xff;
    
       while(1) 
       {                
    	if(timer>=4000)
    	{
    		timer=0;
    		if(status==0)
    		{
    		PORTB = 0xff;
    		status=1;
    		}
    		else
    		{
    		PORTB = 0x00;
    		status=0;
    		}
    	}
    
       }                       
       return 0;
    }
    leider läuft der debugger nun die ganze zeit durch die interrupt funktion und setzt auch nicht den port bei einem timer größer als 4000 um (arbeitet die if funktion nicht ab).

    brauche also nochmal hilfe

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hi,

    <pre>volatile int16_t timer=0; </pre>

    MfG

    Fred
    Only entropy comes easy. - Anton Checkhov

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    stimmt

    allerdings bleibt er bei der if abfrage hängen

    if(timer>=4000)

    ich habe auch den wert 4000 mal tiefer angesetzt, daran liegt es aber auch nicht

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hi,

    "timer" ist immer noch nicht "volatile"!

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    verstehe ich jetzt nicht

    Code:
    #define F_CPU 4096000
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <stdint.h>
    
    volatile int16_t timer=0;
    volatile int8_t status=0;
    
    
    void initTimer(void)
    {
    	TCCR0B |= (1<<CS00)|(1<<CS02);
    	TCNT0 = 0;  
    	TIMSK |= (1<<TOIE0);
    }
    
    void initInterrupts(void)
    {
    	sei();
    }
    
    ISR(TIMER0_OVF_vect)
    {
        timer=timer+1;
    }
    
    int main (void) 
    {
       initTimer();
       initInterrupts();
       DDRB = 0xff;
    
       while(1) 
       {                
    	if(timer>=4)
    	{
    		timer=0;
    		if(status==0)
    		{
    		PORTB = 0xff;
    		status=1;
    		}
    		else
    		{
    		PORTB = 0x00;
    		status=0;
    		}
    	}
    
       }                       
       return 0;
    }

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo,

    Deine jetzige Version läuft bei mir im Simulator problemlos. Wenn ich "timer" auf 3 und einen Breakpoint in der ISR setze, springt der Inhalt von "timer" beim nächsten Durchlauf wieder auf 0. Dein Code funktioniert also wie gewünscht! "status" muss nicht "volatile" sein.

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    mhm
    beii mir setzt er den auf PORTB = 0xff;

    aber danach passiert nix mehr

    welche simulationssoftware verwendest du?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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