Hallo Leute, Nachdem ich das Problem, es werden wird nix auf dem LCD dargestellt gelöst hatte. Und der Übeltäter ein kaputter ATMega328P mit defekter PortD Reihe wahr . Habe ich ein bisschen mit dem LCD rumprobiert. (Vorab: Ich habe nicht vor solche Spannungen zu erzeugen. Es kam nur grade nichts anderen in denn Kopf!) Und das Test Programm ist ein "Programmable AC/DC Generator". Durch ein Drucktaster kann man die Hz Zahl in 10 Schritten erhören. Dieses Funktioniert auch nur es wird ein Komisches Zeichen hinter die "Hz" gehangen(Auf dem Bild zu sehen). Dieses kann ich mir nicht erklären. Könnte es von denn zusammenfügen dieser 2 Strings kommen? Und eigentlich sollte sich das LCD nur updaten wenn sich der String ändert. Dieses habe ich versucht mit einer if Abfrage zu machen jedoch funktioniert dieses nicht so ganz. Und das LCD wird immer neu dargestellt. Mfg Felix.
1 | char hzString[] = ""; |
2 | |
3 | itoa(HzInNumber, hzString, 10); |
Wie groß ist hzString?
Kaj G. schrieb: > char hzString[] = ""; > > itoa(HzInNumber, hzString, 10); > Wie groß ist hzString? Ich habe nun alle auf 100 gesetzt also hzString[100] primay[100] secondary[100]
Felix N. schrieb: > ... die Hz Zahl ... Nenn es einfach "Frequenz". Das versteht hier eigentlich jeder. Oder sprichst du in Zusammenhang mit deinem Alter auch immer von Jahr Zahl?
Wolfgang schrieb: > Nenn es einfach "Frequenz". Das versteht hier eigentlich jeder. > > Oder sprichst du in Zusammenhang mit deinem Alter auch immer von Jahr > Zahl? Okay. Werde ich beim nächsten mal machen.
1 | char *hz = malloc(strlen(hzString) + strlen(secondary)); |
Das wird nicht reichen. Nimm dir mal ein C-Grundlagenbuch und guck dir an, wie in C die Länge eines Strings gespeichert wird.
> malloc(strlen(hzString) + strlen(secondary))
Außerdem wird so ein malloc ohne free und ohne Fehlerabfrage ziemlich
schnell zu allgemeinem Chaos führen. Da kann alles mögliche passieren.
Hast Glück, wenn nur ein seltsames Zeichen erscheint.
Felix N. schrieb: > Ich habe nun alle auf 100 gesetzt also hzString[100] primay[100] > secondary[100] Aha, Dein LCD ist also 99 Zeichen je Zeile breit. Man darf beim Programmieren ruhig auch mal mitdenken. Setze hzString auf die maximale Stellenzahl von int16_t:
1 | char hzString[sizeof("-32768")]; |
Aber wozu überhaupt atoi, wenn Du eh sprintf benutzt? Und malloc in ner Loop bricht dem RAM das Genick.
Peter D. schrieb: > Aha, Dein LCD ist also 99 Zeichen je Zeile breit. > Man darf beim Programmieren ruhig auch mal mitdenken. > Setze hzString auf die maximale Stellenzahl von int16_t:char > hzString[sizeof("-32768")]; > > Aber wozu überhaupt atoi, wenn Du eh sprintf benutzt? > Und malloc in ner Loop bricht dem RAM das Genick. itoa damit er aus hzInNumber(Frequenz) in ein String umwandelt. Damit ich ihn mit dem hzString zusammenfügen kann damit daraus z.B: 60 Hz wird. str1 + str2; geht ja leider nicht so wie in java. Bei sprintf würde das dann so gehen?: char *newString[50]; char *frequenz[10]; char *newFrequenz[10]; sprintf(newString, "%s Hz", frequenz, newFrequenz);
Felix N. schrieb: > Dieses habe ich versucht mit einer if Abfrage zu machen jedoch > funktioniert dieses nicht so ganz. Und du bist dir ganz sicher, dass der "=="-Operator in C so funktioniert, wie du dir das denkst ;-) Da kann ich W.A. nur zustimmen und dir einen Blick in ein C-Buch zum Thema Stringvergleich empfehlen, wobei eigentlich gar nicht einzusehen ist, warum du nicht direkt den Wert von HzInNumber mit dem entsprechenden Wert bei der vorherigen Ausgabe vergleichst. Dann kannst du dir die ganze Umformerei sparen, falls sowieso keine Ausgabe erfolgen soll.
Kaj G. schrieb: > sprintf: > http://www.cplusplus.com/reference/cstdio/sprintf/ Danke. Also das habe ich schon mal hinbekommen:
1 | sprintf(frequenz, "%d Hz", HzInNumber); |
2 | sprintf(secondary, "%s %s", primay, frequenz); |
Jetzt enthält secondary (AC 230 V xx Hz). Aber wenn ich abfrage if(secondary == last) dann updatet sich das LCD nicht. Wenn ich aber das != statt == machen dann updatet es sich wieder. Es soll sich aber nur updaten wenn eine secondary anderes ist z.b secondary = AC 230 V 50 Hz last = AC 230 V 50 Hz //Nicht updaten secondary = AC 230 V 70 Hz last = AC 230 V 50 Hz //Updaten da sich secondary geändert hat. Aber ich weis nicht so wirklich das bei meiner abfrage falsch ist. Und wenn ich versuche last = secondary; zu machen damit ich last auf denn letzten Wert setzte gibt er mir diese Fehlermeldung aus: "assignment to expression with array type". Kann mir da einer helfen? //EDIT: Wolfgang schrieb: > Und du bist dir ganz sicher, dass der "=="-Operator in C so > funktioniert, wie du dir das denkst ;-) > > Da kann ich W.A. nur zustimmen und dir einen Blick in ein C-Buch zum > Thema Stringvergleich empfehlen, wobei eigentlich gar nicht einzusehen > ist, warum du nicht direkt den Wert von HzInNumber mit dem > entsprechenden Wert bei der vorherigen Ausgabe vergleichst. Dann kannst > du dir die ganze Umformerei sparen, falls sowieso keine Ausgabe erfolgen > soll. Weil man später nicht nur die Frequenz ändern kann sondern auch die Volts und AC bzw DC Type. Deswegen wollte ich denn ganzen String abfragen
Tja. C stammt von Assembler-Programmieren, die Betriebssysteme schrieben. Es enthält tausende von Fallen, die nur Assembler-Programmierer verstehen. Bleibt dir wohl nichts anderes übrig. Musst erst mal ein Lehrbuch durcharbeiten, das auf diese unzähligen Fallen hinweist.
Noch einer schrieb: > Tja. C stammt von Assembler-Programmieren, die Betriebssysteme > schrieben. Es enthält tausende von Fallen, die nur > Assembler-Programmierer verstehen. > > Bleibt dir wohl nichts anderes übrig. Musst erst mal ein Lehrbuch > durcharbeiten, das auf diese unzähligen Fallen hinweist. Ja werde ich mir am Montag mal besorgen. Könnt ihr mir da eins empfehlen? Mit google und umprobieren so gelöst:
1 | if(strcmp(secondary, last) != 0) { |
2 | setLineOne(0); |
3 | lcd_string(secondary); |
4 | strcpy(last, secondary); |
5 | } |
Mein kleines Test-Programm ist nun fertig. Danke für eure Hilfe. Wer Lust hat kann es ja mal ausprobieren. hex Datei habe ich hochgeladen. Ist für ein Atmega328p mit 16 Mhz. Man braucht dafür folgende Sachen/Pins: 1x LCD LCD: - PD0 = Data4 am LCD - PD1 = Data5 am LCD - PD2 = Data6 am LCD - PD3 = Data7 am LCD - PD4 = RS am LCD - PD5 = E am LCD - GND = RW auf GND legen - Poti/GND = V0/Vee 6x Drucktaster Controller: - 1ster Drucktatser = PB0 Spannung verkleinern(Wenn im Step Modus Schritte verkleinern auf 100, 10 oder 1 - 2er Drucktaster = PB1 Spannung erhöhen (Wenn im Step Modus Schritte(1, 10, 100 erhöhen) - 3er Drucktaster = PB2 Frequenz verkleinern(Um 100, 10 oder 1 je nach Step Einstellung // Gilt auch für die Spannung) - 4er Drucktaster = PB3 Frequenz erhöhen(Um 100, 10 oder 1 je nach Step Einstellung) - 5er Drucktaster = PB4 Wechsel zwischen AC und DC. - 6er Drucktaster = PB5 Wechsel zwischen Spannung Programmierung und Schritte Einstellung Der Zweck ist zwar null. Aber ich finde es ganz gut. Auch wenn es keine Funktion hat.
Felix N. schrieb: > hex Datei habe ich > hochgeladen. Unnnötig, das braucht keiner. So kann doch keiner feststellen, ob da noch Fehler in Deinem Programm sind.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.