===== eeprom.c ===== #include "main.h" unsigned char ee_readByte(unsigned short address) { unsigned char tmp; while (!EEPROM_READY) { } uart_putc('A'); wait(500); EEPROM_ADDRESS(address); uart_putc('B'); wait(500); EEPROM_READ; uart_putc('C'); wait(500); while (!EEPROM_READ_READY) { } uart_putc('D'); wait(500); tmp = EEPROM_GET_DATA; uart_putc('E'); wait(500); return tmp; } void ee_writeByte(unsigned short address, unsigned char byte) { while (!EEPROM_READY) { } EEPROM_ADDRESS(address); EEPROM_SET_DATA(byte); EEPROM_WRITE; } void ee_writeByteEx(unsigned short address, unsigned char byte) { while (!EEPROM_READY) { } EEPROM_ADDRESS(address); EEPROM_READ; while (!EEPROM_READ_READY) { } if (EEPROM_GET_DATA != byte) { EEPROM_SET_DATA(byte); EEPROM_WRITE; } } ===== main.c ===== #include "main.h" int main(void) { // Alle Programmteile initialisieren: // init_io(); // init_adc(); init_uart(); // init_timers(); unsigned char value; unsigned char tmp; unsigned short mtmp; // Selbsttests ausführen // Zuerst den kritischen, Safety-Test // module_general_safety_test(); uart_puts("FAULT "); wait(1500); mtmp = 0; while (1) { wait(100); // Wenn Zeichen empfangen wurden.. while (rx_chars()) { // Zeichen lesen mtmp = uart_getc(); // 0 und 1 haben Sonderbedeutung (0 = EEPROM-Test für 0-0xFF, 1 = EEPROM-Test für 0x100-0x1FF) if (mtmp == 0) { // Auf Zwei weitere Bytes warten: while (rx_chars() < 2) { wait(10); } // Und einlesen: mtmp = (unsigned short)uart_getc(); tmp = uart_getc(); // mtmp ==> Speicherposition, tmp ==> Byte zum schreiben/lesen // Debug-Meldung uart_puts(" Writing & Reading: "); // Byte schreiben ee_writeByte(mtmp, tmp); } // Das selbe wie oben, nur für Speicherposition 0x100-0x1FF if (mtmp == 1) { while (rx_chars() < 2) { wait(10); } mtmp = (unsigned short)uart_getc(); // Oberes Bit setzen (damit wird die Adresse auf 0x100-0x1FF verschoben): mtmp |= (1 << 8); tmp = uart_getc(); uart_puts(" Writing & Reading: "); ee_writeByte(mtmp, tmp); } // Adresse ausgeben, welche gleich gelesen wird: uart_puts("Adr"); tmp = (mtmp >> 12) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = (mtmp >> 8) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = (mtmp >> 4) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = mtmp & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); uart_putc('='); // Abwarten, damit der Reset des µC nicht die Datenübertragung killed.. wait(20); // Versuchen das Byte zu lesen: value = ee_readByte(mtmp); // Wert ausgeben: tmp = value >> 4; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = value & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); // Und nochmal als 1-Byte senden (in Klammern) uart_putc('('); uart_putc(value); uart_putc(')'); } } return 0; } void wait(unsigned short milliseconds) { // Diese Funktion stellt sicher, das _delay_ms nur maximal 16ms warten muss (sonst läuft dort der Puffer über..) // [bei 7,3728MHz eigentlich 35ms aber wir wollen ja irgendwann auf 16MHz hoch mit dem Prozitakt] while (milliseconds > 16) { milliseconds-=16; _delay_ms(16); } _delay_ms(milliseconds); } unsigned short getModuleID(void) { return 0xf198; } ===== main.c ===== #include "main.h" int main(void) { // Alle Programmteile initialisieren: // init_io(); // init_adc(); init_uart(); // init_timers(); unsigned char value; unsigned char tmp; unsigned short mtmp; // Dieser String wird beim Neustart an die UART gesendet als Zeichen das etwas schief lief: uart_puts("FAULT "); wait(1500); mtmp = 0; while (1) { wait(100); // Wenn Zeichen empfangen wurden.. if (rx_chars()) { // Zeichen lesen mtmp = uart_getc(); // 0 und 1 haben Sonderbedeutung (0 = EEPROM-Test für 0-0xFF, 1 = EEPROM-Test für 0x100-0x1FF), sonst wird direkt // der Inhalt von Speicherposition mtmp ausgegeben. if (mtmp == 0) { // Auf Zwei weitere Bytes warten: while (rx_chars() < 2) { wait(10); } // Und einlesen: mtmp = (unsigned short)uart_getc(); tmp = uart_getc(); // mtmp ==> Speicherposition, tmp ==> Byte zum schreiben/lesen // Debug-Meldung uart_puts(" Writing & Reading: "); // Byte schreiben ee_writeByte(mtmp, tmp); } // Das selbe wie oben, nur für Speicherposition 0x100-0x1FF if (mtmp == 1) { while (rx_chars() < 2) { wait(10); } mtmp = (unsigned short)uart_getc(); // Oberes Bit setzen (damit wird die Adresse auf 0x100-0x1FF verschoben): mtmp |= (1 << 8); tmp = uart_getc(); uart_puts(" Writing & Reading: "); ee_writeByte(mtmp, tmp); } // Adresse ausgeben, welche gleich gelesen wird: uart_puts("Adr"); tmp = (mtmp >> 12) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = (mtmp >> 8) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = (mtmp >> 4) & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = mtmp & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); uart_putc('='); // Abwarten, damit der Reset des µC nicht die Datenübertragung killed.. wait(20); // Versuchen das Byte zu lesen: value = ee_readByte(mtmp); // Wert ausgeben: tmp = value >> 4; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); tmp = value & 0xf; uart_putc(tmp > 9 ? '7' + tmp : '0' + tmp); // Und nochmal als 1-Byte senden (in Klammern) uart_putc('('); uart_putc(value); uart_putc(')'); } } return 0; } void wait(unsigned short milliseconds) { // Diese Funktion stellt sicher, das _delay_ms nur maximal 16ms warten muss (sonst läuft dort der Puffer über..) // [bei 7,3728MHz eigentlich 35ms aber wir wollen ja irgendwann auf 16MHz hoch mit dem Prozitakt] while (milliseconds > 16) { milliseconds-=16; _delay_ms(16); } _delay_ms(milliseconds); } unsigned short getModuleID(void) { return 0xf198; }