Hallo,
ich bin seit Stunden an einem Problem und ich komme einfach nicht
weiter, vielleicht könnt ihr mir helfen.
Hier mein Problem:
Ich bestimme in einer uint16_t eine EEPROM Adresse. Sprich 2Byte mit
folgendem Code:
Jetzt möchte ich die Adresse die zuvor mittels PC-Tastatur eingegeben
worden ist benutzen und als Dez.-Zahl im LCD anzeigen um zu überprüfen
ob auch die richtig Adresse ausgelesen worden ist. Das Problem ist
dabei, dass das LCD einfach nicht die richtig Zahl bzw. wirre Zeichen
anzeigt.
Solange dein Code nicht fehler- bzw warnungsfrei übersetzt wird, darft
du nicht erwarten, dass er fehlerlos ausgeführt wird.
z.B. Übergabewert an lcd_data() in einem Fall:
"uint16_t rdbyte"
und im andern Fall:
"char LCDZahl [10]"
Hans Peter
utoa will wie itoa ein Zeiger aufs Stringarray und den seh ich hier
nicht!
http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/
Dann musst du noch bedenken, dass du die Stellen auf dem LCD löschen
musst, wenn die Adresszahl um eine Zehnerpotenz kleiner wird, das
Display löscht ja nicht von alleine und dann irrt da ne alte Zahl rum.
Weider schrieb:> Das Problem ist dabei, dass das LCD einfach nicht die richtig Zahl bzw.> wirre Zeichen anzeigt.
Ohne konkrete Beispiele treibt die Phantasie wilde Blüten. Möchtest du
das?
Also nach lesen mehrere Forumeinträge und dem überdenken des Problems
bin ich zu folgender Überlegung gekommen: Da also ein uint16_t
übertragen wird muss ich evtl. den Wert in zwei uint8_t umwandeln,
danach über utoa(); laufen lassen und danach zu einer Dez.-Zahl
zusammenfügen!? Würde das so funktionieren?
Und hier noch eine kleine Frage neben bei: Der Wert für die Adresse im
EEPROM ist nun mal, auch der Funktion zu folge ein int16_t Übergabewert,
eine Dez.-Zahl. Wie mach ich das aber mit dem Byte das ich beschreiben
will bzw. lesen möchte? Ist es Sinnvoll das Byte (uint8_t) als Bitfolge
auszulesen (anzeigen) zu lassen oder eher als Hex? Wie ist es mit dem
Beschreiben einer Adresse? Binär, Hex ? Wie könnte ich das eingeben per
Keyboard, anzeigen lassen auf dem LCD und dann mit der richtigen
Varriable an die Funktion weitergeben ohne ständige umwandlungen zu
machen?
Weider schrieb:> Also nach lesen mehrere Forumeinträge und dem überdenken des Problems> bin ich zu folgender Überlegung gekommen:
Ich weiß nicht was du liest, aber du solltest den Ankauf eines C-Buches
und dessen Durcharbeitung ernsthaft in Erwägung ziehen. Wesentlich
besser als sich anlassbezogenes 1/4 Wissen in Foren zusammenzusuchen.
> Da also ein uint16_t> übertragen wird muss ich evtl. den Wert in zwei uint8_t umwandeln,
Nein, musst du nicht. Du musst dir nur im klaren darüber sein, was die
Funktion enter() eigentlich zu liefern hat und das dann auch umsetzen.
Soll enter() einen String liefern oder lieber doch gleich die fertige
Zahl (in Form eines uint16_t), die dem entspricht was der Benutzer
eingetippt hat.
Hinweis:
enter() eine fertige 16 Bit Zahl (als fertige Zahl) liefern zu lassen
ist trivial. enter() einen String liefern zu lassen, ist alles andere
als trivial. Bei letzterem muss man (mindestens) einen Tod sterben.
Ja, ich möchte eine 16Bit Zahl von der Funktion enter() zurück geben
lassen. Leider bekomme ich das nicht hin. Irgendwas stimmt in der
Funktion nich beim eingeben. Da ja eine Zahl die größer ist als 9 zwei
stellen bzw. mehrere benötigt. Diese Zahl (z.B. 1020) muss ja als
komplette zurückgegeben werden von der Funktion aber muss einzell im LCD
wiedergegeben werden, um auch eine Numer löschen zu können ASCII 8
(Backspace).
L.g.
Also wenn ich die Funktion enter() so lasse und einen String zurückgeben
könnte ich mit dem Code
http://home.htw-berlin.de/~junghans/cref/EXAMPLES/exponent.c#atoi den
String in eine Zahl umwandeln. Ich verstehe nur nicht wie der Code
funzt. Hilfe ich dreh durch! xD Ne, im Ernst. Kann mir irgendjemand bei
dem Problem helfen??? Bitte.. ich weiß net mehr weiter! =(
Weider schrieb:> Also wenn ich die Funktion enter() so lasse und einen String zurückgeben> könnte ich mit dem Code> http://home.htw-berlin.de/~junghans/cref/EXAMPLES/exponent.c#atoi den> String in eine Zahl umwandeln. Ich verstehe nur nicht wie der Code> funzt. Hilfe ich dreh durch! xD Ne, im Ernst. Kann mir irgendjemand bei> dem Problem helfen??? Bitte.. ich weiß net mehr weiter! =(
in enter() die Einzelzeichen, die der Benutzer eingibt, in einem String
sammeln. Aber das muss auch wirklich ein String bzw. ein char Array
sein, das was du da hast mit deinem Buffer Array ist Murks.
Danach den String mittels atoi oder atol oder strtol oder einer
Eigenbauroutine in eine echte Zahl umwandeln lassen und die dann
zurückgeben.
Ja, das versuche ich ja, aber wie kann ich die Eingaberoutine so
umschreiben das das Funktioniert. Den das lesen auf dem Rom klappt, wenn
ich die Eingaberoutine aus acht lasse.
1
voidmenu_rw_read(void)
2
{
3
uint16_tadbyte=0;
4
uint8_trdbyte=0;
5
charBuffer[17];
6
unsignedinteezahl;//char LCDZahl[10];
7
8
adbyte=enter("Adresse: ",8);
9
lprint("","ENTER:",1);
10
11
adbyte="1023";//<--- HIER Umgehe ich die Routine, es wird von adresse 1023 gelesen. Klappt auch super. Nur eben nicht mit der Eingabe.
12
eezahl=atoi(adbyte);
13
utoa(eezahl,Buffer,10);//Kontrollumwandlung
14
15
EEPWriteByte(eezahl,0xED);//test-Eigener Rom
16
17
lprint("ADD: ","Read EEPROM",1);
18
lcd_string(Buffer);//<-- Adresse wird klar dargestellt im LCD.
Weider schrieb:> Ich bestimme in einer uint16_t eine EEPROM Adresse. Sprich 2Byte mit> folgendem Code:
Hehehehe!
Haben da nicht andere Leute im Tone tiefster innerer Überzeugung in
einem anderen Thread davon gefaselt, daß man mit goto immer nur
Spaghetti-Code erzeugt? Der oben gepostete Code ohne goto wirkt auf
mich mindestens genau so spaghettihaft wie der (damals in den 80er
Jahren übliche) BASIC-Code mit goto.
Also mein Rat an den Weider:
1. Trenne die Funktionen in sinnvolle Stücke. Also schreibe 2
Funktionen
bool CharAvail(int Portnum); und char GetChar(int Portnum); Das ist die
unterste Ebene.
Darauf setzt eine Kommunikations-Ebene auf, die erstmal nur eine
Kommandozeile zusammensammelt und ggf. Backspace zum Editieren kennt.
Wenn eine Zeile zusammengekommen ist, dann werte sie aus.
Schreib dir ne Funktion, die Integers aus Ziffernfolgen macht und eine,
die Hex als Input hat. Meist braucht man beides und es ist gut, sowas im
Repertoire zu haben.
log GetLong(void)
{ long L;
L = 0;
while (Kommandozeile[ptr] in ['0'..'9']) /* ;-) */
{ L = L*10 + (Kommandozeile[ptr] - '0');
inc(ptr);
}
return L;
}
so ähnlich, mit Bereichsprüfung von ptr und von halb-Pascal nach C
umgemodelt...
W.S.