ATtiny45, 85 - timer1 generuje nepravidelný časový interval

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)
  ;

}
}

:arrow_right: administrator: přejmenováno z "ATtiny45, 85 - timer1 problem"

Obdobná věc se mi přihodila na tiny2313 u externího přerušení. Řešení bylo stejné :slight_smile:. Ovšem rozhodně to nebylo tím, že by byla obsluha krátká…

Ale toto nenuluje příznak přerušení.
Příznaky se nulují zapsáním “1”.
Příkaz TIFR=0 by teoreticky neměl mít na příznaky žádný vliv.

Svatá pravda (kód jsem nelouskal…).

Ale ked je tam “TIFR = 0x04;”

robi to toto (aj ked tam nie je nic):
TIFR_04.jpg