PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM/UART-eingabe Atmega162



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

KR-500
03.09.2011, 02:15
Hi,

ohne mit deinen Code jetzt genau angescheut zu haben, hier ist ein gutes tut:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
Ich mache das auch so wie dort beschrieben und es klappt wunderbar :)

Viele Grüße
KR-500

TheDuke
12.09.2011, 11:27
das hier hat sich geklärt, ich habe den EEPROM ausgiebig getestet