Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > Es ist ein ziemlicher Scheissfehler, wenn man ein Messprogramm laufen lässt und am Ende feststellt, > dass einem 30min abgehen. Den Zeitaufwand um den Fehler zu finden, brauch ich wohl nicht > erwähnen. > > Zum Fehler: > Die Funktion LCD_WriteText() lässt die Echtzeituhr langsamer laufen, ca. 33sec pro Stunde, wenn die > Funkt. jede Sekunde aufgerufen wird. > Was treibt die Funktion mit Timer2, der ja nur für die Systemzeit zuständig ist??? > > > Anbei das Demoprogramm LCD-Uhr, die Funkt. LCD_Ausgabe() am Schluss habe ich eingefügt um > den Fehler zu reproduzieren. > > > > > > > > // LCD_Uhr_1: LCD-Uhr (Anzeigeformat "13:47:24") > // LED1 blinkt mit 1Hz > // erforderliche Library: IntFunc_Lib.cc, LCD_Lib.cc > > // Auf dem Display wird eine LCD-Uhr im Anzeigenformat "13:47:24" dargestellt. > // Zeitbasis 10ms Interrupt mit Zeitkorrektur > > byte cnt1; // globale Variablendeklaration > byte Sekunde, Minute, Stunde; // globale Variablendeklaration > > //------------------------------------------------------------------------------ > // Zeichenausgabe > // > void Write2Digits(byte pos,byte val) > { > char num[3]; > > LCD_CursorPos(pos); // LCD Cursor positionieren > Str_WriteWord(val,10,num,0,2); // Zahl mit Basis 10, Offset 0, 2 stellig in String schreiben > LCD_WriteText(num); // String ausgeben > } > > //------------------------------------------------------------------------------ > // Ausgabeformat der Uhr festlegen > // > void Display_Time(void) > { > Write2Digits(0,Stunde); // Stunde > LCD_WriteChar(':'); > Write2Digits(3,Minute); // Minute > LCD_WriteChar(':'); > Write2Digits(6,Sekunde); // Sekunde > } > > //------------------------------------------------------------------------------ > // Zeitberechnung > // > void RTC(void) > { > cnt1++; // 10ms Zähler erhöhen > if (cnt1==50) > { > Port_WriteBit(PORT_LED1,PORT_OFF); // LED1 ausschalten > } > if (cnt1==100) > { > Port_WriteBit(PORT_LED1,PORT_ON); // LED1 einschalten > Display_Time(); // Funktionsaufruf: Display_Time > > LCD_Ausgabe(); > > Sekunde++; > if (Sekunde==60) > { > Sekunde=0; > Minute++; > if (Minute==60) > { > Minute=0; > Stunde++; > if (Stunde==24) Stunde=0; > } > } > cnt1=0; > } > } > > //------------------------------------------------------------------------------ > // Interrupt alle 10ms > // > void INT_10ms(void) > { > int irqcnt; > > RTC(); // Funktionsaufrauf: RTC > irqcnt=Irq_GetCount(INT_TIM2COMP); // Interrupt Request Counter > } > > //------------------------------------------------------------------------------ > // Hauptprogramm > // > void main(void) > { > LCD_Init(); // Display initialisieren > LCD_ClearLCD(); // Display löschen > LCD_CursorOff(); // Display Cursur ausschalten > > cnt1=0; > > Port_DataDirBit(PORT_LED1,PORT_OUT); // LED1 auf Ausgabe vorbereiten > Port_WriteBit(PORT_LED1,PORT_OFF); // LED1 ausschalten > Sekunde=00; // Startzeit festlegen z.B. 12:25:00 > Minute=00; > Stunde=00; > Irq_SetVect(INT_TIM2COMP,INT_10ms); // Interrupt Service Routine definieren > while (1); // Endlosschleife, hier können weitere > // Anweisungen stehen > } > > > > //------------------------------------------------------------------------------------- > void LCD_Ausgabe(void) // wird jede Sekunde aufgerufen > { > char text[10]; > text="ABCDEFGH"; > LCD_CursorPos(0x40); // Verzögert die RTC > LCD_WriteText(text); > > > }