/* -------------------------------------------------------- demo.ino Demoprogramm fuer DS3231 Echtzeituhr 29.11.2025 R. Seelig -------------------------------------------------------- */ #include "v003_rtc.h" #include "my_printf.h" #include "v003_i2c_hw.h" I2C i2c(400000); // I2C Hardware RTC_DS rtc; // die RTC-Echtzeituhr #define printf my_printf /* -------------------------------------------------- my_putchar für my_printf -------------------------------------------------- */ void my_putchar(char ch) { Serial.print(ch); } /* -------------------------------------------------- dez2bcd -------------------------------------------------- */ uint8_t dez2bcd(uint8_t value) { uint8_t hiz = value / 10; uint8_t loz = value - (hiz*10); return (hiz << 4) | loz; } /* -------------------------------------------------- UART Funktionen -------------------------------------------------- */ /* ---------------------------------------------------------- uart_getchar wartet, bis auf der seriellen Schnittstelle ein Zeichen eingegangen ist und liest dieses ein. Rueckgabe: gelesenes Zeichen ---------------------------------------------------------- */ uint8_t uart_getchar(void) { while (!(USART1->STATR & USART_FLAG_RXNE)); return USART1->DATAR; } /* ---------------------------------------------------------- uart_ischar testet, ob auf der seriellen Schnittstelle ein Zeichen eingegangen ist, liest dieses aber nicht ein Rueckgabe: 1 : es ist ein Zeichen eingetroffen 0 : kein Zeichen verfuegbar ---------------------------------------------------------- */ uint8_t uart_ischar(void) { return (USART1->STATR & USART_FLAG_RXNE); } /* ---------------------------------------------------------- uart_readline liest Asciizeichen in ein Char-Array ein. Es erfolgt ein Echo bei der Eingabe. Returntaste oder ein ueber- schreiten der Maximalanzahl der Zeichen beendet die Funktion Uebergabe: *txbuffer : Zeiger auf das Array, in das eingelesen werden soll. maxlen : maximale Anzahl einzulesender Zeichen ---------------------------------------------------------- */ void uart_readline(char *txbuffer, int maxlen) { int cx = 0; uint8_t ch; do { ch = uart_getchar(); Serial.print((char)ch); if (cx < (maxlen-1)) { if ((ch=='\n')||(ch=='\r')||(cx==maxlen)) *txbuffer = 0; else *txbuffer = ch; cx++; txbuffer++; } } while ((ch != '\n') && (ch != '\r') && (cx < maxlen)); } /* -------------------------------------------------- Uhrzeit anzeigen -------------------------------------------------- */ void uhr_showtime(void) { struct my_datum date; char tagnam[7][3] = {"So","Mo","Di","Mi","Do","Fr","Sa"}; date = rtc.readdate(); printf("\r %s ", tagnam[date.dow]); printf("%x.%x.20%x %x.%x:%x ", date.tag, date.monat, date.jahr, date.std, date.min, date.sek); } /* -------------------------------------------------- Uhr stellen -------------------------------------------------- */ void uhr_stellen(void) { struct my_datum date; char txbuf[128]; char *ptr; uint8_t b; printf("\n\r ------------------------------"); printf("\n\r Stellen der Realtimeclock"); printf("\n\r ------------------------------\n\r"); printf("\n\r Eingabe eines Uhrzeit-Datumstrings im Format: 'Tag#Monat#Jahr#Stunde#Minute#Sekunde"); printf("\n\r Beispiel fuer 29.11.2025 15:57:12: 29#11#25#15#57#12\n\r"); printf("\n\r Datumseingabe: "); uart_readline(txbuf, 100); ptr = strtok(txbuf, "#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.tag=b; ptr = strtok(NULL,"#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.monat=b; ptr = strtok(NULL,"#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.jahr=b; ptr = strtok(NULL,"#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.std=b; ptr = strtok(NULL,"#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.min=b; ptr = strtok(NULL,"#"); if(!ptr){ printf("\n\r --> Fehler! \n\n\r"); return; } b= dez2bcd(atoi(ptr)); date.sek=b; rtc.writedate(&date); } /* -------------------------------------------------- Uhr Control Menü -------------------------------------------------- */ void uhr_ctrl(void) { char ch; struct my_datum date; uint8_t oldsek; ch = 0; oldsek = 0; delay(50); date = rtc.readdate(); oldsek = date.sek - 1; while(1) { printf("\n\n\r ----------------------------------\n\r"); printf( " DS3231 RTC\n\r"); printf( " ----------------------------------\n\n\r"); printf( " (z) Zeige Uhrzeit\n\r"); printf( " (s) Uhr stellen\n\n\r"); ch = uart_getchar(); switch(ch) { case 's': uhr_stellen(); break; case 'z': do { ch = 0; if(uart_ischar()) ch = uart_getchar(); delay(10); date = rtc.readdate(); if(oldsek != date.sek) { uhr_showtime(); oldsek = date.sek; } }while(!ch); break; default: break; } } } /* -------------------------------------------------- Setup / Loop -------------------------------------------------- */ void setup() { Serial.begin(115200); i2c.begin(); rtc.begin(); } void loop() { uhr_ctrl(); printf("\n\r"); }