PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer1 Läuft nicht richtig



DeltaEx
14.01.2006, 19:47
Hallo Leute,

ich baue eine Uhr die Relativ genau gehen soll.
Mit dem Sourcecode ist eine Sekunde leider 16 Sekunden lang ;-(
Was mache ich falsch?
Benutze einen ATINY2313-20PU mit 16 Mhz extern Quarz.

Danke für die hilfe

Hier der Sourcecode:





#include <main.h>
#include <lcd.c>


uint8_t second=0;
uint8_t secled=0;
uint8_t minute=0;
uint8_t hour=0;

SIGNAL (SIG_OVERFLOW1)
{
second ++;
if(second == 60)
{
second = 0;
minute ++;
};
if(minute == 60)
{
minute = 0;
hour ++;
};
if(hour == 24)
{
hour = 0;
};

};

//Hauptprogramm
int main (void)
{

DDRD = 0x00; /* alle Pins von Port D als Eingang */
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */

//Initzialisierung des LCD - Displays
LCD_Init();
LCD_Print(1,0,"Clock");

OCR1AL = 0x09;
OCR1AH = 0x3d;
TCNT1L = 0xf7;
TCNT1H = 0xc2;
TCCR1B |= (1<<CS10)|(1<<CS12); //1024
TIMSK |= (1 << TOIE1);
sei();

unsigned char count;
//Hauptprogramm läuft ständig in einer schleife
while (1)
{
/* if ( !(PIND & (1<<PIND4)) ) {
count++;
{
if ( !(PIND & (1<<PIND5)) ) {
count--;
{ */
LCD_Print(0,1,"Time: %i:%i:%i",hour,minute,second);
}
return (1);
};


Kann das vielleicht sein das ich im Makefile AT90S2313 benutzte für den ATTINY2313? Weil man im MFile [WinAVR] keinen ATTINY2313 auswählen kann. ](*,)

DeltaEx
19.01.2006, 14:43
weiss keiner bescheid?

SprinterSB
23.01.2006, 17:19
Der Overflow-Interupt ist für sowas nicht geeignet, das Richtige Zeitintervall hast du nur beim ersten Mal, danach läuft der Zähler wieder zu 0 über. Du müsstest in der ISR von Hand TCNT1 neu sezuen, das ist ungenau. Schau mal ins Wiki:
https://www.roboternetz.de/wissen/index.php/Hallo_Welt_f%C3%BCr_AVR_%28Blinky%29