Torrentula
20.10.2011, 18:05
Hallo RNler!
Ich habe vor eine Uhr zu bauen mithilfe meines RN-Control (nur testweise). Der Mega644 läuft mit 16MHz und ich verwende Timer0 im CTC modus mit Prescaler 8. Berechnet habe ich den Wert für das Compare-Register OCR0A folgendermaßen:
((16000000 / 8 ) / 1000) - 1 = 199
Ist da etwas falsch? In der ISR lasse ich nur millisekunden, sekunden, minuten und stunden inkrementieren / zurücksetzen. Trotzdem dauert für den Controller 1 Minute nur ungefähr 6 Sekunden^^. Mein Code sieht so aus:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "standards.h"
volatile unsigned int milliseconds;
volatile unsigned int seconds;
volatile unsigned int minutes;
volatile unsigned int hours;
char buffer[10];
int main(void)
{
init_USART();
senchar('v');
TCCR0A = (1<<WGM01); // CTC Mode of Timer 0
TCCR0B |= (1<<CS01); // Prescaler 8
// ((16000000 / 8) / 1000) = 200
OCR0A = 200-1; // to get 200 steps
TIMSK0 |= (1<<OCIE0A); // Enable compare interrupt
// global interrupt enable
sei();
DDRC |= 0x01;
PORTC |= 0x01;
while(1)
{
itoa(minutes, buffer, 10);
sendUSART(buffer);
}
}
// The compare match handler is called every time
// TCNT0 = OCR0A = 200 - 1 (200 steps) which gives us
// exactly 1ms
ISR (TIMER0_COMPA_vect){
milliseconds++;
if(milliseconds == 1000){
seconds++;
milliseconds = 0;
if(seconds == 60){
minutes++;
seconds = 0;
}
if(minutes == 60){
hours++;
minutes = 0;
}
if(hours == 24){
hours = 0;
}
}
}
MfG
Torrentula
Ich habe vor eine Uhr zu bauen mithilfe meines RN-Control (nur testweise). Der Mega644 läuft mit 16MHz und ich verwende Timer0 im CTC modus mit Prescaler 8. Berechnet habe ich den Wert für das Compare-Register OCR0A folgendermaßen:
((16000000 / 8 ) / 1000) - 1 = 199
Ist da etwas falsch? In der ISR lasse ich nur millisekunden, sekunden, minuten und stunden inkrementieren / zurücksetzen. Trotzdem dauert für den Controller 1 Minute nur ungefähr 6 Sekunden^^. Mein Code sieht so aus:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "standards.h"
volatile unsigned int milliseconds;
volatile unsigned int seconds;
volatile unsigned int minutes;
volatile unsigned int hours;
char buffer[10];
int main(void)
{
init_USART();
senchar('v');
TCCR0A = (1<<WGM01); // CTC Mode of Timer 0
TCCR0B |= (1<<CS01); // Prescaler 8
// ((16000000 / 8) / 1000) = 200
OCR0A = 200-1; // to get 200 steps
TIMSK0 |= (1<<OCIE0A); // Enable compare interrupt
// global interrupt enable
sei();
DDRC |= 0x01;
PORTC |= 0x01;
while(1)
{
itoa(minutes, buffer, 10);
sendUSART(buffer);
}
}
// The compare match handler is called every time
// TCNT0 = OCR0A = 200 - 1 (200 steps) which gives us
// exactly 1ms
ISR (TIMER0_COMPA_vect){
milliseconds++;
if(milliseconds == 1000){
seconds++;
milliseconds = 0;
if(seconds == 60){
minutes++;
seconds = 0;
}
if(minutes == 60){
hours++;
minutes = 0;
}
if(hours == 24){
hours = 0;
}
}
}
MfG
Torrentula