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

Thema: Timer 1 will keine kurzen Interrupts

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.01.2006
    Beiträge
    60

    Timer 1 will keine kurzen Interrupts

    hi,
    ich habe mit mit AVRcalc und auch anderen tools die Variablen für nen 16Bit timer mit ca. 10ms errechnet.
    ich habe da ein prog geschrieben , das laufen müsste doch die Led blinkt immer lahmer als im Sekundentakt !!!!

    ich verwende nen Atmega 16 @6Mhz


    was ist da los ???

    Thx im voraus

    mfg ebb

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wer kann das wissen ?
    Poste bitte deine Source
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    04.01.2006
    Beiträge
    60
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    #include <avr/signal.h>
    
    
     volatile uint8_t stepcount=0;
    
    SIGNAL (SIG_OVERFLOW1)
    {
    	stepcount ++;
    	PORTD ^= (1<<PD0);
    
    	
    
    };
    
    
    int main(void)
    {
    	DDRD = 0xff;
    	DDRB = 0xff;
    	OCR1AL = 0x27;
    	OCR1AH = 0x09;
    	TCNT1L = 0xd9;
    	TCNT1H = 0xf6;
    	TIMSK |= (1 << TOIE1);
    	
    	TIMSK |= (1 << TOIE1);
    	TCCR1B |= (1<<CS12);  //256
    	//TCCR0 |= (1<<CS10)|(1<<CS12); //1024
    	//TCCR1B |= (1<<CS10)|(1<<CS11); //64
    	sei();
    	while(1)
    	{
    
    	if(stepcount == 0)
    	{
    		PORTB = 0x01;
    	};	
    	
    	if(stepcount == 1)
    	{
    		PORTB = 0x00;
    	};	
    
    	if(stepcount == 2)
    	{
    		PORTB = 0x02;
    	};
    
    	if(stepcount == 3)
    	{
    		PORTB = 0x00;
    		stepcount = 0;
    	};
    	
    
    
    
    	};
    
    }
    diese timings sind für 100ms

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.10.2005
    Ort
    Mönchengladbach
    Alter
    54
    Beiträge
    114
    Böse Falle. Der erste Zyklus wird durch das Setzen von TCNT1 100ms lang sein, danach tritt der SIG_OVERFLOW jedes Mal dann auf, wenn der Zähler komplet von 0 bis 65535 durchgelaufen ist.

    Schau mal im Datenblatt nach dem CTC Mode. Im Grunde musst du nur den passenden Mode wählen, den Prescaler einstellen und das Register ICR1 setzen.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    04.01.2006
    Beiträge
    60
    Danke für die Info , ich kam mit dem nicht ganz klar , jetzt hab ichs ganz einfahc gelöst, ich habe die 4 Timervariablen einfahc in die SIG_OVERFLOW1 schleife kopiert, jetzt funzts einwandfrei, da er bei jedem Overflow die Variablen neu setzt

    BIG THX nochmal

    ~closed~

Berechtigungen

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

LiFePO4 Speicher Test