witam, piszę program metronomu i potrzebuję dokładny pomiar czasu.
zauważyłem jednak że cały czas nie mogę uzyskać dokładnego odmierzania, ustawiam np. 60 taktow na minutę, a otrzymuję ok.63 (mierzyłem kilkakrotnie stoperem).
próbowałem z różnymi preskalerami i zawsze program się spieszy.
załączam prosty testowy program jako przykład. diody mają się zapalać na sekundę i gasnąć na sekundę (też program się "spieszy" )
czy może to być wina kwarcu (8MHz)?
zauważyłem jednak że cały czas nie mogę uzyskać dokładnego odmierzania, ustawiam np. 60 taktow na minutę, a otrzymuję ok.63 (mierzyłem kilkakrotnie stoperem).
próbowałem z różnymi preskalerami i zawsze program się spieszy.
załączam prosty testowy program jako przykład. diody mają się zapalać na sekundę i gasnąć na sekundę (też program się "spieszy" )
czy może to być wina kwarcu (8MHz)?
#include <avr\io.h>
#include <inttypes.h>
#include <avr\signal.h>
#include <avr\interrupt.h>
// Definicje wyprowadzeń
#define LED_A 4
#define LED_B 3
#define LED_C 5
#define LED_D 2
#define LED_E 6
#define LED_F 0
#define LED_G 7
#define LED_DP 1
#define LEDPORT PORTB
#define LEDDDR DDRB
#define COM1 5
#define COM2 4
#define COM3 3
#define COM4 2
#define COMPORT PORTD
#define COMDDR DDRD
#define SWPORT PORTE
#define SWDDR DDRE
#define SWPIN PINE
#define SW1 0
#define SW2 2
#define BPMDDR DDRA
#define BPMPORT PORTA
#define BUZZ 0
#define D1 1
#define D2 2
uint8_t t=0;
SIGNAL(SIG_OVERFLOW1)
{
//TCNT1 = (0xFFFF - 31250);
TCNT1L =0xEE;
TCNT1H =0x85;
if (t==0) {
COMDDR = 0x00;
t=1;
} else {
COMDDR = 1<<COM1;
t=0;
}
}
int main(void)
{
LEDDDR = 1<<LED_A | 1<<LED_D;
// Timer1 16-bit
//TCNT1 = (0xFFFF - 31250); // Wartość początkowa
TCNT1L =0xEE;
TCNT1H =0x85;
TCCR1B = 1<<CS12; // Preskaler 256
TIMSK = 1<<TOIE1;
sei();
COMDDR = 1<<COM1;
while(1) {
}
}