Hello once again to everyone. I am now planning to create a RTC timer using DS1307 RTC chip and Atmega16 I have come a long way though but requires a little help in Avr Eeprom. I know how to use the Eeprom but the code which i found out on the internet use something i didn't understand i tried but didn't really know why this thing is here. This code uses four address of the eeprom to store the startHr, startMin, stopHr and stopMin but what this coder has used to update these blocks is tough for me to understand for example i did'nt know why he has stored 0xaa55 in the eeprom.Please help.
#ifndef F_CPU #define F_CPU 8000000UL #endif #include <stdio.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> #include <util/delay.h> #include "main.h" #include "LCD_4bit.h" #include "i2c_routines.h" #include "RTC_routines.h" void port_init(void) { PORTB = 0x00; // DDRB = 0x3f; //6 o/p pins for LCD PORTC = 0x00; DDRC = 0x00; PORTD = 0x1c; //pull-up enables for 3 pushbuttons DDRD = 0xe2; //2 o/p for relays, 1 o/p for LED, 1 o/p for TXD and 3 i/p for pushbuttons } //****** Function to update EEPROM with new set time ******* void updateEEPROM (void) { eeprom_write_byte((uint8_t*)10, startHr); eeprom_write_byte((uint8_t*)12, startMin); eeprom_write_byte((uint8_t*)14, stopHr); eeprom_write_byte((uint8_t*)16, stopMin); eeprom_write_word((uint16_t*)20, 0xaa55); //why this is here? } //***** Function to respond to any button-press during RTC set******* void buttonResponseRTC(void) { if(SET_PRESSED) { switch(screen) { case 0: sprintf(line2, "Date: %02x ", DATE); screen = 1; break; case 1: sprintf(line2, "Month: %02x ", MONTH); screen = 2; break; case 2: sprintf(line2, "Year: 20%02x ", YEAR); screen = 3; break; case 3: sprintf(line2, "Hour: %02x ", HOURS); screen = 4; break; case 4: sprintf(line2, "Minute: %02x ", MINUTES); screen = 5; break; case 5: SECONDS = 0; screen = 6; break; default:break; } } if(UP_PRESSED) { switch(screen) { case 1: DATE++; if((DATE % 16) == 0x0a) DATE += 0x06; if(DATE >= 0x32) DATE = 0x01; sprintf(line2, "Date: %02x ", DATE); break; case 2: MONTH++; if(MONTH == 0x0a) MONTH = 0x10; if(MONTH >= 0x13) MONTH = 0x01; sprintf(line2, "Month: %02x ", MONTH); break; case 3: YEAR++; if((YEAR % 16) == 0x0a) YEAR += 0x06; if(YEAR >= 0xa0) YEAR = 0x01; sprintf(line2, "Year: 20%02x ", YEAR); break; case 4: HOURS++; if(HOURS == 0x0a) HOURS = 0x10; if(HOURS == 0x1a) HOURS = 0x20; if(HOURS >= 0x24) HOURS = 0x00; sprintf(line2, "Hour: %02x ", HOURS); break; case 5: MINUTES++; if((MINUTES % 16) == 0x0a) MINUTES += 0x06; if(MINUTES >= 0x60) MINUTES = 0x00; sprintf(line2, "Minute: %02x ", MINUTES); break; default:break; } } if(DWN_PRESSED) { switch(screen) { case 1: DATE--; if(DATE == 0x00) DATE = 0x31; else if((DATE % 16) == 0x0f) DATE -= 0x06; sprintf(line2, "Date: %02x ", DATE); break; case 2: MONTH--; if(MONTH == 0x00) MONTH = 0x12; else if(MONTH == 0x0f) MONTH = 0x09; sprintf(line2, "Month: %02x ", MONTH); break; case 3: if(YEAR == 0x00) YEAR = 0x99; else YEAR--; if((YEAR % 16) == 0x0f) YEAR -= 0x06; sprintf(line2, "Year: 20%02x ", YEAR); break; case 4: if(HOURS == 0) HOURS = 0x23; else HOURS--; if(HOURS == 0x1f) HOURS = 0x19; if(HOURS == 0x0f) HOURS = 0x09; sprintf(line2, "Hour: %02x ", HOURS); break; case 5: if(MINUTES == 0) MINUTES = 0x59; else MINUTES --; if((MINUTES % 16) == 0x0f) MINUTES -= 0x06; sprintf(line2, "Minute: %02x ", MINUTES); break; default:break; } } } //***** Function to respond to any button-press during timer set******* void buttonResponse(void) { if(SET_PRESSED) { switch(screen) { case 0: sprintf(line2, "S:%02x:%02x E:%02x:%02x", startHr, startMin, stopHr, stopMin); screen = 1; break; case 1: screen = 0; break; case 2: sprintf(line2, "Start Min: %02x ", startMin); screen = 3; break; case 3: sprintf(line2, "Stop Hour: %02x ", stopHr); screen = 4; break; case 4: sprintf(line2, "Stop Min: %02x ", stopMin); screen = 5; break; case 5: updateEEPROM(); LCD_DisplayString_F(2,1,PSTR("Time updated! ")); _delay_ms(1000); screen = 0; break; default:break; } } if(UP_PRESSED) { switch(screen) { case 1: sprintf(line2, "Start Hour: %02x ", startHr); screen = 2; break; case 2: startHr++; if(startHr >= 0x24) startHr = 0x00; if(startHr == 0x0a) startHr = 0x10; if(startHr == 0x1a) startHr = 0x20; sprintf(line2, "Start Hour: %02x ", startHr); break; case 3: startMin += 0x05; if((startMin % 16) == 0x0a) startMin += 0x06; if(startMin >= 0x60) startMin = 0x00; sprintf(line2, "Start Min: %02x ", startMin); break; case 4: stopHr++; if(stopHr >= 0x24) stopHr = 0x00; if(stopHr == 0x0a) stopHr = 0x10; if(stopHr == 0x1a) stopHr = 0x20; sprintf(line2, "Stop Hour: %02x ", stopHr); break; case 5: stopMin += 0x05; if((stopMin % 16) == 0x0a) stopMin += 0x06; if(stopMin >= 0x60) stopMin = 0x00; sprintf(line2, "stop Min: %02x ", stopMin); break; default:break; } } if(DWN_PRESSED) { switch(screen) { case 1: sprintf(line2, "Start Hour: %02x ", startHr); screen = 2; break; case 2: if(startHr == 0) startHr = 0x23; else startHr--; if(startHr == 0x1f) startHr = 0x19; if(startHr == 0x0f) startHr = 0x09; sprintf(line2, "Start Hour: %02x ", startHr); break; case 3: if(startMin == 0) startMin = 0x55; else startMin -= 0x05; if((startMin % 16) == 0x0b) startMin -= 0x06; sprintf(line2, "Start Min: %02x ", startMin); break; case 4: if(stopHr == 0) stopHr = 0x23; else stopHr--; if(stopHr == 0x1f) stopHr = 0x19; if(stopHr == 0x0f) stopHr = 0x09; sprintf(line2, "stop Hour: %02x ", stopHr); break; case 5: if(stopMin == 0) stopMin = 0x55; else stopMin -= 0x05; if((stopMin % 16) == 0x0b) stopMin -= 0x06; sprintf(line2, "stop Min: %02x ", stopMin); break; default:break; } } } //call this routine to initialize all peripherals void init_devices(void) { port_init(); // UART_init(); LCD_init(); twi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; } //set stream pointer for using printf, scanf //FILE uart_str = FDEV_SETUP_STREAM(transmitByte, receiveByte, _FDEV_SETUP_RW); int main(void) { uint8_t prevSec; _delay_ms(100); init_devices(); _delay_ms(10); //stdin = stdout = &uart_str; //redirecting stdio to uart LCD_DisplayString_F(1,1,PSTR("Welcome!")); line1[16] = '\0'; line2[16] = '\0'; screen = 0; prevSec = 0; RELAY1_OFF; RELAY2_OFF; LED_OFF; relayON = 0; if(eeprom_read_word((uint16_t*)20) != 0xaa55) //i want to know what is the use of this 0xaa55 { startHr = 0x12; startMin = 0x25; stopHr = 0x13; stopMin = 0x05; updateEEPROM(); } else // and how this block helped in updating of eeprom { startHr = eeprom_read_byte((uint8_t*)10); startMin = eeprom_read_byte((uint8_t*)12); stopHr = eeprom_read_byte((uint8_t*)14); stopMin = eeprom_read_byte((uint8_t*)16); } //printf_P(PSTR("-- RELAY TIMER --\n\n")); //printf("\nStart Time: %02x:%02x", startHr, startMin); //printf("\nStop Time : %02x:%02x", stopHr, stopMin); //RTC_read(); //printf("\nCrrent Date: %02x:%02x Current Time: %02x:%02x", DATE, MONTH, HOURS, MINUTES); if(SET_PRESSED) { _delay_ms(20); if(SET_PRESSED) { LCD_DisplayString_F(1, 1, PSTR("RTC Setting.. ")); RTC_read(); while(screen != 6) { if(ANY_BUTTON_PRESSED) { _delay_ms(20); //key debouncing delay if(ANY_BUTTON_PRESSED) buttonResponseRTC(); while(ANY_BUTTON_PRESSED); LCD_DisplayString (2, 1, line2); } _delay_ms(20); //loop delay of 20msec } } RTC_writeTime(); RTC_writeDate(); screen = 0; _delay_ms(40); } while(1) { RTC_read(); if(!relayON) { if((rtc_register[2] == startHr) && (rtc_register[1] == startMin)) { RELAY1_ON; RELAY2_ON; LED_ON; relayON = 1; } } else { if((rtc_register[2] == stopHr) && (rtc_register[1] == stopMin)) { RELAY1_OFF; RELAY2_OFF; LED_OFF; relayON = 0; } } if(SECONDS != prevSec) { sprintf(line1,"%02x/%02x %02x:%02x:%02x ", DATE, MONTH, HOURS, MINUTES, SECONDS); if(screen == 0) { if(relayON) sprintf(line2,"O/P: ON "); else sprintf(line2,"O/P: OFF "); } LCD_DisplayString (1, 1, line1); LCD_DisplayString (2, 1, line2); prevSec = SECONDS; } if(ANY_BUTTON_PRESSED) { _delay_ms(20); //key debouncing delay if(ANY_BUTTON_PRESSED) buttonResponse(); while(ANY_BUTTON_PRESSED); } _delay_ms(100); //loop delay of 100msec } while(1); return 0; } //************************ END **************************