PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grundlegende Frage zu SUB's



PhoenixTS82
13.07.2008, 19:46
kann mir einer agen warum das nicht geht ?

zur info: einfache 6x5 led matrix an porta 0-5 und portc 0-4



declare sub led(x as byte, y as byte)

call led(1,1)

sub led(x as byte, y as byte)
porta = 0 'erstmal alle leds auf 0 setzen
portc = 0
x = x - 1
y = y - 1
porta.x = 1
portc.y = 1
end sub


dabei sagt er immer ich soll byval benutzten, wenn ich das mache läuft aber auch nicht!

es leuchtet immer 2,2 egal was ich einstelle

edit: kan mir einer mal byval und byref näher erklären die hilfe kapier ich nciht so ganz....

python_rocks
13.07.2008, 20:36
edit: kan mir einer mal byval und byref näher erklären die hilfe kapier ich nciht so ganz....
Hallo PhoenixTS82!

http://halvar.at/elektronik/kleiner_bascom_avr_kurs/20_ausgaenge_mit_computer/
Suche nach "byval".

mfg
Gerold
:-)

Che Guevara
13.07.2008, 20:37
hallo phoenix,

du möchtest wahrscheinlich, dass immer eine led leuchtet?!?!
dazu benötigst du erstmal eine schleife..... entweder du machst das mit einer do-loop schleife (was bei bascom allerdings schwierig wird, da du nur 1 eine schleife gleichzeitig laufen lassen kannst) oder du machst es mit einer bestimmten anzahl an durchläufen, z.b.:

local i as word
for i = 1 to 10 '10 durchläufe
porta = &b00000000 'alle pins von porta auf 0
portc = &b00000000 'alle pins von portc auf 0
x = x - 1
y = y - 1
porta.x = 1
porta.y = 1
next i


das "porta = 0" funzt so nicht, du kannst entweder alle ports einzeln auf 0 setzen:

porta.0 = 0
porta.1 = 0
porta.2 = 0
usw.

oder aber so wie ich es gerade in dem beispiel gemacht habe:

porta = &b00000000

gruß
chris

PhoenixTS82
13.07.2008, 20:50
hallo che, danke erstmal für deine antwort aber ich meinte eher was anderes.

also porta = 0 fuktioniert,
porta = 0 ist gleich porta = &B00000000
porta = 7 ist gleich porta = &B00000111
das übersetzt er automatisch


mein problem lag eher dadran, das er die werte der aub nciht übernimmt, ich weiss nciht wie das byval funktioniert...
ohne gibt es ne fehlermeldung....

btw: was ist/ macht local ?

Che Guevara
13.07.2008, 21:03
local ist im prinzip fast das gleiche wie dim , nur das local eine variable nur innerhalb einer sub declariert, das bedeutet, du kannst i in mehreren subs unabhängig voneindander verwenden!!

ich würde das so machen:

x = 1
y = 1
call led( x , y )

gruß

python_rocks
13.07.2008, 21:21
declare sub led(x as byte, y as byte)

call led(1,1)

sub led(x as byte, y as byte)
porta = 0 'erstmal alle leds auf 0 setzen
portc = 0
x = x - 1
y = y - 1
porta.x = 1
portc.y = 1
end sub
Hallo PhoenixTS82!

Mir ist gerade eingefallen, dass ich auch mal so ein Problem hatte. Ich glaube das liegt an Bascom und man muss das Problem über eine **externe** Variable (unschön) lösen.


dim tmp as byte

sub led(x as byte, y as byte)
tmp = x - 1
porta.tmp = 1
...
end sub
Probier es mal aus. Vielleicht funktioniert es.

mfg
Gerold
:-)

PhoenixTS82
13.07.2008, 21:32
ok es funktioniert, der fehler war recht banal


ich hatte im haupt programm nur geschireben

call led(1,1)


OHNE do und loop, deswegen hat er sich aufgehangen, weil er nur einmal das programm und die sub durchgelaugen ist und danach stehen blieb.

funktioniert also so wie oben beschrieben.....

p.s. gibt es einen befehl wie INPUT, den ich NICHT mit enter bestätigen muss ?

ich wil quasi mit w,a,s,d die led wandern lassen

Che Guevara
13.07.2008, 22:55
du möchtest also mit 4 tastern(für die vier richtungen) die led, die leuchten soll, auswählen?!?!

wenn ich das so richtig verstanden habe, dann probiers mal so:

if pind.0 = 0 then
waitms 200
if x < 6 then
x = x + 1
else
x = 1
endif
elseif pind.1 = 0 then
waitms 200
if x > 1 then
x = x - 1
else
x = 6
endif
endif
if pind.2 = 0 then
waitms 200
if y < 5 then
y = y + 1
else
y = 1
endif
elseif pind.3 = 0 then
waitms 200
if y > 1 then
y = y - 1
else
y = 5
endif
endif

gruß

PhoenixTS82
13.07.2008, 23:04
hmm ok, ich hab mich falsch ausgedrückt...

nicht über pins sondern tasten auf der tastatut (entweder courortasten oder w,a,s,d)

im moment muss ich
w (enter)
s (enter)

ect. tippen

ich will gerne ohne mit enter zu bestätigen die aktion ausführen.

bei pascal hiess das mal readkey oder so, geht das auch überhaupt mit nem terminal fenster oder muss ich doch auf tasten umsteigen ???

python_rocks
14.07.2008, 08:42
eadkey
Hallo Phoenix!

Entweder mit INKEY, ISCHARWAITING:
- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/uart_rs232_vom_computer/
- http://avrhelp.mcselec.com/index.html?inkey.htm
- http://avrhelp.mcselec.com/index.html?ischarwaiting.htm

oder mit CONFIG SERIALIN (BYTEMATCH=ALL):
- http://halvar.at/elektronik/kleiner_bascom_avr_kurs/uart_rs232_vom_computer_2/
- http://avrhelp.mcselec.com/index.html?config_serialin.htm

mfg
Gerold
:-)