Zaujimavy problem: Casovy interval generovany casovacom1 bol nepravidelny!!!
Uvadzam ucelovo zjednoduseny zdrojovy kod - striedanie 0/1 na PB0.
Problem sa odstranil pridanim nulovania priznaku prerusenia. Ak bola obsluha prerusenia prilis rychla (kratky kod), k jeho vynulovaniu nedoslo a prerusenie bolo vzapati vyvolane druhy krat… A takto to robilo nahodne!!!
#include <iot45v.h>
#include <macros.h>
#define SetTimer1ms(Time) _CLI(); Timer1ms = Time; _SEI()
volatile unsigned int Timer1ms = 0;
#pragma interrupt_handler timer1_ovf_isr: iv_TIMER1_OVF
void timer1_ovf_isr (void)
{
TIFR = 0x00; // it is not working without this…
if (Timer1ms)
Timer1ms --;
}
void main (void)
{
DDRB = 0x01; // PB0 output
TCCR1 = 0xC4; // CTC1 = 1, PWM1A = 1, CS = CK / 8
OCR1C = 0xFF;
TIMSK = 0x04; // TOIE1 = 1
SEI();
while (1)
{
PORTB = 0x00;
SetTimer1ms (500);
while (Timer1ms)
;
PORTB = 0x01;
SetTimer1ms (500);
while (Timer1ms)
;
}
}
administrator: přejmenováno z "ATtiny45, 85 - timer1 problem"