Forum: Mikrocontroller und Digitale Elektronik Atmega8, Bascom: erste Gehversuche


von Jonny S. (zonk)


Angehängte Dateien:

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

von Falk B. (falk)


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

von Jonny S. (zonk)


Lesenswert?

Falk B. schrieb:
> Der Anhang ist schon mal ein FAIL! Schon mal was von (Quell)textdateien
> gehört? Siehe Netiquette!


Wie mache ich es das nächste mal richtig? Soll ich die *.bas-Datei als 
Anhang hochladen, oder den Quellcode hier direkt einfügen?

lg

P.S.
Danke für dein Feedback

von neuling (Gast)


Lesenswert?

Direkt rein, code Tags benutzen.
[code]
blablubb
[/code.]
Ohne Punkt

von Falk B. (falk)


Lesenswert?

@Jonny S. (zonk)

>Wie mache ich es das nächste mal richtig? Soll ich die *.bas-Datei als
>Anhang hochladen,

Ja.

> oder den Quellcode hier direkt einfügen?

Nur, wenn er kürzer als 1 Bildschirmseite ist.

von Carl D. (jcw2)


Lesenswert?

@Jonny S.
Auch wenn das Teil nie meine Lieblingssprache wird, so schön formatiert 
bekommt man selten BASCOM Code zu sehen. Gratulation!

von Jonny S. (zonk)


Lesenswert?

Carl D. schrieb:
> Auch wenn das Teil nie meine Lieblingssprache wird, so schön formatiert
> bekommt man selten BASCOM Code zu sehen. Gratulation!


Danke für die Blumen :-)

Ja, ich hab mir Mühe gegeben (und vor dem Screenshot noch mal extra 
aufgeräumt) ;-)

lg

von Paul P. (paul_p792)


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.

von no_1 (Gast)


Lesenswert?

bascom beherscht auto-formatierung.
für den code kann bascom nix.
aber formartieren kann er es.

grrrr.......

von Carl D. (jcw2)


Lesenswert?

no_1 schrieb:
> bascom beherscht auto-formatierung.
> für den code kann bascom nix.
> aber formartieren kann er es.
>
> grrrr.......

BASCOM kann das vielleicht schon, das Formatieren. Aber viele seiner 
Nutzer finden den Knopf dafür nicht ;-)

von Jonny S. (zonk)


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

: Bearbeitet durch User
von Simpel (Gast)


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.

von Simpel (Gast)


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

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.