Sida 1 av 2

Kom igång med PicKit2

Postat: 1 december 2006, 14:09:44
av mickej
Jag skulle vilja få lite hjälp med att komma igång med assembler programmering till en Pic16F690 som följer med Microship PICkit2.

Jag har testat och laddat ner alla exemple som följer med och testat och gjort lite ändringar, det fungerar bra...

Men vart hittar man mer info om assembler programmering ?
Sen så behöver jag lite hjälp med följande code, (programmet gör så att första lysdioden blinkar).

Hur gör jag så att lysdiod 1 blinkar, lysdiod 2 lyser och lysdiod 3 & 4 blinkar ?


#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc

org 0
Start
bsf STATUS,RP0 ; select Register Page 1
bcf TRISC,0 ; make IO Pin B.0 an output
bcf STATUS,RP0 ; back to Register Page 0

MainLoop
bsf PORTC,0 ; turn on LED C0

OndelayLoop
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.

bcf PORTC,0 ; Turn off LED C0

OffDelayLoop
decfsz Delay1,f ; same delay as above
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop ; Do it again...
end

Postat: 1 december 2006, 14:18:21
av sodjan
Kolla vilka portar som LED 2,3 och 4 är kopplade till.
Komplettera koden för önskad funktion, det mesta finns
ju redan där, det är bara att klippa å klistra...

Postat: 1 december 2006, 23:38:46
av mickej
portarna är kopplad till följande LED,
LED 1 = RC0
LED 2 = RC1
LED 3 = RC2
LED 4 = RC3


om jag gör dom här ändringarna så blinkar bara LED 2...



#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc

org 0
Start
bsf STATUS,RP0 ; select Register Page 1
bcf TRISC,0 ; make IO Pin C.0 an output
bcf TRISC,1 ; make IO Pin C.1 an output
bcf STATUS,RP0 ; back to Register Page 0

MainLoop
bsf PORTC,0 ; turn on LED C0
bsf PORTC,1 ; turn on LED C1
OndelayLoop
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.

bcf PORTC,0 ; Turn off LED C0
bcf PORTC,1 ; Turn off LED C1

OffDelayLoop
decfsz Delay1,f ; same delay as above
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop ; Do it again...
end

[/b]

Postat: 1 december 2006, 23:54:00
av sodjan
En första enkel test...

Sätt in 2-3 NOP mellan varje BCF/BSF.
Förklaring senare (om det hjälper)...

> bsf PORTC,0 ; turn on LED C0
> bsf PORTC,1 ; turn on LED C1

bsf PORTC,0 ; turn on LED C0
nop
nop
bsf PORTC,1 ; turn on LED C1

O.s.v.
Obs, enbart de BCF/BSF som kör mot PORTC !

Postat: 2 december 2006, 11:29:46
av mickej
det hjälpte inte.....

Postat: 2 december 2006, 14:05:22
av sodjan
OK, jag tror jag vet vad som är "problemet"...
Vad du behöver göra finns beskrivet i databladet (surprice ! :-) ).
Kolla den lilla grå rutan på sidan 76.

Det är en kombination av att BCF/BSF alltid gör en read-modify-write
samt att pinnar konfigurerade för deras analoga funktion alltid *läses*
som en "nolla"...

D.v.s först tänder du LED C0 på RC0 med den första BSF'en.
När du sedan tänder LED C1 på RC1 med den andra BSF'en, så
släcks samtidigt C0 !

Lösningen är helt enkelt (och det är en standardåtgärd som man
*alltid* ska göra) att stänga av de analoga funktionerna. Jag hade
inte kollat databladet förrut och visste inte vilka analoga funktioner
just denna processor hade...

Så gör som databladet säger så ska det fungera !!

Postat: 3 december 2006, 18:02:48
av mickej
Vad gör jag för något fel nu då,
Led nr 1, blinkar...
Led nr 2, fungerar inte, den är inte tänd.
Led nr 3, blikar....
Led nr 4, är tänd..



#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc

org 0
Start
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC

BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
; MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0> ;as outputs
BCF STATUS,RP0 ;Bank 0

bsf PORTC,1 ; turn on LED C1 ****** FUNGERAR INTE ********
bsf PORTC,3 ; turn on LED C3 ******* FUNGERAR *******
MainLoop

bsf PORTC,0 ; turn on LED C0
bsf PORTC,2 ; turn on LED C2
OndelayLoop
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.

bcf PORTC,0 ; Turn off LED C0
bcf PORTC,2 ; Turn off LED C2

OffDelayLoop
decfsz Delay1,f ; same delay as above
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop ; Do it again...
end

Postat: 3 december 2006, 21:36:52
av Kaggen

Kod: Markera allt

 ; MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0> ;as outputs
Du har kommenterat bort den övre raden som sätter W-reg till ett värde. Sedan flyttar du innnehållet till W-reg till TRISC, men vad finns i W-reg då? Du har ju kommenterat bort den raden? Vad har du tänkt skulle hamna i TRISC då?

Att inte korrläsa sin egen kod är ajaj! :)

Postat: 3 december 2006, 22:59:47
av sodjan
Förrutom det som Kaggen pekar på (d.v.s att TRISC kommer att sättas med
något slumpmässigt värde vid reset), så är det en dålig ide att ange
bit-mönster i HEX-format ("OCh"). Det blir mycket enklare att se vad som
görs om man anger det i binär-format.

Dessutom, använd gärna följande format (även om databladen inte alltid gör det) :

hex : h'0C'
dec : d'12'
bin : b'00001100'
oct : o'014' (inte speciellt vanligt med oktalt format...)

Notera att det är samma grundformat på alla formaten och att koden
kommer att blir lite mer lättläst och "snyggare", om man säger så...

Ta också och slå upp BANKSEL i MPASM manualen (eller i MPASM delen
av hjälpen till MPLAB). Det blir mycket snyggare (och säkrare) än alla BCF/BSF
direkt mot flaggorna i STATUS registret.

Slutligen, använd code-taggarna när du postar kod, så att det går att läsa (lite lättare)...

Postat: 4 december 2006, 15:51:11
av mickej
Det är inte lätt att vara nybörjare, klart att jag ska använda code taggen nästa gång.

Jag ska ta och läsa på lite om BANKSEL ikväll.
Är det någon som har någon exemple code som innehåller BANKSEL som man kan se hur man använder det i praktiken?

Postat: 4 december 2006, 15:57:39
av sodjan
RTFM !!
(Kap 4.7 på sidan 52 lämpligen...)

Varför fråga INNAN du har läst (ikväll) ??
I kapitelet om BANKSEL i manualen finns det flera utmärkta exempel.

Det är bara att plocka upp den i Acrobat och kolla. Hela BANKSEL är knappt en sida...

(Hade du inget alls att säga om den bortkommenterade MOVLW ??)

Postat: 4 december 2006, 16:21:42
av mickej
om jag aktiverar den bortkommenterade MOVLW så blinkar bara LED nr 1..
LED 2, 3 och 4 fungerar inte.

kommenter jag bort MOVLW så fungerar allt utom LED 2...

LED 1 = RC0
LED 2 = RC1
LED 3 = RC2
LED 4 = RC3

.M

Postat: 4 december 2006, 19:52:29
av Kaggen
Hum, frågan är om du inte skall läsa på lite mer om de olika instruktionerna först. Vet du vad instruktionen MOVLW gör?

Om du kan engelska har du ju lite exempel i länken nedan, men den är för 16F84 tyvärr, men du kan ju ändra registren så de passar din processor, eller "torrköra" koden i MPASM så du ser hur saker fungerar.

http://www.mstracey.btinternet.co.uk/pi ... ogtut2.htm

Postat: 4 december 2006, 19:55:07
av sodjan
> kommenter jag bort MOVLW

Och exakt *hur* har du tänkt att det ska fungera då ??

Postat: 5 december 2006, 08:44:01
av mickej
Jag vill att det ska fungera så här,

LED 1 = RC0 = ska blinka
LED 2 = RC1 = ska lysa
LED 3 = RC2 = ska blinka
LED 4 = RC3 = ska lysa

.M