Podivne problemy s casovanim na ATmega8

Pavel Hudecek edizon na seznam.cz
Úterý Září 18 14:39:28 CEST 2012


Dobrý den všem,
mějme následující kód:

volatile unsigned int   ms=0;
volatile unsigned long  sekundy=0;
volatile bit            msSync=0, sekSync=0, adSync=0;
unsigned char           dispJas;     // jas displeje 0-3

void cekej(unsigned int n) {
  ms=0;
  while(ms<n) {
//    #include <cekani.c>
  }
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
  static unsigned short ms1;
  static unsigned char  jasCnt;

  TCNT0=256-125;
  ms++; msSync=1;
  if (++ms1>=1000) {ms1=0; sekundy++; sekSync=1;}
  if (++jasCnt>3) jasCnt=0;
  if ((jasCnt<dispJas)|dispJas==3) DISP_bl=1; else DISP_bl=0;
}

Procesor běží na interním oscilátoru 8 MHz, do časovače jde 125 kHz. 
Přerušení by tak mělo nastávat každou ms. tento zpsob čekání jsem bez 
problémů využíval i dříve, vlastně skoro všude. Tentokrát se ovšem dějou 
divné věci. Funkce cekej někdy trvá viditelně kratší dobu, než je požadováno 
(400 ms) a při té příležitosti poblikne podsvícení displeje.

Čím to může být?

PH 



Další informace o konferenci Hw-list