PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer 1 will keine kurzen Interrupts



ebb
19.01.2006, 19:09
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

PicNick
20.01.2006, 06:52
Wer kann das wissen ?
Poste bitte deine Source

ebb
20.01.2006, 13:10
#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

xanadu
20.01.2006, 14:32
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.

ebb
20.01.2006, 14:59
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~