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:
MfGCode:#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; } } }
Torrentula







Zitieren

Lesezeichen