PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Sub Parametern



Raphi
28.02.2006, 19:47
Hallo!

Also ich habe gerade eben erst mit der mc Programmierung angefangen und wollte ein paar Funktionen zur Ansteuerung eines LCD Displays schreiben. (Siehe Anhang)

Mein Problem ist nun dass die Funktion lcd_send zwar ein Byte sendet aber 0 statt dem übergebenen (dh. am display erscheinen mit dem code 16 "leere" zeichen). Vielleicht kann mir ja hier einer sagen was ich da falsch mache, dass in dem Sub die übergebenen Werte nie ankommen...
wäre super! (sitze jetz shcon stundne dran und komme nicht drauf...)

Bitte seht mir meinen "Programmierstil" nach ich bin ja erst mal am herumprobieren... ;-)

MfG!




$regfile = "8535def.dat" 'definieren des verwendeten Chips
$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)




'Funktionen zur Display-Ansteuerung 4-Bit
'========================================

'Anschluss Konfiguration
Const Lcd_port = Portb
Const Lcd_ddr = Ddrb
Const Lcd_pin = Pinb
Const Lcd_d4 = 0
Const Lcd_d5 = 1
Const Lcd_d6 = 2
Const Lcd_d7 = 3
Const Lcd_rs = 4
Const Lcd_rw = 5
Const Lcd_e1 = 6
Const Lcd_e2 = 7

'Hauptfunktionen
Declare Sub Lcd_init()
Declare Sub Lcd_send(byval Cnr As Integer , Byval Cmd As Byte , Byval Rs As Integer)
'Declare Sub Lcd_command(byval Cnr As Integer , Byval Cmd As Byte)


'Declare Sub Lcd_char(byval Nr As Integer , Byval Char As String)
'Declare Sub Lcd_text(byval Txt As String)
'Declare Sub Lcd_busy(byval Cnr As Integer)


'-------------------------------------------------------------------------------

'Dim Lcd_zeile(1 To 4) As String * 27


Dim Ausgabe As String * 27
'im Res As Integer
Dim Test As Byte

Ddrd = &B11100000 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
Portd = &B00000000 'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)





'Hauptprogramm

'Startbeep
'Portd = &B10000000
Waitms 100
Portd = &B00000000


Portd = &B01000000


Call Lcd_init


Portd = &B01100000

Ausgabe = "Hallo Raphael"
'Call Lcd_text( "Hallo!!!")

Test = &B11111111

Call Lcd_send(0, Test, 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B01000100 , 1)
Call Lcd_send(0 , &B11111111 , 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B11111111 , 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B11111111 , 1)


Call Lcd_send(0 , &B11111111 , 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B01000100 , 1)
Call Lcd_send(0 , &B11111111 , 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B11111111 , 1)
Call Lcd_send(0 , &B00100010 , 1)
Call Lcd_send(0 , &B11111111 , 1)


Portd = &B00000000
Wait 5

End 'end program



Sub Lcd_init():
'Initialisiert beide Controller, mit je zwei Zeilen
Ddrb = &B11111111
Portb = &B00000000
'3?h ins Steuerregister
Portb = &B11000011
Waitms 1
Portb = &B00000011
Waitms 5
Portb = &B11000011
Waitms 1
Portb = &B00000011
Waitms 5
Portb = &B11000011
Waitms 1
Portb = &B00000011
Waitms 5

'4 Bit Modus anschalten
Portb = &B11000010
Waitms 1
Portb = &B00000010
Waitms 200

'send command verwenden

'system set -> Betriebsart festlegen
Portb = &B11000010
Waitms 1
Portb = &B00000010
Waitms 5

Portb = &B11001000
Waitms 1
Portb = &B00001000
Waitms 5

'Call Lcd_send(0 , &B00101000 , 0)


'display on
Portb = &B11000000
Waitms 1
Portb = &B00000000
Waitms 5

Portb = &B11001111
Waitms 1
Portb = &B00001111
Waitms 5


'display clear
Portb = &B11000000
Waitms 1
Portb = &B00000000
Waitms 5

Portb = &B11000001
Waitms 1
Portb = &B00000001
Waitms 5


'Cursor Home
Portb = &B11000000
Waitms 1
Portb = &B00000000
Waitms 5

Portb = &B11000010
Waitms 1
Portb = &B00000010
Waitms 5


'Set Ddram
Portb = &B11001000
Waitms 1
Portb = &B00001000
Waitms 5

Portb = &B11000000
Waitms 1
Portb = &B00000000
Waitms 5

End Sub



Sub Lcd_send(ByVal Cnr As Integer, ByVal Cmd As Byte, ByVal Rs As Integer)

Local Nr1 As Integer
Local Nr2 As Integer
Local Tmp As Byte


'Cmd = &B00111000
'Cnr = 1
'Rs = 1


If Cnr = 0 Then
Nr1 = 1
Nr2 = 1
End If
If Cnr = 1 Then
Nr1 = 1
Nr2 = 0
End If
If Cnr = 2 Then
Nr1 = 0
Nr2 = 1
End If


'Bits 7...4 einstellen
Tmp = &B00000000
Tmp.0 = Cmd.4
Tmp.1 = Cmd.5
Tmp.2 = Cmd.6
Tmp.3 = Cmd.7
Tmp 0.4 = Rs
Tmp 0.6 = 1
Tmp 0.7 = Nr2
Portb = Tmp
Waitms 1
Tmp 0.6 = 0
Tmp 0.7 = 0
Portb = Tmp
Waitms 5

'Dasselbe mit Bits 0 bis 3
Tmp = &B00000000
Tmp.0 = Cmd.0
Tmp.1 = Cmd.1
Tmp.2 = Cmd.2
Tmp.3 = Cmd.3
Tmp 0.4 = Rs
Tmp 0.6 = 1
Tmp 0.7 = Nr2
Portb = Tmp
Waitms 1
Tmp 0.6 = 0
Tmp 0.7 = 0
Portb = Tmp
Waitms 5

End Sub

Frank
28.02.2006, 20:17
Der Code ist wirklich etwas wüst. Vielleicht das übliche Stackproblem - wenn der zu klein definiert wurde gibts Problemchen mit Sub-Parametern. Sicherheitshalber mal alle Stackwerte verdoppeln und ausprobieren.

Raphi
28.02.2006, 20:29
(oh sorry... das mit dem codefenster hatte ich nicht entdeckt... :-/ )

hey ich sag ja, das ist alles nur "zammgestöpselt" (programmiere zwar schon ein paar jahre vb...) aber bascom erst zwei tage... :D

hm, verzeihung für meine frage... aber wie verdopple ich den stack?! :-)
naja ich such mal danach... bin ja wirklich blutiger anfänger...

aber danke schon mal für den hinweis!!!!
viele grüße!!

Raphi
28.02.2006, 20:50
Danke für den Hinweis!!!!
Es funktioniert... (eine Zeile vom Problem entfernt :-( )

Also danke jedenfalls!!!!

(werd mich sicher nocheinmal melden ;-) )