Forum: Mikrocontroller und Digitale Elektronik Komisches Zeichen wird im LCD angezeigt. Durch zusammenfügen von 2 Strings?


von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

1
char hzString[] = "";
2
3
itoa(HzInNumber, hzString, 10);
Wie groß ist hzString?

von Felix N. (felix_n888)


Lesenswert?

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]

von Wolfgang (Gast)


Lesenswert?

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?

von Felix N. (felix_n888)


Lesenswert?

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.

von W.A. (Gast)


Lesenswert?

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.

von Noch einer (Gast)


Lesenswert?

> 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.

von Peter D. (peda)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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);

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?


von Wolfgang (Gast)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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

von Noch einer (Gast)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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
  }

von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.