TheDuke
02.09.2011, 13:04
Hi
ich beschäftige mich zurzeit mit dem Atmega162 und dessen EEPROM Speicher.
Nach dem lesen etlicher Seiten im Internet und auch des Datenblattes, habe ich nun so eine wage Ahnung was man mit dem EEPROM so alles machen kann.
Ich habe Codebeispiele aus dem Datenblatt genommen und auch schon die Standard Libary (avr/eeprom.h bei AVR Studio) probiert. Eigentlich scheint das alles zu funktionieren, aber irgendwie komme ich mit der Eingabe nicht zurzecht.
ALso ich will einen Wert eingeben und diesen dann vom EEPROM lesen und wieder ausgeben. Meine UART funktioniert also da bin ich mir sicher, aber ich denke es hängt am korrekten einlesen/auswerten der eingegebenen Werte.
uint8_t eingabeaufforderung(void)
{
char buffer[6], udata;
int8_t u=0, toLate=0;
udata = uart_getchar();
if(udata!=0xff) // Zeichen ungleich 0?
{
while(1)
{
if(udata!=0xff) // erneut testen ob Zeichen gütlig ist
{
buffer[u]=udata;
u++;
if(udata=='\r'||udata=='\n') break; // auf Endzeichen prüfen
if(u>6)
{
printf("Fehler! Zuviele Zeichen.\n"); // Fehlerausgabe bei Bufferoverflow
break;
}
}else
{
toLate++; // Fehlerausgabe bei zulanger Wartezeit
if(toLate==10)
{
printf("Time out.");
break;
}
_delay_ms(500);
}
udata= uart_getchar(); // Zeichen empfangen
}
if(u>0 && u<=6)
{
eepromVal=*buffer;
u=0;
return 1;
}else
{
printf("Fehler! Fehlerhafte Eingabe.\n");
uart_putchar('\n');
}
}
return 0;
}
Ich gebe einen Wert ein und gebe ihn direkt wieder aus. Es ändert immer nur die ersten 4 Bits und der Rest bleibt immer gleich. Also zB ist eine 9 eine 57, eine 8 eine 56 usw. Die ersten 4 Bits sind bei den Zahlen gleich aber Bit 5 u 6 sind immer 1, egal ob Neustart oder irgendwas.
Ich hab scho probiert mit
uart_gestring(&udata);
if(udata!=0xff)
{ eepromVal=udata; usw ..
funktionierte aber nicht.
in der main schleife siehts dann so aus
if(eingabeaufforderung()==1)
{
EEPROM_write(eepromAd, eepromVal);
eeprom_busy_wait();
printf("\n Jetzt lesen des Wertes vom EEPROM. \n");
eepromVal2=EEPROM_read(eepromAd);
printf("Der gelesene Wert betraegt: %i", eepromVal2);
}
Hat jemand eine Idee oder sieht einen Fehler oder kennt vielleicht irgendein Codebeispiel? Ich wäre sehr dankbar.
Gruss
ich beschäftige mich zurzeit mit dem Atmega162 und dessen EEPROM Speicher.
Nach dem lesen etlicher Seiten im Internet und auch des Datenblattes, habe ich nun so eine wage Ahnung was man mit dem EEPROM so alles machen kann.
Ich habe Codebeispiele aus dem Datenblatt genommen und auch schon die Standard Libary (avr/eeprom.h bei AVR Studio) probiert. Eigentlich scheint das alles zu funktionieren, aber irgendwie komme ich mit der Eingabe nicht zurzecht.
ALso ich will einen Wert eingeben und diesen dann vom EEPROM lesen und wieder ausgeben. Meine UART funktioniert also da bin ich mir sicher, aber ich denke es hängt am korrekten einlesen/auswerten der eingegebenen Werte.
uint8_t eingabeaufforderung(void)
{
char buffer[6], udata;
int8_t u=0, toLate=0;
udata = uart_getchar();
if(udata!=0xff) // Zeichen ungleich 0?
{
while(1)
{
if(udata!=0xff) // erneut testen ob Zeichen gütlig ist
{
buffer[u]=udata;
u++;
if(udata=='\r'||udata=='\n') break; // auf Endzeichen prüfen
if(u>6)
{
printf("Fehler! Zuviele Zeichen.\n"); // Fehlerausgabe bei Bufferoverflow
break;
}
}else
{
toLate++; // Fehlerausgabe bei zulanger Wartezeit
if(toLate==10)
{
printf("Time out.");
break;
}
_delay_ms(500);
}
udata= uart_getchar(); // Zeichen empfangen
}
if(u>0 && u<=6)
{
eepromVal=*buffer;
u=0;
return 1;
}else
{
printf("Fehler! Fehlerhafte Eingabe.\n");
uart_putchar('\n');
}
}
return 0;
}
Ich gebe einen Wert ein und gebe ihn direkt wieder aus. Es ändert immer nur die ersten 4 Bits und der Rest bleibt immer gleich. Also zB ist eine 9 eine 57, eine 8 eine 56 usw. Die ersten 4 Bits sind bei den Zahlen gleich aber Bit 5 u 6 sind immer 1, egal ob Neustart oder irgendwas.
Ich hab scho probiert mit
uart_gestring(&udata);
if(udata!=0xff)
{ eepromVal=udata; usw ..
funktionierte aber nicht.
in der main schleife siehts dann so aus
if(eingabeaufforderung()==1)
{
EEPROM_write(eepromAd, eepromVal);
eeprom_busy_wait();
printf("\n Jetzt lesen des Wertes vom EEPROM. \n");
eepromVal2=EEPROM_read(eepromAd);
printf("Der gelesene Wert betraegt: %i", eepromVal2);
}
Hat jemand eine Idee oder sieht einen Fehler oder kennt vielleicht irgendein Codebeispiel? Ich wäre sehr dankbar.
Gruss