Sida 1 av 1

knas med asm till pic

Postat: 5 mars 2007, 19:39:44
av luffare
Sitter och försöker lära mej programera pic(16f84) och har kört fast.
Det är den första koden jag skrivit så försök att inte garva ihjäl er :roll:

Problemet är att jag inte kan setta en utgång. har letat i boken o lite på forumet men hittar ingen förklaring. I vissa program funkar det och i vissa inte, det känns som om jag missat nån viktig regel :wall:
Har testat lite olika varianter(att setta en viss bit som dom vill i boken), har testat med hela portA = ut, hela portB = in etc.

När jag kör simulatorn/debugger så skiter den helt enkelt i viss kod, programmet funkar i övrigt och den gnäller inte i build.

Har skrivit in två olika varianter på problemet i koden.
Tacksam för alla svar

;startar och stänger av larmet med kod....
List p=16f84

status equ 0x05
porta equ 0x05
portb equ 0x06
trisa equ 0x85
trisb equ 0x86
kod equ 0x1a
ram equ 0x0c
rp0 equ 0x05

org 0x00

init
bsf status,rp0
movlw B'00001111'
movwf trisb
bcf status,rp0
movlw B'00000001' ; den hemliga koden för att släcka LED(bit 6 portB)
movwf kod

start
bsf portb,6 ;<---Vägrar setta portB bit 6
movlw B'00100000'
movwf portb ;<--- Samma här Vägrar setta portB bit 6
clrf ram
movfw portb
andlw b'00001111' ;nollar bort bitar 4-7 samt ointryckta bit0-3
xorwf kod,0 ;Jämför om det är rätt kod,värdet sparas i W.

movwf ram ;Kollar att det är rätt kod d.v.s om w = 0
btfsc ram,0
goto start
btfsc ram,1
goto start
btfsc ram,2
goto start
btfsc ram,3
goto start

clrf portb ;Släcker LED (bit6)
goto start
end

Edit:snyggat till lite...

Postat: 5 mars 2007, 19:55:40
av squiz3r
När du ska ställa in in och utgångar så kan du skriva det med binärt istället så är det lite lättare att se om det är rätt. Jag är inte så bra på ASM (än så länge :D ) men jag kan inte se några uppenbara fel.. Men om det är din första kod rekomenderar jag dig till att göra något lättare först, typ tända o släcka en LED med hjälp av en strömbrytare på en annan port tex. :)

Jag håller faktisk också på att bygga ett larm av en PIC nu :)

//Daniel A

Postat: 5 mars 2007, 19:55:58
av sodjan
Kommentera gärna lite bättre.
Använd code-taggarna så att det går att läsa.
Använd helst b'xxxxxxxx' när du sätter TRISx.
Använd INC filen, definiera definitivt *INTE* själv FSR'erna !!!!
Vad har du för __CONFIG ?
Slå gärna upp BANKSEL i MPASM manualen.
Byt den gamla utgångna F84'an till något modern.
Stäng av WDT så behöver du inte "clrw".
Varför "goto init" när "init" ligger på raden efter ??

Postat: 5 mars 2007, 20:16:11
av luffare
ok ska försöka förtydliga mej lite.
Är helt ny på det här och det är en skoluppgift. Har kommit till uppgift 6 i boken så tänkda släcka led är fixat.

>Använd code-taggarna så att det går att läsa.

ska snygga till det hela lite

>Använd helst b'xxxxxxxx' när du sätter TRISx.

ok, tänkte att det var mindre siffor o skriva :P

>Använd INC filen, definiera definitivt *INTE* själv FSR'erna !!!!

inc fil? fsr?

>Vad har du för __CONFIG ?

config av vad?

>Slå gärna upp BANKSEL i MPASM manualen.
Byt den gamla utgångna F84'an till något modern.

BANKSEL finns inte med i listan över kommandon till f84:an
Kör med den för att de är den boken(microsupportAB) handlar om.

>Stäng av WDT så behöver du inte "clrw".

börjar känna mej jävligt dum nu, men hur, var varför?

Ändrar om lite och lägger till komentarer...

Edit: tack för svaren föresten.

Postat: 5 mars 2007, 20:28:21
av Icecap
FSR = Specialregister (TRISx, PORTx och alla dessa register som inte enbart är minnesplats).

#include <p16f84.inc> ; *POOOOFFFF* alla register är numera definierat!

__CONFIG är en speciell minnesplats där man ställer in en del grundläggande inställningar, oscillatortyp osv.

Kan se ut såhär (saxat från ett PIC16F873-projekt):
__CONFIG _CP_ALL & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF

'banksel' är en "modern" macro som automatisk väljer rätt bank. Exempel:
banksel PORTA ; Sådär, rätt bank är vald!
movwf PORTA ; Gör det man nu vill göra.

WDT = WatchDog Timer = en grej som kan ställa till det helt jävligt. Den ska nollas konstant och om den inte blir det (program som har fått fnatt kanske) kommer den att resetta kretsen. Det finns en och annan som har torskat på den! "Varför startar skiten om jämt och ständigt? !¤%&#¤%&" typ.

Postat: 5 mars 2007, 21:02:36
av luffare
tack icecap
Att det kan va så smiditgt :D

När det gäller __CONFIG så kom jag på att man fick välja vissa av inställningarna ni nämner innan man skickar över programmet till pic:en.
Har ställt in i menyn "configuration bits"
Oscillator står på XT(för jag kör med kristall) har jag rätt?
WDT är OFF
Power Up Timer = off <- vad är detta?
Code Protect = off (skrivskydd antar jag)

Det var det jag som står i boken om detta...

Så istället för att skriva
status equ 0x05
porta equ 0x05
etc
så lägger man bara in:
#include <p16f84.inc>
Skit smidigt i så fall, antar att dom vill att man ska fatta vad som händer innan man lär sej det, vilket iofs oxå kan va bra.

Hittade MPASM manual som sodjan skrev om, står lite om banksel men hajar fortfarande inte riktigt vad det fina med den funktionen är? eller snarare vad som händer.
Antar att jag ska andvända den vid:
init
bsf status,rp0

Kul att ni svarar :D

Postat: 5 mars 2007, 21:06:14
av Icecap
Power-Up timer är en funktion som gör att oscillatorn ska vara i full gång innan processorn börjar jobba, det kan vara viktigt vid kritiska applikationer men till amatörer ska den oftast vara OFF.

init

banksel TRISB ; bsf status,rp0
movlw B'00001111'
movwf trisb
banksel PORTB ; bcf status,rp0
movlw B'00000001' ; den hemliga koden för att släcka LED(bit 6 portB)
movwf kod

start
bsf portb,6 ;<---Vägrar setta portB bit 6
movlw B'00100000'
movwf portb ;<--- Samma här Vägrar setta portB bit 6
clrf ram
movfw portb
andlw b'00001111' ;nollar bort bitar 4-7 samt ointryckta bit0-3
xorwf kod,0 ;Jämför om det är rätt kod,värdet sparas i W.
....

Postat: 5 mars 2007, 21:29:53
av luffare
NU FUNKAR DET :D

Har bara bytt ut
bsf mot banksel.
måste läsa lite mer om det..

fick byta PORTB etc från små till stora bokstäver för att #include <p16f84.inc> skulle funka, så det är caps lock på som gäller nu.

hade två varianter i koden för att setta ett ben.

bsf PORTB,6 ;<---Vägrar setta portB bit 6
och
movlw B'00100000'
movwf PORTB ;<--- Samma här Vägrar setta portB bit 6

BSF raden funkar fortfarande inte, skumt kommando det där.. eller andvänder jag det fel som vid "banskel"?

Edit:ändare små/stora bokstäver...

Postat: 5 mars 2007, 21:32:09
av sodjan
Man *kan* sätta config i menyerna men bättre är att göra det med
__CONFIG (som Icecap visade) direkt i källkoden. Om inte så bara för
att slippa *den här* diskussionen...

> >Använd helst b'xxxxxxxx' när du sätter TRISx.
> ok, tänkte att det var mindre siffor o skriva

Hm, men det är jobbigare att kolla om "bit x" är 1 eller 0. Man måste
tänka om hex -> binärt i huvudet. Alltså, lathet gör koden mer svårläst.

Detta (att ange parametern binärt) gäller *alla* FSR där de olika
bitarna har lite olika betydelse. Däremot om register (som t.ex de
olika timer-registren) normalt bara har ett "värde" så är oftast hex
eller decimalt att föredra. Det hela handlar om läsbarhet !

> config av vad?

Konfig av CONFIG registret :-)
Enklast är att du läser på lite om det...

> BANKSEL finns inte med i listan över kommandon till f84:an

Och det sa jag inte heller. Gör som jag sa istället... :-)

> >Stäng av WDT så behöver du inte "clrw".
> börjar känna mej jävligt dum nu, men hur, var varför?

Se inställningar av CONFIG...

> Kör med den (F84) för att de är den boken(microsupportAB) handlar om.

OK. Det är väl bra så. Lite tråkigt dock att de inte har "renoverat" deras
utbildningsmaterial sedan 16F84 gick "ur tiden". Å andra sidan så är den
ju väldigt enkel. Å tredje sidan så betyder enkelheten att den är mer
omständig att programmera... :-)

När det gäller INC filen så ser jag ingen fördel att *inte* använda den, inte
ens i början. Du kan ju alltid öppna INC filen och kolla om du är
nyfiken. Den innehåller bara en massa EQU's, d.v.s samma som du själv
la in tidigare.

Kolla speciellt slutet av INC filen där CONFIG parametrarna finns med !!

BANKSEL ser till att bank-bitarna sätts rätt (RP0, RP1). D.v.s du behöver inte
själv leta upp registren (FSR) i databladet, MPASM gör det åt dig.

Skillnaden mellan att sätta bank-bitarna själv är att BANKSEL aldrig gör fel... :-)

> Antar att jag ska andvända den vid:
> init
> bsf status,rp0

Igentligen inte, STATUS är alltid "mappat" över alla banker,
så inställningen av RP0/RP1 spelar ingen roll. Hur skulle man annars
kunna *ändra* RP0/RP1 bitarna oavsett vilken bank man är i ? :-)

Postat: 5 mars 2007, 21:36:29
av sodjan
> Har bara bytt ut
> bsf mot banksel.

Det i sig ska inte spela någon roll, *OM* du gjorde rätt.

> fick byta PORTB etc från små till stora bokstäver...

Ändra inställningen för MPASM i projektet till "not case sensitive".
Gör alltid det...

> bsf PORTB,6 ;<---Vägrar setta portB bit 6
> och
> movlw B'00100000'
> movwf PORTB ;<--- Samma här Vägrar setta portB bit 6

De där två varianterna sätter *INTE* samma bit !
Första varianten sätter bit nr 6 (d.v.s *sjunde* biten)
Andra varianten sätter bit nr 5 (d.v.s *sjätte* biten)

Postat: 5 mars 2007, 21:56:10
av luffare
ojdå det var klanigt med bitarna hehe
men hur som helst så händer inget i nån av bitarna på port B när man stegarförbi den raden (kollar i watch).

Ändrade precis case sens o då funkar den raden med, trots att jag ändrat stora små bokstäver.

känner mej som lite puckad med det är kul att lära sej o tack för hjälpen allihop :)

Postat: 5 mars 2007, 22:38:01
av sodjan
> känner mej som lite puckad

Kanske det, men det måste beror på något annat.
Finns inget *här* som ger anledning till det (än :-) )...

> men hur som helst så händer inget i nån av bitarna på port B när man stegarförbi den raden.

OK, ser inget vid en snabb koll...

> andlw b'00001111' ;nollar bort bitar 4-7 samt ointryckta bit0-3
> xorwf kod,0 ;Jämför om det är rätt kod,värdet sparas i W.

XORWF sätter Z-flaggan = 1 om resultatet blir h'00'.

Så testa bara Z-flaggan istället för dina 4 st BTFSC.
"ram" behövs inte alls, om jag inte ser fel...

Postat: 6 mars 2007, 13:53:57
av luffare
nice nu är koden mer än halverad och den funkar :D

;startar och stänger av larmet med kod....
List p=16f84

#include <p16f84.inc>
kod equ 0x1a

org 0x00

init
banksel TRISB
movlw B'00001111'
movwf TRISB
banksel PORTB
movlw B'00000001'
movwf kod

start
BSF PORTB,5 ;Startar Larmet/lysdioden
movfw PORTB ;tar in eventuell intryckt kod...
andlw B'00001111' ;nollar bort bitar 4-7 samt ointryckta bit0-3
xorwf kod,0 ;Jämför om det är rätt kod,värdet sparas i W, Z=1 om W = 00.

btfss STATUS,z ;Kollar att det är rätt kod d.v.s om Z = 1
goto start
clrf PORTB ;Släcker LED\larmet (bit6)
goto start
end

Postat: 6 mars 2007, 18:41:34
av sodjan
Trevligt ! :-)

Då kan du lägga lite tid på att kolla hur man använder
code-taggarna när man postar källkod för att få det lite
mer lättläst... :-)

Postat: 6 mars 2007, 20:54:23
av Icecap
Och kanske skriva läsbart?
" xorwf kod,0 ;Jämför om det är rätt kod,värdet sparas i W, Z=1 om W = 00"
ska väl vara
" xorwf kod,W ;Jämför om det är rätt kod,värdet sparas i W, Z=1 om W = 00"
Mycket mer läsbart!