Kom igång med PicKit2
Kom igång med PicKit2
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
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
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]
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]
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 !!
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 !!
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
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
Kod: Markera allt
; MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0> ;as outputs
Att inte korrläsa sin egen kod är ajaj!

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)...
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)...
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 ??)
(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 ??)
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
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