Forum: Mikrocontroller und Digitale Elektronik Bascom Simulator


von Gabriel G (Gast)


Angehängte Dateien:

Lesenswert?

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

von Nik (Gast)


Lesenswert?

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.

von Erik Matthias Topel (Gast)


Lesenswert?

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

von Gabriel G (Gast)


Lesenswert?

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

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.