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]

A proč si to neověříš v simulátoru (AVR STUDIO) ?

Ja skôr nechápem, prečo túto tému založil 2x? … ale budiž, stalo sa, tak aspoň napíšem, že sa zadarilo, aby jedno bolo zmazané (nevim, či je možnosť to zmazať priamo tazateli).

Ale čo tak použiť googla (samozrejme mimo simulátora ako radíš Radius) a nájsť si avr timer calculator, alebo ak má smartfón, tak tam je tiež po … strašne veľa aplikácií, ako nastaviť registre aby to robilo to, čo má…

//píšem pomocou rýchlej odpovede, takže odkazy nedávam…