Atmega8, Bascom: erste Gehversuche

OP #4367237
Lesenswert?

Hallo

Heute hatte ich Zeit, um mich mit der Programmierung des Atmega8 zu 
befassen. Ich habe erfolgreich ein LCD versorgt, und an einem analogen 
Eingang eine Spannung gemessen und am LCD angezeigt.

Mein Ziel war es, eine Spannung von 0-5V am ADC0 zu messen und im LCD 
rechtsbündig mit 2 Kommastellen anzuzeigen.

Es funktioniert soweit - nur ob es so richtig gemacht wird weis ich 
nicht.

Irgendwo im Netz habe ich gelesen, dass die Verarbeitung von 
Flieskommastellen den Controller mehr als auslastet, und das keine 
optimale Lösung sei. Schließlich soll der µC nebenbei auch noch andere 
Aufgaben erfüllen, zB. in der zweiten Zeile des LCD etwas anderes 
anzeigen, o.ä.

Wie man es richtig macht, wurde aber leider nicht erwähnt.

Deshalb möchte ich die Profis hier bitten, mal einen Blick darauf zu 
werfen, und meine Fehler aufdecken.

lg
Angehängte Dateien:
#4367251
Lesenswert?

@Jonny S. (zonk)

>    Voltmeter.JPG

>Es funktioniert soweit - nur ob es so richtig gemacht wird weis ich
>nicht.

Der Anhang ist schon mal ein FAIL! Schon mal was von (Quell)textdateien 
gehört? Siehe Netiquette!

>Irgendwo im Netz habe ich gelesen, dass die Verarbeitung von
>Flieskommastellen den Controller mehr als auslastet,

Quark.

> und das keine
>optimale Lösung sei.

Sie ist hier vollkommen OK.

> Schließlich soll der µC nebenbei auch noch andere
>Aufgaben erfüllen, zB. in der zweiten Zeile des LCD etwas anderes
>anzeigen, o.ä.

Das ist läppisch, der COntroller langweilt sich auch damit mehr als 
genug.

>Wie man es richtig macht, wurde aber leider nicht erwähnt.

Wenn es WIRKLICH um sehr hohe Rechenleistung geht, nimmt man ggf. 
Festkommaartithmetik

>Deshalb möchte ich die Profis hier bitten, mal einen Blick darauf zu
>werfen, und meine Fehler aufdecken.

Im Prinzip OK, aber wenn du schon mit Fließkomma arbeitest, kann man das 
auch in einer einzigen Multiplikation machen. ;-)

Volt = Wert * 0.00488
#4367541
Lesenswert?

Ich würde es aber an einem Punkt noch ändern: Wenn die Spannung zunächst 
grösser/gleich 10V war und dann unter 10V fällt, dann bleibt die 10er 
Stelle stehen da du bei <10V den Cursor ja auf X=11 positionierst.
Beispiel: Erste Messung war 12V, die nächste 3V. Nun bleibt die 1 stehen 
und dahinter schreibst du die 3V -> Anzeige "13V".
Daher besser den If-Then-Block ersetzen durch
1
if volt <10 then Ausgabe = " " + Ausgabe
2
Locate 1,10
3
lcd Ausgabe
Dann wird einfach für die nicht vorhandene 10er-Stelle ein Blank gesetzt 
und danach positionierst du immer auf 1,10, d.h. die "12V" werden 
überschrieben durch " 3V".
Oder du wertest direkt die Länge des Strings 'Ausgabe' aus:
1
if len(Ausgabe) < 8 then Ausgabe = " " + Ausgabe
2
Locate 1,10
3
lcd Ausgabe
Ersteres ist aber einfacher und eingängiger.
OP #4367623
Lesenswert?

Paul P. schrieb:
> if volt <10 then Ausgabe = " " + Ausgabe
> Locate 1,10
> lcd Ausgabe


Daran habe ich gar nicht gedacht, dass das LCD nicht gelöscht wird - 
ansonst wäre ja die Zehnerstelle weg. Aber dann flackert das LCD.
Dein Lösungsvorschlag ist OK!
Danke Paul.



@ no_1

> bascom beherscht auto-formatierung.

dann man raus mit der Sprache ...
Gast #4368386
Lesenswert?

Dim Wert As Integer
Dim Text As String * 10
Dim Volt As Single
Dim Adc_max As Integer
Dim Faktor As Single
Dim Sp_teiler As Single
Dim Uref As Single
Dim Spaces As Byte

Cursor Off
Cls

Adc_max = 1023
Uref = 5
Sp_teiler = 200    '(R1+R2)/R2  (mit R2 gegen Bezugspunkt)
Faktor = Uref * Sp_teiler
Faktor = Faktor / Adc_max

Do
   Wert = Getadc(0)
   Volt = Wert * Faktor
   Text = Fusing(volt , "#.##") + " V"
   Spaces = 10 - Len(text)

   Locate 1 , 11
   Lcd Spc(spaces) ; Text

   Locate 2 , 1
   Lcd "Spaces: ";Spaces

   Waitms 30
Loop
End

'Sp-teiler' ist das Verhältnis des Spannungsteilers, falls du höhere 
Spannungen als Vcc messen willst. Zum Testen bis Anzeige "1000.00 V" 
habe ich ihn auf 200 gesetzt. Für Messungen bis 5.00 V steht er auf 1.
Gast #4368398
Lesenswert?

Ich seh grad, du hast ein 16x2 Display, das Beispiel ist für meine 20x4.
Einfach Locate 1,7 setzen, für den Test mit 4 Stellen vor dem Komma.

Für 2 Vorkommastellen:
  Spaces = 8 - Len(text)
  Locate 1 , 9

P.S. Spaces darf nicht 0 sein, sonst macht Bascom 255 Leerzeichen... :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren