Sida 2 av 2
Postat: 5 december 2006, 08:53:30
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...
Postat: 5 december 2006, 18:13:09
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
Postat: 5 december 2006, 23:05:28
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
Postat: 5 december 2006, 23:36:08
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
Postat: 6 december 2006, 00:17:30
av mickej

, 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
Postat: 6 december 2006, 00:33:21
av RasmusB
slå upp instruktionerna bsf och bcf i databladet så har du en ledtråd där.
Postat: 6 december 2006, 10:42:10
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...]
Postat: 6 december 2006, 21:39:06
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)
Error[113] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 22 : Symbol not previously defined (led)
Error[128] C:\DEVELOP\PROJEKT\NR2_PORTSTYRD_BLINK\NR2_PORTSTYRD_BLINK.ASM 22 : Missing argument(s)
Postat: 6 december 2006, 23:29:58
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"
Postat: 6 december 2006, 23:40:51
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
Postat: 7 december 2006, 00:28:38
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
Postat: 7 december 2006, 02:41:40
av sodjan
> Alltså "set_led 1, on" nollställer dom andra portarna...
Med båda versionerna ?
Har du stängt av de analoga funktioner ?
Postat: 7 december 2006, 10:49:26
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