PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Zähler



Speed
03.07.2005, 11:06
Kann mir jemand helfen…?

Ich habe das C-Control/Basic mit angeschlossenem Application Board.
Am AD[1] ist ein Taster angeschlossen.
Wird der Taster nicht gedrückt ist am AD[1] der wert 255
Wird der Taster gedrückt ist am AD[1] der wert 0

Ich möchte eine art Zähler bauen.
Wenn man den Taster einmal drückt soll auf dem LCD 001 zu sehen.
Wenn man den Taster nocheinmal drückt soll auf dem LCD 002 zu sehen sein.
Und das dann bis 999.


Ich habe nur so meine Schwirigkeiten das zu Programmieren.

Robothomas
04.07.2005, 11:46
Hallo Speed!

Wenn du noch keine Erfahrung im Programmieren hast, würde ich dir vorschlagen, dass du einen Ablaufplan erstellst, der dann nach Fertigstellung in Basic umgesetzt wird. Nätürlich ist solch ein Plan nicht unbedingt notwendig, besonders für kurze, einfache Programme, erleichtert aber gerade dem Einsteiger ungemein die Arbeit. Bspw. benötigst du eine Schleife, in der der Port, an dem der Taster angeschlossen ist, abgefragt wird und ein interner Zähler sowie die Textausgabe der LC-Anzeige aktualisiert wird. Umgesetzt wird dies z.B. mit einer IF-Abfrage des Ports, um dann eine Integer-Variable um eins zu erhöhen. Dann springst du wieder an eine Marke, die du vor dem Schleifenanfang definiert hast. Schließlich mußt du noch mit einer weiteren IF-Abfrage bestimmen, was passieren soll, wenn der Zähler 999 erreicht hat. Schau dir mal die Beispielprograme an, die du auch unter www.c-control-support.de herunterladen kannst.

MfG,
Robothomas

Speed
04.07.2005, 16:03
Ich habe ein Programm geschrieben das alle 15 Minuten den AD[7] wert abfragt, und die werte auf dem EEPROM speichert.
Wenn ich dann Taster betätige ( AD[1] ) werden die gesamten Messdaten über das Hyperterminal ausgelesen.
Den Zähler brauche ich um zu sehen wie viel werte schon gespeichert sind.

Ich weiß jetzt nur irgendwie nicht wie man die Integer-Variable(n) schreibt.

mfg
Speed

Dirk
04.07.2005, 18:21
Hallo Speed,

stell doch Dein Prog hier 'mal ein! Das ist viel einfacher.

Übrigens: Für den Taster brauchst Du keinen A/D-Wandler-Eingang, sondern nur einen Digitalport, weil es ja nur 2 Werte (An/Aus) geben kann!

Gruß Dirk

Speed
05.07.2005, 17:39
Hier ist das Programm:


' --- Definitionen ---

define count word
define value word
define lastsec byte
define key ad[6]
define led port[1]
define sensor ad[7]


' --- Programmoperationen ---

count = 0
led = 0
lastsec = 0


open# for write
close#
#loop1
if second = 0 and second <> lastsec then gosub log
lastsec = second
pause 4200
#loop2


if key=0 then gosub dump


pause 20


if led then goto loop2 else goto loop1


#log
beep 100, 10, 0
open# for append
if filefree then print# sensor else goto filefull
close#
count = count + 1
return

#filefull
close#
led = ON
return



#dump
print
print count, " Messwerte"
open# for read

#dumpnext
if eof then return
input# value
print value; " ";
goto dumpnext
mfg
Speed

Dirk
05.07.2005, 20:45
Hallo Speed,

Was mir auffällt:
1. Mit print# werden WORDs gespeichert, so dass du je 2 Messwerte zusammenfassen könntest und in einer Speicherstelle ablegen. Gespeichert wird dann alle 2 Sekunden.
2. "led" ist bei dir ein Ausgang, an dem eine LED hängt. Da macht es keinen Sinn, led in einer IF-Abfrage zu verwenden. Dazu müsste led ja ein Eingang sein.
3. In dem dump-Teil würde ich close# nicht nehmen. Stattdessen steht es ja in #filefull und muss noch in #dump.
4. "pause 4200" Warum so lange Pause? Da kann der Test auf die Sekunde ja gar nicht immer stattfinden.

Gruß Dirk

Speed
06.07.2005, 14:45
Wie sollte das Programm deiner Meinung nach aussehen ?

mfg
Speed

Dirk
06.07.2005, 17:51
Hallo Speed,

probier 'mal diese Version.
Keine Garantie, weil nicht getestet und nur 'mal so schnell runtergeschrieben.

Gruß Dirk

Speed
07.07.2005, 16:58
Das Programm von dir Funktioniert!

Aber ich brauche ein Programm, dass

-alle 15 Minuten den AD[7] Port abfragt und den wert auf dem EEPROM Speichert.
-das wenn man den Taster drückt die gesamten gespeicherten messwerte übers Hyperterminal ausgelesen werden.
- Und auf dem LCD soll zu sehen sein wie viele messwerte schon gespeichert sind.

mfg
Speed

Dirk
07.07.2005, 21:38
Hallo Speed,


Aber ich brauche ein Programm, dass

-alle 15 Minuten den AD[7] Port abfragt und den wert auf dem EEPROM Speichert.
-das wenn man den Taster drückt die gesamten gespeicherten messwerte übers Hyperterminal ausgelesen werden.
- Und auf dem LCD soll zu sehen sein wie viele messwerte schon gespeichert sind.

Na dann, leg los! Eine funktionierende Startversion hast du ja. Programmieren lernt man durch programmieren. Stell deine Version dann später noch 'mal rein!

Gruß Dirk

Speed
08.07.2005, 18:04
Ja ich weiß nur nicht wie ich den "LCD Zähler" programmieren muss.
Da brauche ich hilfe.


Gruß
Speed

Dirk
08.07.2005, 22:02
Hallo Speed,


Ja ich weiß nur nicht wie ich den "LCD Zähler" programmieren muss.

Ich kenne da nur die alte C-Control I und deren Application Board.
Ich weiss nicht genau, welche Du hast.
Bei meiner alten CC1 ginge das so:
#AUSGABE
gosub LCD_CLS
lcd_param = &H4E : gosub LCD_WRITECHAR 'N
lcd_param = &H52 : gosub LCD_WRITECHAR 'R
lcd_param = &H20 : gosub LCD_WRITECHAR '
value=COUNT:gosub convert
return

COUNT ist Dein Zähler, value eine Word-Variable, die durch die Routine convert auf dem LCD ausgegeben wird. convert und die anderen Unterprogramme zur LCD-Ansteuerung werden ja auf der CD in Beispielprogrammen mitgeliefert, Du müsstest sie also haben.

Gruß Dirk

Speed
09.07.2005, 18:50
Ich habe das C-Control I mit Application Board,
aber bei mir war kein Datenträger dabei.

Gruß
Speed

Dirk
10.07.2005, 11:16
Hallo Speed,

hier die Routinen für die LCD-Ansteuerung. Auch "convert" ist dabei (Ausgabe bis 999):


' Keyboard- und LCD-Interface
define lcd_buf byte[12]
define lcd_param byte[13]

' Binär - Dezimal Umwandlung
define hunderter byte[14]
define zehner byte[15]
define einer byte[16]
define value byte[17]

' LCD-Port
define lcd_port byteport[2]
define lcd_rw port[13]
define lcd_rs port[14]
define lcd_e port[15]

'************************************************* *******************

' Initialisierung LCD-Display
gosub LCD_INIT

' Hier Hauptprogramm!!


'************************************************* *******************

' LCD-Interface:

#LCD_INIT
' alle ports 0
lcd_port = off

' 8-Bit-Modus aktivieren
lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
lcd_port=&B00000010
tog lcd_e
tog lcd_e

' ab jetzt 4-Bit-Modus
lcd_param = &H28 : gosub LCD_WRITECMD
lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
lcd_param = &H02 : gosub LCD_WRITECMD
lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeilenwechsel
#LCD_GOTOLINE
if lcd_param = 1 then lcd_param = &H80
if lcd_param = 2 then lcd_param = &HC0
goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
lcd_buf = off
goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
tog lcd_e
tog lcd_e
lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble
tog lcd_e
tog lcd_e
return

'************************************************* *******************

' Binär - Dezimal Umwandlung:
#convert
hunderter=value/100
if hunderter>0 then lcd_param=hunderter+&H30 else lcd_param=&H20
gosub LCD_WRITECHAR
'zehner abfragen
zehner=(value-(hunderter*100))/10
lcd_param=zehner+&H30
gosub LCD_WRITECHAR
'einer abfragen
einer=value-(hunderter*100)-(zehner*10)
lcd_param=einer+&H30
gosub LCD_WRITECHAR
return

'************************************************* *******************


Gruß Dirk

Speed
11.07.2005, 17:58
Ich hab das Programm auf das C-Control geladen, aber auf dem LCD ist nur „00“ zu sehen.
Mach ich was falsch?




Gruß
Speed