Zahlendarstellung auf 16*2 verschieben?

Superhuebi

Neues Mitglied
26. Nov. 2008
6
0
0
Sprachen
Hi,
ich möchte eine Druckmessung aufbauen und habe folgendes Problem.
Zahlendarstellung von 0 bis 1024 mBar. Geht mein Druck unter
1000 mBar so bleibt die letzte gültige 4.te Ziffer stehen.
Anzeige statt z.B. 567 mBar 5670 mBar.
Ich habe mit Schleifen, shiften und mehr schon viel probiert, aber nichts funzt
und das blinken stört.
Hat schon mal jemand mein Problem gelöst

Hier mein Bascom-Programm:

$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 100
$swstack = 100
$framesize = 100

Dim Schleifenzaehler As Byte
Dim Messergebnis As Word
Schleifenzaehler = 0

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Lcd = 16 * 2
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Config Lcdmode = Port
Cls
Start Adc
Do
'Cls 'Mit Cls richtige Anzeige,dafür Blinken;
'ohne Cls richtige Anzeige bei 4 Ziffern aber
'falsche Anzeige bei 3 Ziffern da die vierte Stelle
'sich nicht löscht

Do
Messergebnis = Messergebnis + Getadc(0) 'Mittelwertbildung
Incr Schleifenzaehler 'aus
Loop Until Schleifenzaehler = 64 '64
Shift Messergebnis , Right , 6 'Messungen

Locate 1 , 1
Lcd Messergebnis
Locate 1 , 5
Lcd "mBar"
Waitms 100
Schleifenzaehler = 0
Messergebnis = 0
Loop
 
HTML:
Hallo,
die Übergabe der Zeichen ans LCD erfolgt wie?

Stelle mir das nämlich so vor, daß ein Temporärregisterinhalt in einer Subroutine nochmals auf ASCII-Werte umgeformt wird, damit das LCD die Zahlen als ASCII-Code auch versteht, und das Character-Ram automatisch das richtige Zeichen holt.

Der ADC produziert Werte, und der Stellenabgleich erfolgt wie?
Da muß die Dezimalzahlumwandlungsroutine wohl nochmals ran.

Was ich aber überhaupt nicht verstehe, ist, wieso der Cursor plötzlich anfängt zu blinken.
Sieht so aus, als ob die Initialisierung des LCD da fehlerhaft ist, bzw. ein String als "Nachinitialisierung" aufgefaßt wird.

Siehe auch ASM-Proggi-Schnipsel hier (Für die Uhrzeit und Messwertausgabe):
..........................
dezimalumrechnung: ; Umwandlung der Registerinhalte dezimal

push temp
push temp1
push temp2
rcall sendebereit
ldi zeichen, ':'
out UDR, zeichen ; laedt Doppelpunkt zwischen Zeichen
rcall sendebereit
ldi zeichen, ' '
out UDR, zeichen ; laedt Leerzeichen hinter Doppelpunkt
rjmp nummer

nummer:

mov temp2, temp1 ; Anzahl Zehner abzaehlen
ldi temp1, '0'
rjmp nummer_3

nummer_3:

subi temp2, 10 ; zieht Wert 10 ab
brcs nummer_4 ; springt zur Ausgabe, wenn negativer
inc temp1 ; Uebertrag entstanden
rjmp nummer_3 ; Ausgabe Anzahl Schleifendurchlaeufe

nummer_4:

rcall sendebereit
out UDR, temp1
mov temp, temp1
rcall datenuebernahme
subi temp2, -10 ; zaehlt 10 wieder dazu, da die
; Schleife davor 10 zuviel abzog
; Einer ausgeben
ldi temp1, '0' ; addiert ASCII-Code zu Einer hinzu
add temp1, temp2
rcall sendebereit
out UDR, temp1 ; Ausgabe Einer
mov temp, temp1
rcall datenuebernahme
pop temp2
pop temp1
pop temp
ret

endlos: ; Ausgabe-Schleife

cpi job1, 0x00 ; wenn Job-Flag gesetzt,
breq endlos ; Sprung zu Ausgabe-Routinen
ldi job1, 0x00 ; Job-Flag wieder loeschen
rcall position ; LCD-Startposition Uhrzeitanzeige
rcall verzoegerung3
mov temp1, stunde
rcall dezimalumrechnung ; Umwandlung und Ausgabe
ldi temp, ':' ; laedt Doppelpunkt zwischen Std u. Min
rcall datenuebernahme ; fuer LCD-Ausgabe
mov temp1, min
rcall dezimalumrechnung ; Umwandlung und Ausgabe
ldi temp, ':' ; laedt Doppelpunkt zwischen Min. u. Sec.
rcall datenuebernahme ; fuer LCD-Ausgabe
mov temp1, sekunde
rcall dezimalumrechnung ; Umwandlung und Ausgabe
rcall position3 ; LCD-Startposition Werte
ldi temp1, 0x40 ; Wert aendert sich pro Sekunde
mov temp, job2 ; immer ein ASCII-Zeichen mehr
add temp, temp1 ;
rcall datenuebernahme ; fuer LCD-Ausgabe
rcall sendebereit ; fuer serielle Datenausgabe
ldi temp2, ' ' ; Leerzeichen setzen
out UDR, temp2 ; hinter Uhrzeit
rcall sendebereit ;
out UDR, temp ; Ausgabe Wert seriell
rcall sendebereit ; Zeilenvorschub und Wagenruecklauf
ldi temp2, 0x0A ; fuer serielle Datenausgabe
out UDR, temp2
rcall sendebereit
ldi temp2, 0x0D
out UDR, temp2
rjmp endlos ; Rueckkehr in Ausgabeschleife
..............................................


Besonderes Augenmerk auch auf die Initialisierungsroutine des LCD mal richten:

; Entry/Shift Mode Set:

cbi daten, 0
ldi temp, 0x06 ; Cursor von links nach rechts
rcall kommando ; kein Schieben
rcall verzoegerung3
cbi daten, 0
ldi temp, 0x10 ; kein Schieben, Cursorbewegung
rcall kommando ; von links nach rechts
rcall verzoegerung3
cbi daten, 0
ldi temp, 0x0C ; Anzeige wieder einschalten
rcall kommando ; Cursor aus, Blinken aus
rcall verzoegerung3
cbi daten, 0
ldi temp, 0x01 ; Anzeige nochmals loeschen
rcall kommando
rcall verzoegerung3

Gruß von Oskar01
 

Anhänge

  • Basteln mit Attiny2313.asm
    14,3 KB · Aufrufe: 3
Hallo Superhuebi,
hallo Oskar,

ein Fehler in der Initialisierung wird es nicht sein.

Ich bin kein Bascom-Programmierer, kann hier also ggf. nicht ausreichend auf Bascom-Code eingehen.

Ich vermute mal, dass wenn du kein cls durchführst und zuvor einmal eine 4 Stellige Zahl ausgegeben hast, bei Ausgabe einer kleiner-stelligen Zahl die Ziffern der zuvor ausgegebenen Zahl stehen bleiben. Hört sich kompliziert an, ist es aber eigentlich nicht.

Bascom gibt die Zahl hier linksbündig aus, da die führenden Nullen unterdrückt werden. Vielleicht kann man die Ausgabe in Bascom konfigurieren oder es gibt einen anderen Befehl, so dass man ggf. alle führenden Nullen (max. 5 bei Word) ausgeben kann. Ideal wäre es, wenn Bascom die nicht unterdrückt, sondern dafür Leerzeichen ausgibt, das Ergebnis wäre somit rechtsbündig. Da solltest du einmal die Bascom-Online-Hilfe zu Rate ziehen.

Alternativ kannst du folgendermaßen vorgehen:

1. Vor der Ausgabe der Zahl 5 Leerzeichen ausgeben, Locate verwenden. Es könnte sein, dass der Flickereffekt hier nicht mehr auftritt.

2. Selber überprüfen, wieviel Stellen der Zahl relevant sind (if zahl <= 9 ... if zahl <= 99 ... ) und abhängig davon mittels Locate Leerzeichen vor der Zahl ausgeben, die Zahl wird somit auch rechtsbündig.

Vielleicht hilft dir das weiter,

Grüße,
Dirk
 
Hi @All,

ich denke es gibt mehrere Möglichkeiten das Problem zu beheben.

1. CLS
Hier haben wir ja schon gelernt, dass bei Einsatz von CLS das Display zu flackern anfängt. Eine mögliche Abhilfe wäre, nicht so schnell wie möglich das Display neu abzudaten sondern vielleicht nur jede Sekunde. Damit würde wnigstens für eine Sekunde der Messwert stabil auf dem Display stehen und das Flackern würde reduziert werden. Außerdem kann man davon ausgehen, dass sich der Druck nicht so schnell änder. Damit wäre eine Messung pro Sekunde durchaus im Rahmen, oder?

2. Formatierung
BASCOM bietet soweit ich in der Zwischenzeit den Überblick habe keine Möglichkeit Byte oder Word oder Double speziell formatiert auszugeben. Für Kommazahlen gibt es die Funktionktion FUSING aber wür ganze Zahlen gibt es sowas glaube ich nicht.
Ich bin bisher hingegangen und haeb mir eine eigene Formatierungfunktion geschrieben welche eine Zahl übergeben bekommt und einen formatierten String zurückliefert. Das beigefügte Beispiel bezieht sich zwar auf Byte, kann aber ohne große Probleme auf Word ergänzt werden. Mit dem Zusätzlichen Parameter kannst Du das ASCII-Zeichen angeben mit dem aufgefüllt werden soll. Das Ergebnis steht rechtsbündig im String.

Code:
'------------------------------------------------------------------------------
' Function: Byte2string
' Funktion liefert als Ergebnis eine "rechtsbündig" formatierten String einer
' übergebenen Byte-Variablen. Der String ist max. 3 Zeichen groß und beinhaltet
' ggf. bei kleineren Zahlen das übergebene Character als Füllzeichen von links
' führend aufgefüllt.
'
' Parameter:    Value     = Byte das als SString formatiert werden soll
'               Character = ASCII-Wert des Zeichens mit dem ggf. aufgefüllt
'               werden soll.
' Rückgabewert: String der Byte-Variablen inkl. Füllzeichen
'------------------------------------------------------------------------------
Function Byte2string(byval Value As Byte , Byval Character As Byte) As String

   ' ----- lokale Variablen -----
   Local String_length As Byte
   Local Process_string As String * 4
   ' ----- Programmcode -----

   ' Basis-String anlegen
   Process_string = Str(value)
   ' Länge ermitteln
   String_length = Len(process_string)

   ' Abhängig von Länge Füllzeichen ergänzen
   Select Case String_length
      Case 1:
         ' Wenn Länge 1 müssen zwei Füllzeichen links ergänzt werden
         Process_string = Chr(character) + Process_string
         Process_string = Chr(character) + Process_string
      Case 2:
         ' Wenn Länge 2 muss ein Füllzeichen links ergänzt werden
         Process_string = Chr(character) + Process_string
   End Select

   ' Bearbeiteter String an Übergabeparameter übergeben
   Byte2string = Process_string

End Function
'-- End Byte2string -----------------------------------------------------------


3. Am Ende ein Leerzeichen
Geht doch einfach bei der Ausgabe von "LCD Messwert" her und füht ein oder zwei Leerzeichen am Ende an. Dait stellt Ihr sicher, dass wenn die linksbündige Zahl kleiner wird, das rechts stehenbleibende Zeichen auf jedenfall überschrieben wird. Bei einem Leerzeichen bekommst Du nur Sprünge in einer Zenerpotenz gelöscht. Wenn die Gefahr besteht, dass der messwert von 1000 auch mal auf 1 springen kann dann sollte man drei Leerzeichen einfügen.

So also: LCD Messwert ; " "


Was meint ihr dazu? Hoffe geholfen zu haben!

Grüße udn schönen Tag,
Markus
 
An alle,
vielen Dank für die schnellen Tipps.
Ich habe die Variante

Locate 1,1
Lcd " "
Locate 1,1
Lcd Messwert

ausprobiert und sie funzt.:cheers:
 
Klasse,
daß es jetzt funktioniert....
Übrigens, im Post (Proggi Sieben.asm) war auch das gezielte Löschen mit Leerzeichen drin:

http://www.avr-praxis.de/forum/showthread.php?p=1761#post1761

Gruß von Oskar01



PHP:
Schnipsel......
text3:

.db	"     ", 0	             ; Leerzeichen gezielt setzen,
;			; da "Display Clear" zu lange dauert
festtext3:		; loescht Anzeigentext LCD Zeile 2

rcall	position2		; Positionierung LCD-Anzeige
ldi	ZL,	LOW(text4*2)	; Adresse des Strings in den
ldi	ZH,	HIGH(text4*2)	; Z-Pointer laden
rcall	print4			; Funktion print4 aufrufen
;rcall	verzoegerung2	; kurze Pause zwischen Zeichen
ret
........
Schnipsel Ende....
 
Analog-Digital-Wandler-Programm

Hallo,
bin natürlich auch an dem ADC-Programm interessiert.
Stehe gerade vor der Überlegung, das intern mit dem AVR-MC oder peripher mit dem 0804 zu realisieren.
Da steht im Datenblatt doch glatt zu lesen, daß der CD 0804 direkt ein LCD ansteuern kann.
Na das möchte ich mal sehen.
Bin mal gespannt.
Also, meine Überlegung ist ja die, der ATTiny2313 hat ja nur einen Operationsverstärker am Eingang, der wie ein exakt arbeitender Präzisions-Komparator-IC funktioniert. Sonst nichts, keine Widerstandstreppe oder ähnliches. Rein theoretisch kann ich also nur einen Vergleich zwischen einer Referenzspannung und einer fest gewählten Eingangsspannung machen.
Dann einen Interrupt auslösen lassen.
Mehr nicht.

Oder??

Gruß von Oskar01

P.S.: Wäre für Dankanstoß äußerst dankbar.
 
Hallo Oskar,

bitte für ein neues Thema in einem eigenen Thread anfangen, dann wird das Thema besser gefunden und es können dann ggf. mehr User Tipps geben und drauf eingehen.

Bezüglich der AD-Wandlung ohne ADC schau dir mal folgenden Thread an, insbesondere die Appnotes von Atmel.

http://www.avr-praxis.de/forum/showthread.php?t=145

Grüße,
Dirk
 
Hallo Dirk,
erst einmal vielen Dank für die prompte Antwort.
OK. Werde mal experimentieren und das Ergebnis in einem neuen Thread dann posten. Bislang war A/D-Wandlung noch ein Experimentierfeld, das ich überhaupt nicht in Angriff genommen hatte. Wird sich wohl bald ändern. -)

Danke nochmals,

und Gruß von Oskar01
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)