Kom igång med PicKit2

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jo, *det* förstår jag :-)

Frågan var hu du ska kunna sätta TRISC rätt om du inte först laddar W med korrekt värde ?
Alltså hur det *överhuvudtaget* ska kunna fungera med MOVLW instruktionen bortkommenterad...

Jag ska kolla lite senare i dag...
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

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
Enkelt!

1. Läs i databladet för din uC vilka bitar som skall sättas i TRISC registret för att definiera RC0 - RC3 till utgångar.

2. Räkna om bitarna i steg 1 till ett hextal.

3. Ersätt XX i utdraget från din föregående kod nedan med det hexadecimala tal som du kommit fram till.

Kod: Markera allt

MOVLW XXh ; <- Ersätt XX med rätt värde
MOVWF TRISC ;and set RC<0,1,2,3> ;as outputs
mickej
Inlägg: 34
Blev medlem: 13 november 2006, 13:32:24
Ort: Stockholm / Uppsala

Inlägg av mickej »

Tack för all hjälp, nu börjar jag att förstå lite om pic programmering.
Nu har jag fått koden att fungera lite som jag vill, (blink på LED C0 & C3 fungerar som det ska)..

Jag skickar först,
movlw b'00001001' ; turn on LED C0 & C3
movwf PORTC

Sen så skickar jag,
movlw b'00000000' ; turn off LED
movwf PORTC

Men om jag nu vill att LED C1 & C2 ska lysa hela tiden, hur ska jag bära mig åt då, för när jag skickar movlw b'00000000' så noll ställer jag ju alla portar.

.M

Kod: Markera allt

#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
     clrf TRISC
     bcf STATUS,RP0

;	movlw b'00000001'		; turn on LED C0
;	movwf PORTC
;	movlw b'00000010'		; turn on LED C1
;	movwf PORTC
  
MainLoop

;	movlw b'00000100'		; turn on LED C2
;	movwf PORTC

 	movlw b'00001001'		; turn on LED C0 & C3
        movwf PORTC 
 
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.

;	movlw b'00000100'		; turn on LED C2
;	movwf PORTC

 	movlw b'00000000'		; turn off LED 
 	movwf PORTC    

OffDelayLoop
	decfsz	Delay1,f	; same delay as above
	goto	OffDelayLoop
	decfsz	Delay2,f
	goto	OffDelayLoop
	goto	MainLoop	; Do it again...
	end
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kod: Markera allt

movlw b'00001111' ; turn on LED C0 & C3 (and C1 and C2...)
movwf PORTC

movlw b'00000110' ; turn off LED (and C1 and C2 on...)
movwf PORTC
mickej
Inlägg: 34
Blev medlem: 13 november 2006, 13:32:24
Ort: Stockholm / Uppsala

Inlägg av mickej »

:oops:, Det var enkelt...
Men om jag vill att portarna ska vara oberonde av varandra.
Alltså om jag vill att port C0 och C1 ska blinka och port C2 & C3 ska sättas hög utan att använda följande kod,

Kod: Markera allt

movlw b'00001111' ; turn on LED C0 & C1 (and C2 and C3...)
movwf PORTC

movlw b'00001100' ; turn off LED (and C2 and C3 on...)
movwf PORTC
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

slå upp instruktionerna bsf och bcf i databladet så har du en ledtråd där.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Antingen kör du BCF/BSF direkt mot rellevanta bitar i PORTC, eller så
(för att undvika eventuella read-modify-write problem, även om jag inte
tror att det är aktuellt i detta fall) skapar du en variabel (kallas ibland för
"port shadow register") mot vilket du kör dina BCF/BSF, och sedan när
lysdioderna ska uppdatteras så blir det en MOVF/MOVWF sekvens för att
kopiera "skuggregistret" till PORTC. Något i stil med nedanstånde.
OBS ! Helt otestad kod. Kan vara någon liten miss, men det hittar du
enkelt. Principen bör dock fungera...


Kod: Markera allt

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

ON    equ 1
OFF   equ 0

#define  C0  portc_tmp, 0
#define  C1  portc_tmp, 1
#define  C2  portc_tmp, 2
#define  C3  portc_tmp, 3

set_led macro led, onoff
     if onoff == 1
        BSF  led    ; Tänd LED (i shadow reg)
     else
        BCF  led    ; Släck LED (i shadow reg)
     endif
     movf    portc_tmp, w
     movwf   portc            ; Uppdatera LEDs
     endm

   org 0

start
     bsf STATUS,RP0
     clrf TRISC
     bcf STATUS,RP0

;   Sätt startläge på LEDs.
     set_led C0, off
     set_led C1, off
     set_led C2, on
     set_led C3, on

 
MainLoop

     setled C0, on
     setled C1, on
     
OndelayLoop......  
...
...

     setled C0, off
     setled C1, off

OffDelayLoop.....
...
...
   goto   MainLoop   ; Do it again...
   end

Utan shadow reg :

Kod: Markera allt

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

ON    equ 1
OFF   equ 0

#define  C0  portc, 0
#define  C1  portc, 1
#define  C2  portc, 2
#define  C3  portc, 3

set_led macro led, onoff
     if onoff == 1
        BSF  led    ; Tänd LED
     else
        BCF  led    ; Släck LED
     endif
     endm

[resten är lika...]
mickej
Inlägg: 34
Blev medlem: 13 november 2006, 13:32:24
Ort: Stockholm / Uppsala

Inlägg av mickej »

Jag får lite error när jag försöker köra build, här är några av dom...



Error[127] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 32 : Too many arguments

Kod: Markera allt

      set_led C0, off
      set_led C1, off
      set_led C2, on
      set_led C3, on

Error[113] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 19 : Symbol not previously defined (onoff)

Kod: Markera allt

     if onoff == 1
Error[113] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 22 : Symbol not previously defined (led)

Kod: Markera allt

     BCF  led    ; Släck LED

Error[128] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 22 : Missing argument(s)

Kod: Markera allt

     BCF  led    ; Släck LED
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Du har nog påslaget att kopilatorn skall göra skillnad på små och stora bokstäver. ON, OFF är definierade med versaler (stora bokstäver) i början av sodjans kod, medan de är skrivna med små bokstäver i själva koden.

Byt ut alla "on" till "ON" och alla "off" till "OFF" så funkar det nog.

Dessutom där det står "BSF led" och "BCF led" i macro definitionen skall nog stå "BSF led,onoff" och "BCF led,onoff"
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Småbuggar, bara att läsa och fixa till...

Kod: Markera allt

#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
portc_tmp    ; shadow reg
   endc

ON    equ 1
OFF   equ 0

set_led macro led, onoff
     if onoff == 1
        BSF  portc_tmp, led    ; Tänd LED (i shadow reg)
     else
        BCF  portc_tmp, led    ; Släck LED (i shadow reg)
     endif
     movf    portc_tmp, w
     movwf   portc            ; Uppdatera LEDs
     endm

   org 0

start
     bsf STATUS,RP0
     clrf TRISC
     bcf STATUS,RP0

;   Sätt startläge på LEDs.
     set_led 0, off
     set_led 1, off
     set_led 2, on
     set_led 3, on

 
MainLoop

     set_led 0, on
     set_led 1, on
     
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. 
            

     set_led 0, off
     set_led 1, off

OffDelayLoop
   decfsz   Delay1,f   ; same delay as above
   goto   OffDelayLoop
   decfsz   Delay2,f
   goto   OffDelayLoop
   goto   MainLoop   ; Do it again...
   end 
Å så den andra versionen :

Kod: Markera allt

#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

ON    equ 1
OFF   equ 0

set_led macro led, onoff
     if onoff == 1
        BSF  portc, led    ; Tänd LED (i shadow reg)
     else
        BCF  portc, led    ; Släck LED (i shadow reg)
     endif
     endm

   org 0

start
     banksel trisc
     clrf TRISC
     banksel portc

;   Sätt startläge på LEDs.
     set_led 0, off
     set_led 1, off
     set_led 2, on
     set_led 3, on

 
MainLoop

     set_led 0, on
     set_led 1, on
     
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. 
            

     set_led 0, off
     set_led 1, off

OffDelayLoop
   decfsz   Delay1,f   ; same delay as above
   goto   OffDelayLoop
   decfsz   Delay2,f
   goto   OffDelayLoop
   goto   MainLoop   ; Do it again...
   end 
   
mickej
Inlägg: 34
Blev medlem: 13 november 2006, 13:32:24
Ort: Stockholm / Uppsala

Inlägg av mickej »

nu börjar det likna någon, men vi är tillbaka på ruta ett..

set_led 0, on ; Funderar inte
set_led 1, on ; Fungerar

Alltså "set_led 1, on" nollställer dom andra portarna...
Använder jag följande kod,
set_led 0, on
set_led 1, on
set_led 2, on
set_led 3, on

så fungerar bara "set_led 3, on".

.M
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Alltså "set_led 1, on" nollställer dom andra portarna...

Med båda versionerna ?
Har du stängt av de analoga funktioner ?
mickej
Inlägg: 34
Blev medlem: 13 november 2006, 13:32:24
Ort: Stockholm / Uppsala

Inlägg av mickej »

Nu har jag fått den versionen med shadow reg att fungera...
Tack för all hjälp...

Version nr 2 fungerar fortfarade inte. Ja, jag har slagit av
dom analoga funktioner med "CLRF ANSEL ;digital I/O".

.M
Skriv svar