PWM med Pic assembler
Postat: 15 oktober 2007, 16:52:15
Det här är något av en Sisyfossten för mig. Har bankat i huvudet i bordet många gånger under mina försök att skapa en väl fungerande mjukvaruPWM i assembler.
Har tagit tag i det ytterligare en gång idag, och resultatet blir en hysteriskt blinkande epilepsiframkallande RGB-diod. Hårdvaran är en 12F675 med intern oscillator. På tre av utgångarna finns anslutningarna till transistorer kopplade till en RGB-diod.
Här är koden:
Edit: Frågan är alltså varför dioden blinkar istället för att sänka ljusstyrkan?
Har tagit tag i det ytterligare en gång idag, och resultatet blir en hysteriskt blinkande epilepsiframkallande RGB-diod. Hårdvaran är en 12F675 med intern oscillator. På tre av utgångarna finns anslutningarna till transistorer kopplade till en RGB-diod.
Här är koden:
Kod: Markera allt
list p=12f675 ; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
INT_VAR UDATA_SHR 0x20
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
d1 RES 1
d2 RES 1
counter RES 1 ;Main counter
led1 RES 1 ;Led counters
led2 RES 1
led3 RES 1
#define green GPIO,0
#define blue GPIO,1
#define red GPIO,2
;**********************************************************************
RESET_VECTOR CODE 0x000 ; processor reset vector
goto main ; go to beginning of program
INT_VECTOR CODE 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
decfsz led1,1 ;Decrease led counters
goto dec2
bcf red ;Shut off led if zero
dec2
decfsz led2,1
goto dec3
bcf green
dec3
decfsz led3,1
goto decC
bcf blue
decC
decfsz counter,1 ;Decrease maincounter
goto contRGB ;Jump if not zero
call setRGB ;Reset values if zero
contRGB
bcf INTCON, T0IF
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
; these first 4 instructions are not required if the internal oscillator is not used
MAIN CODE
main
;call 0x3FF ; retrieve factory calibration value
;bsf STATUS,RP0 ; set file register bank to 1
;movwf OSCCAL ; update register with factory cal value
;bcf STATUS,RP0 ; set file register bank to 0
; remaining code goes here
;Setup port
bcf STATUS, RP0
clrf GPIO
movlw 07h
movwf CMCON
bsf STATUS,RP0
clrf ANSEL
movlw b'00011000'
movwf TRISIO
bcf STATUS,RP0
;Enable Tmr0
clrf TMR0
bsf STATUS,RP0
movlw b'11000000' ;
movwf OPTION_REG
bcf STATUS,RP0
;Enable Tmr0 interrupt
BSF INTCON, T0IE
BSF INTCON, GIE
;Set up RGB values
call setRGB
MainLoop
goto MainLoop
setRGB
;Setup RGB-values, preload Tmr0
;Set interval to 100uS
;Internal oscillator, 4MHz. Tcyc=0,00000025s*4=0,000001s
movlw d'20'
movwf TMR0
movlw d'100'
movwf counter
movlw d'40'
movwf led1
movlw d'40'
movwf led2
movlw d'40'
movwf led3
bsf red
bsf green
bsf blue
return
; initialize eeprom locations
EE CODE 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'