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
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]