Nabend zusammen,
Hab nen ATMEGA32 mit dem ich gerne erst mal nur eine Uhr realisieren möchte.
Hab dafür den Timer2 mit 32768Khz laufen und sollte somit doch eigentlich
eine ziemlich genau Uhr haben oder? Habe aber nach ca. 12 Std. eine Verzögerung von 5 Sek.
Könnte einer mal den Code überprüfen, bin noch ziemlich grün hinter den Ohren was C angeht :/.
Code:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 8000000
#endif
#include "ks0108.h"
#include "font12x16.h"
#include "font6x8.h"
volatile int sek=0;
volatile int min=0;
volatile int std=0;
int main(void) {
cli();
TIMSK &=~(1<<TOIE2);
ASSR = (1<<AS2);
TCNT2 = 0;
TCCR2 |= (1<<CS22) | (1<<CS20);
while((ASSR & 0x01) | (ASSR & 0x04));
TIFR = 0xFF;
TIMSK |=(1<<TOIE2);
sei();
PORTC = 0xff;
PORTC |= (1<<PC1);
struct font largeFont, smallFont;
unsigned char sek2[5];
unsigned char min2[5];
unsigned char std2[5];
ks0108Init();
largeFont.width = FONT12X16_WIDTH;
largeFont.height = FONT12X16_HEIGHT;
largeFont.charData = Font12x16;
smallFont.width = FONT6X8_WIDTH;
smallFont.height = FONT6X8_HEIGHT;
smallFont.charData = Font6x8;
while(1)
{
itoa(sek,sek2,10);
itoa(min,min2,10);
itoa(std,std2,10);
ks0108GotoXY(0,0);
ks0108PutString(sek2,smallFont);
ks0108GotoXY(0,10);
ks0108PutString(min2, smallFont);
ks0108GotoXY(0,20);
ks0108PutString(std2, smallFont);
}
return 0;
}
ISR(TIMER2_OVF_vect) {
sek++;
ks0108Init();
if (sek>59)
{
min++;
sek=0;
}
if (min>59)
{
std++;
min=0;
}
if (std>23)
{
std=0;
min=0;
sek=0;
}
}
Für Tips und Verbesserungen wäre ich dankbar
Mfg Mel
Lesezeichen