ATmega16 stopky - nastavení čítače

Zdravím, dělám projekt stopky s Atmega16 a chci si zde ověřit zda mám správně nastavený čítač. V obvodu mám 16 MHz krystal. Čítač je nastaven v CTC modu. A počet cyklů jsem vypočítal podle jednoho tutoriálu.

solarskit.wz.cz/avrprogramming.html

Chci aby se čítač inkrementoval každou ms, z toho vyplývá výpočet 1ms / 62,5 ns = 16000 cyklů a požil jsem 64predděličku, tak že 16000/64 = 250.

pokud vše chápu správně mělo by to být v pořádku :slight_smile:

Zde je kod:

[code]/*

  • stopky.c
  • Created: 22.12.2016 17:13:33
  • Author: User
    */

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

volatile uint16_t msec = 0; // milisekundy
volatile uint8_t sec = 0; // sekundy
volatile uint8_t min = 0; // minuty
volatile uint8_t start_stop_znak = 0; // nastavení start/stop

void tlacitka_beh(void);

int main(void)
{

//------------------------------------------------------------------>porty

DDRD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4)); // nastavení vstupu start/stop/reset
PORTD |= (1 << PD2) | (1 << PD3) | (1 << PD4) ; // nastavení pull up rezistoru





//-------------------------------------------------------------------->časovač 

TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS01); // CTC mod a 64 dělička
TIMSK | = (1 << TOIE0); // přerušení při přetečění TCNT0  

OCR0 = 249;     // porovnavaci registr
TCNT0 = 0x00;

sei(); // povolí globální přerušení 


while(1)
{
    
	//volani fci + multiplexni spinani dopsat 
	tlacitka_beh();
		
}

}

ISR(TIMER0_COMP_vect)
{
if(start_stop_znak)
msec++;

if(msec >= 1000) // 1000 ms = 1 s 
{
	msec = 0;
	sec++;	
}	

if(sec >= 60) // 60 s = 1 m 
{
	sec = 0;
	min++;
}

if(min >= 100) // max 100 m
{
	min = 0;
}

}

void tlacitka_beh(void){

if((PIND & (1 << PD2)) == 0) //stisk start
{
	start_stop_znak = 1;
	TCCR0 |= (1 << CS00) | (1 << CS01);
}




if((PIND & (1 << PD3)) == 0) //stisk stop
{
	start_stop_znak = 0;
	TCCR0 &= ~((1 << CS00) | (1 << CS01)); //zastavení čítače
}



if((PIND & (1 << PD4)) == 0) //stisk reset
{
	start_stop_znak = 0;
	TCCR0 &= ~((1 << CS00) | (1 << CS01));
	msec = 0;
	sec = 0;
	min = 0;
	TCNT0 = 0;
}

return;

}[/code]