Hallo und Guten Tag!
Ich habe mir den Bascom AVR Compiler als Demo instaliert, und habe ein
kleines Programm getippt. Ein Screenshot davon als Anhang. Nun....
geplant war es so, das die Werte von H,M und S erst in BCD umgewadelt
werden sollten, und dann in einen Uhrbaustein geladen. Wenn ich alles
richtig kapiert habe sollte doch der Simulator die Werte zeigen, die
beim Aufruf der Subrutine "Test" in klammer stehen.
Habe ich da was falsch verstanden? Macheich einen Fehler? Ist das ein
Bug von Basom? Nix verstehen :o/
Wenn einer probieren will:
$regfile = "2313def.dat" 'register file for AT90S2313
$crystal = 10000000 '10MHz crystal
Declare Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte )
Dim H As Byte , M As Byte , S As Byte 'dim byte
Do
Call Test1(12 , 40 , 12)
Loop
Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte )
H = Makebcd(h)
M = Makebcd(m)
S = Makebcd(s)
Print "S=" ; S
Print "M=" ; M
Print "H=" ; H
End Sub
Hallo Gabriel
Ich denke das das Programm nicht richtig funktioniert wegen:
1. Die Variablen scheinen mir reichlich mehrfach deklariert
nämlich zwei mal
Declare Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte
)
Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte )
2. BCD Variablen werden ja in mehreren Registern abgelegt,
sie benötigen also mehr als ein byte.
versuchs mal mit:
$regfile = "2313def.dat" 'register file for AT90S2313
$crystal = 10000000 '10MHz crystal
Declare Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte )
Dim H As Byte , M As Byte , S As Byte 'dim byte
Dim Hbcd as string, mbcd as string, sbcd as string 'bcd soll jeweils
bedeuten das das eine "bcd" variable sein soll
Do
Call Test1(12 , 40 , 12)
Loop
Sub Test1(byval H As Byte , Byval M As Byte , Byval S As Byte )
hbcd = Makebcd(h) ' hier habe ich die Variablen gewechselt (H -> hbcd
....)
mbcd = Makebcd(m) ' und hier auch
sbcd = Makebcd(s) ' und hier auch
Print "S=" ; sbcd ' und hier auch
Print "M=" ; mbcd ' und hier auch
Print "H=" ; hbcd ' und hier auch
End Sub
MFG Nik
p.s. sind alles nur vermutungen, in echt habe ich noch nie in Bascom
programmiert.
Hi Gabriel,
Dein Programm hat gleich zwei auffallende Probleme:
1. Die Deklaration der Sub-Routine verwendet den Befehl "Byval"! Das
bedeutet, das die Variablen die Du da an die Sub übergiebst, in direkten
Bezug gebracht sind zu den Werten, mit denen die Sub dann arbeitet. Das
bedeutet: änderst Du in der Sub einen Wert einer Variabe die Du
übergeben hast, dann ist dieser Wert dann auch noch nach abarbeitung der
Sub im Hauptprogramm weiter (geändert)gültig.
Soll die Variable die Du da an die Sub übergiebst, nicht durch Einflüsse
in der Sub verändert werden, dann verwende den Befehl "Byref"
Dadurch werden in der Sub nur Temporäre kopieen Deiner Variablenwerte
benutzt. (benötigt mehr Speicher und Taktzyklen)
2. Durch die oben beschriebene Problematik sowie der Tatsache das Du in
der Sub die Werte in BCD-Format bringst und die Ergebnisse in die
gleiche Variable zurück speicherst, wandelst Du, ab dem zweiten
Durchlauf Deiner Hauptroutine, (Endlosschleife) deine "BCD" Zahl
nochmals in eine "BCD" Zahl um. Und das da dann Zahlen rauskommen, die
"weitab des Stundenzeigers" liegen ist klar. ;-)
Beachte diese Punkte, und Du erhälst ein sauberes Ergebniss.
Gruß
Erik
Hallo Leute!
Ihr habt mir sehr geholfen! Habe die Variablen mit BYREF definiert, habe
auch andere Variablen definiert für die Werte in BCD, jetzt schaut's gut
aus :o))) Nochmal Danke für eure Antworten!
Schönne Grüsse aus Wien
Gabriel