PIC 16F690 LED dimmer
Postat: 9 november 2008, 21:20:15
Hej. Jag är en nybörjare som skaffat mig en pickit2 och provat mig fram med de exempel jag fick med CD skiva från Microchip. Efter alla blinka LED finesser blev jag nyfiken på att dimmra LED med hårdvaru PWM som är inbyggd i 16F690. Tanken är att styra ljusstyrka på en LED med två knappar. Efter en svår vecka, en del av läsande i datasheet och kliande på huvudet fick jag fram ett stycke kod som fungerar, kan man säga. Kan jag få era synpunkter eftersom jag tror att det finns mycket dåliga lösningar i koden. Tack.
Kod: Markera allt
; Styrning av ljusstyrka på en LED med två knappar
; PIC 16F690 @ 4MHz
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
d1
d2
endc
org 0
banksel ANSEL
clrf ANSEL
banksel TRISC
clrf TRISC
movlw b'00010000' ; Stäng PWM pin utgång
movwf TRISC
bsf TRISA,TRISA2 ; Sätta RA2 som ingång
;(RA3 på 16F690 är ingång i default)
banksel PR2 ; PWM period
clrf PR2
movlw b'11111111'
movwf PR2
banksel CCP1CON ; Konfigurera CCP modul för PWM
movlw b'01101100'
movwf CCP1CON
banksel CCPR1L ;PWM duty cycle
movlw b'00000000'
movwf CCPR1L
banksel PIR1 ; Rensa TMR2IF
bcf PIR1,TMR2IF ; interrupt flagga i PIR1 reg
banksel T2CON ; Sätta Timer2 prescaler
movlw b'00000111'
movwf T2CON ; Starta Timer2
Loop:
banksel PIR1
btfss PIR1,TMR2IF ; Vänta för Timer2 overflow
banksel TRISC
clrf TRISC ; Starta PWM
banksel PORTA
btfss PORTA,2 ; Knapp NER RA2 intryckt?
goto FadeDown ; JA
btfsc PORTA,3 ; Knapp UP RA3 intryckt?
goto Loop ; JA
FadeUp:
call Delay_fade ; Vänta i 0.008 sec
banksel CCPR1L
incfsz CCPR1L,f ; Höja PWM duty cycle.
goto Loop ; Om max go till Max
call Max
FadeDown:
call Delay_fade
banksel CCPR1L
decfsz CCPR1L,f ; Sänka PWM duty cycle.
goto Loop ; Om noll go till Min
call Min
Max:
banksel CCPR1L ; Sätta PWM duty cycle till max
movlw b'11111111'
movwf CCPR1L
banksel PORTA
btfsc PORTA,2 ; Lås max läge
goto Max ; och vänta för NER knappen
goto Loop
Min:
banksel CCPR1L ; Sätta PWM duty cycle till minimum
movlw b'00000000'
movwf CCPR1L
banksel PORTA ; Lås min läge
btfsc PORTA,3 ; och vänta för UP knappen
goto Min
goto Loop
Delay_fade: ; Mjuk övergång i ljusstyrka
movlw 0x3E
movwf d1
movlw 0x07
movwf d2
Delay_fade_0:
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_fade_0
goto $+1
nop
return
end