Archiv verlassen und diese Seite im Standarddesign anzeigen : 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
Wer kann das wissen ?
Poste bitte deine Source
#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
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.
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~
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.