Sida 1 av 1
Lysdioder - RLF
Postat: 20 september 2007, 20:45:24
av Tomtenirc
Hej
Jag har ett problem att få ett "rinnande ljus" på 7st lysdioder med hjälp av rlf kommandot, jag får det helt enkelt inte att fungera då jag är rätt ny på detta med att programmera
Är det någon som har tips hur jag ska skriva koden?
Postat: 20 september 2007, 20:50:31
av bengt-re
Tja du.... vilken uC, hur kopplat, vad har du testat...
Postat: 20 september 2007, 20:53:53
av Icecap
Jorå..... om du kan upplysa oss om vilken mikroprocessor du använder, det brukar att göra ganska mycket skillnad.
Vad man gör är att ta och ladda in värdet som ska shiftas, med left shift bör det vara en 0x01 till detta projekt.
Till detta behöver du då att vänta PAUSTID, sedan köra en left shift, paustid igen osv:
1: Ladda in 0x01
2: PAUSTID
3: Shift left
4: Om värdet är över 0x7F gå till punkt 1
5: Gå till punkt 2
Postat: 20 september 2007, 20:55:07
av sodjan
> jag får det helt enkelt inte att fungera...
Och vad händer då ???
Du skulle även behöva läsa :
http://www.elektronikforumet.com/forum/ ... php?t=6057
Postat: 20 september 2007, 22:06:58
av Marta
1: Ladda in 0x01
2: PAUSTID
3: Shift left
4: Om värdet är över 0x7F gå till punkt 1
5: Gå till punkt 2
Bättre att som punkt 4 kontrollera ifall resultatet är noll, då kan den inte låsa sig av en tillfällig störning. Dessutom är det lättare att kolla Z-flaggan som redan finns där än att behöva göra en compare som inte är helt lätt för en nybörjare om det är ASM och PIC .
Hur är dioderna anslutna? Du måste ha begränsingsmotstånd både för att det alls skall funger och att komponenterna skall arbeta inom sina tillåtna specifikationer. Är det en PIC16 (eller 18 och man läser PORT?) och utgångarna lastas ned så läser den nolla på pinnen även om den har skrivits etta. Då blir det tvärnit direkt.
Edit: Såg inte att det var 7 dioder, trodde det var 8, då har Icecap rätt med programkoden.
Edit2: En AND med 7F och reload vid noll är både enklare att förstå och "stoppsäker" jämfört med compare för >7F.
Postat: 23 september 2007, 19:35:23
av squiz3r
Om vi bortser från att det bara är 7st LED's så borde det väll gå att bara ladda in b'00000001' och sen shifta åt vänster, jag hade för mig att när 1'an kommer utanför vänsterkanten kommer den in på högerkanten igen??

Är det helt fel??
Förövrigt tror jag det är en 16F877A han anänder och han skriver i ASM (rätta mig om jag har fel)
Mvh..
Postat: 23 september 2007, 21:07:12
av Tomtenirc
Ursäkta för sent svar...
Hade lite väl bråttom när jag skrev min tråd, ska skriva dom bättre i fortsättningen
Squiz3r, det stämmer, en 16F877X som pic.
Sen så var det 8st lysdioder, ej 7st som jag skrev först
Jag labbade lite och lyckades till slut. Det kanske finns ett bättre sätt att skriva koden så den blir mindre än just det jag skrev om någon har tips?
main
movlw b'01111111' ; 1=Släckt / 0=Tänd
movwf portc ; PortC
call wait ;Väntar ett tag
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
call wait
call wait
rlf portc,1
goto main
end
Postat: 23 september 2007, 22:53:10
av sodjan
En *liten* förbättring skulle vara :
Kod: Markera allt
main
movlw b'01111111' ; 1=Släckt / 0=Tänd
movwf portc ; PortC
call wait ;Väntar ett tag
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
call wait2
rlf portc,1
goto main
wait2
call wait
call wait
return
end
eller
Kod: Markera allt
shift_led macro
rlf portc,1
call wait2
endm
main
movlw b'01111111' ; 1=Släckt / 0=Tänd
movwf portc ; PortC
call wait ;Väntar ett tag
shift_led
shift_led
shift_led
shift_led
shift_led
shift_led
shift_led
shift_led
shift_led
goto main
wait2
call wait
call wait
return
end
eller
Kod: Markera allt
main
movlw b'01111111' ; 1=Släckt / 0=Tänd
movwf portc ; PortC
call wait
loop
rlf portc,1
btfss status, c
goto main
call wait2
goto loop
wait2
call wait
call wait
return
end
Otestat självklart, men i princip...
Postat: 24 september 2007, 07:53:49
av Tomtenirc
Tack, jag ska prova senare idag

Postat: 24 september 2007, 15:55:05
av squiz3r
Sodjan: Det där med macro har jag alldrig sett tidigare

Funkar det till alla processor modeller?? (Självklart innom PIC)
Mvh..
Postat: 24 september 2007, 16:12:09
av sodjan
Japp.
Både online help och MPASM manualen har bra kapitel om macro.
I just detta fall var det ju ett väldigt enkelt macro utan t.ex några parametrar...
Macros kan både göra koden väldigt lättlast och underlätta underhållet.
Man kan se det som en form av "inline subrutin", men man slipper overhead
från CALL och RETURN och att få en extra stack-nivå (om man har problem med det).
Dessutom kan man skicka parametrar vid "anropet" och med #IF... i MPASM
styra vad som läggs in från macrot från fall till fall...
EDIT:
En nackdel (om man ersätter "riktiga" subrutiner med macros) är att koden
växer eftersom hela macrot läggs in överallt. Å andra sidan får man tillgång
till "assemble-time calculations" så som jag beskrev ovan, vilket är en
fördel framför vanliga subrutiner...
Postat: 24 september 2007, 16:14:49
av squiz3r
Detta måste testas när det blir lite tid över

'
Tack!