Forum: Mikrocontroller und Digitale Elektronik Buchstaben Variablen auf LCD ausgeben AVR-GCC


von Wadim (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte einen einfachen Bordcomputer für mein Motorrad, Quad, Roller, 
Fahrende Bierkiste etc. machen. Zwei seiner Funktionen werden auf einem 
Attiny 2313A ausgeführt. Es handelt sich um:
1. Ermittlung und Ausgabe der Drehzahl
2. Anzeige des eingelegten Ganges (R, N, 1, 2, 3).

Ausgabe erfolgt auf einem LCD 16x2.

Bei der Ausgabe des Ganges habe ich ein Problem mit der Darstellung der 
Buchstaben, R und N. Diese werden gemäß ASCII Code in Zahlen (82 und 78) 
umgewandelt.
Wie kann ich dem Programm sagen, dass die Buchstaben als Buchstaben der 
Variable "Gang" zugewiesen und genauso ausgegeben werden müssen?

Gruß
Wadim

von Peter II (Gast)


Lesenswert?

Wadim schrieb:
> Wie kann ich dem Programm sagen, dass die Buchstaben als Buchstaben der
> Variable "Gang" zugewiesen und genauso ausgegeben werden müssen?

einfach ausgeben

> itoa( Gang, Buffer, 10);
ist Unsinn, hier wird eine Zahl in ein String gewandelt, du hast aber 
ein zeichen.


Ich weis nicht ob die LCD-Lib direkt ein zeichen ausgeben kann, aber so 
sollte es auch gehen.
1
Buffer[0] = Gang;
2
Buffer[1] = 0;
3
lcd_string(Buffer);

von Karl M. (Gast)


Lesenswert?

Wadim,

was muss man da wandeln ?

ein N ist in C als Zeichen so definiert: 'N'.

Dann gibt es bestimmt eine LCD Ausgabefunktion für Zeichen.

Fertig..

von Wolfgang (Gast)


Lesenswert?

Was soll das werden?
1
#ifdef F_CPU
2
#define F_CPU 1000000UL
3
#endif

Wadim schrieb:
> Wie kann ich dem Programm sagen, dass die Buchstaben als Buchstaben der
> Variable "Gang" zugewiesen und genauso ausgegeben werden müssen?

Gegenfrage: Warum weist du deiner Char Variablen überhaupt Zahlen zu 
(1,2,3) und nicht Zeichen ('1','2','3'), die für die Anzeige benötigt 
werden. Für die Ausgabe eines Zeichens ist natürlich die Funktion itoa() 
mit ihrer Umwandlung von int in eine nullterminierte Zeichenkette 
denkbar ungeeignet.

Über die Struktur mit der
1
  switch (Drehzahlzuweisung )
 würde ich auch noch mal nachdenken. Was soll das werden?

von Falk B. (falk)


Lesenswert?

1
 Gang = 'R';
2
 Gang = 'N';
3
 Gang = '1';
4
 Gang = '2';
5
 Gang = '3';
6
7
etc.
8
9
lcd_data (Gang);

Dieses "Konstrukt" mit Drehzahl1 - Drehzahl16 ist maximaler Unsinn. 
Erstens gibt es Arrays und 2. Willst du glaub ich was ganz anderes 
machen. Einen Mittelwert bilden?

von Peter II (Gast)


Lesenswert?

Nachtrag:

Das Programm kann ein ganzen stück vereinfacht werden, wenn man einfach 
für die Drehzahl ein Array verwendet:

uint16_t Drehzahl[16];
dann kannst du einfach den ganzen Switch-case weglassen

Drehzahl[Drehzahlzuweisung] = (125000/(Frequenz/60));

von Wadim (Gast)


Lesenswert?

Vielen Dank für die Inputs und euer Engagement. Das Programm 
funktioniert nun.

Peter II schrieb:
>> itoa( Gang, Buffer, 10);
> ist Unsinn, hier wird eine Zahl in ein String gewandelt, du hast aber
> ein zeichen.
Natürlich. Und dementsprechend sind auch Gang 1, 2, und 3 als Zeichen zu 
behandeln.

Peter II schrieb:
> Ich weis nicht ob die LCD-Lib direkt ein zeichen ausgeben kann, aber so
> sollte es auch gehen.
> Buffer[0] = Gang;
> Buffer[1] = 0;
> lcd_string(Buffer);
Es funktioniert :). Danke.

Wolfgang schrieb:
> Was soll das werden?#ifdef F_CPU
> #define F_CPU 1000000UL
> #endif
Copy Paste :/. Erste und dritte Zeile wurden gelöscht. So besser?

Falk B. schrieb:
> Dieses "Konstrukt" mit Drehzahl1 - Drehzahl16 ist maximaler Unsinn.
> Erstens gibt es Arrays und 2. Willst du glaub ich was ganz anderes
> machen. Einen Mittelwert bilden?
Ich bin ein absoluter Anfänger, sodass dieses Konstrukt zustande kam, 
welches jedoch super funktioniert. Es wird ein "laufender Mittelwert" 
gebildet!

Peter II schrieb:
> Das Programm kann ein ganzen stück vereinfacht werden, wenn man einfach
> für die Drehzahl ein Array verwendet:
Das werde ich mal versuchen, wobei ich sagen muss, dass auch das 
derzeitige Programm super funktioniert. :)

von Möwe (Gast)


Lesenswert?

Wadim schrieb:
> Wolfgang schrieb:
>> Was soll das werden?#ifdef F_CPU
>> #define F_CPU 1000000UL
>> #endif
> Copy Paste :/. Erste und dritte Zeile wurden gelöscht. So besser?

Es muss #ifndef heißen. Nicht #ifdef. Sonst definiert er ja F_CPU nur(!) 
wenn es schon definiert ist. Woher hast du das denn kopiert?

Grüße

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ Wadim (Gast)
>> Dieses "Konstrukt" mit Drehzahl1 - Drehzahl16 ist maximaler Unsinn.
>> Erstens gibt es Arrays und 2. Willst du glaub ich was ganz anderes
>> machen. Einen Mittelwert bilden?
>Ich bin ein absoluter Anfänger, sodass dieses Konstrukt zustande kam,
>welches jedoch super funktioniert. Es wird ein "laufender Mittelwert"
>gebildet!

Ok.

>Das werde ich mal versuchen, wobei ich sagen muss, dass auch das
>derzeitige Programm super funktioniert. :)

Das ist im Moment das Wichtigste! Gratulation!

Trotzdem willst du ja hoffentlich noch ein wenig lernen. Siehe Anhang.

von Wadim (Gast)


Lesenswert?

Möwe schrieb:
> Es muss #ifndef heißen. Nicht #ifdef. Sonst definiert er ja F_CPU nur(!)
> wenn es schon definiert ist. Woher hast du das denn kopiert
Kopiert nicht ganz, eher aus dem AVR-GCC Tutorial falsch abgeschrieben. 
Trotzdem hacke ich mal nach, weil mich das zum Nachdenken angeregt hat 
;P.
Sollte man nach F_CPU Definition stets überprüfen oder kann man das bei 
einem einfachen Programm, wie meinem, weg lassen. Funktioniert ja auch 
ohne.

Falk B. schrieb:
> Das ist im Moment das Wichtigste! Gratulation!
> Trotzdem willst du ja hoffentlich noch ein wenig lernen. Siehe Anhang.
Super, danke. Ich werde mir das Programm anschauen.

Gruß
Wadim

von Falk B. (falk)


Lesenswert?

@ Wadim (Gast)

>Sollte man nach F_CPU Definition stets überprüfen

Nicht zwingend.

> oder kann man das bei
>einem einfachen Programm, wie meinem, weg lassen.

Ja.

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.