;********************************************************************** ; * ; Filename: pwm.asm * ; Date: 13/03/2006 * ; File Version: 1 * ; * ; Author: Paul HEROIN * ; Company: Bricotronique.com * ; * ; * ;********************************************************************** ; * ; Files required: * ; * ; * ; * ;********************************************************************** ; * ; Notes:Utilse n'unité de PWM (pulse with modulation) du PIC16F628 * ; afin de faire pulser une LED sur la broche 9 du PIC * ; * ; * ; * ;********************************************************************** list p=16f628 ; list directive to define processor #include ; processor specific variable definitions __CONFIG H'3F32' ;fréquence réglable sur potentiomètre externe #DEFINE LED PORTA,3 ;***** VARIABLE DEFINITIONS w_temp EQU 0x70 ; variable used for context saving status_temp EQU 0x71 ; variable used for context saving CBLOCK 0x20 etat : 1 ;etat de la led etat_test :1 ;sauvegarde de l'etat pour les tests ENDC ;********************************************************************** ORG 0x000 ; processor reset vector goto main ; go to beginning of program ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents swapf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ;todo ; on fait les test si l'etat correspont à i alors on appelle etati (i allant de 0 à 20) movfw etat movwf etat_test movlw D'1' subwf etat_test,f btfsc STATUS,Z call etat1 movfw etat movwf etat_test movlw D'2' subwf etat_test,f btfsc STATUS,Z call etat2 movfw etat movwf etat_test movlw D'3' subwf etat_test,f btfsc STATUS,Z call etat3 movfw etat movwf etat_test movlw D'4' subwf etat_test,f btfsc STATUS,Z call etat4 movfw etat movwf etat_test movlw D'5' subwf etat_test,f btfsc STATUS,Z call etat5 movfw etat movwf etat_test movlw D'6' subwf etat_test,f btfsc STATUS,Z call etat6 movfw etat movwf etat_test movlw D'7' subwf etat_test,f btfsc STATUS,Z call etat7 movfw etat movwf etat_test movlw D'8' subwf etat_test,f btfsc STATUS,Z call etat8 movfw etat movwf etat_test movlw D'9' subwf etat_test,f btfsc STATUS,Z call etat9 movfw etat movwf etat_test movlw D'10' subwf etat_test,f btfsc STATUS,Z call etat10 movfw etat movwf etat_test movlw D'11' subwf etat_test,f btfsc STATUS,Z call etat11 movfw etat movwf etat_test movlw D'12' subwf etat_test,f btfsc STATUS,Z call etat12 movfw etat movwf etat_test movlw D'13' subwf etat_test,f btfsc STATUS,Z call etat13 movfw etat movwf etat_test movlw D'14' subwf etat_test,f btfsc STATUS,Z call etat14 movfw etat movwf etat_test movlw D'15' subwf etat_test,f btfsc STATUS,Z call etat15 movfw etat movwf etat_test movlw D'16' subwf etat_test,f btfsc STATUS,Z call etat16 movfw etat movwf etat_test movlw D'17' subwf etat_test,f btfsc STATUS,Z call etat17 movfw etat movwf etat_test movlw D'18' subwf etat_test,f btfsc STATUS,Z call etat18 movfw etat movwf etat_test movlw D'19' subwf etat_test,f btfsc STATUS,Z call etat19 movfw etat movwf etat_test movlw D'20' subwf etat_test,f btfsc STATUS,Z call etat20 movfw etat movwf etat_test movlw D'21' subwf etat_test,f btfsc STATUS,Z call etat21 movlw D'000' ;on met 000 ds TMR0 , plus cette valeur est grande, ; plus le compteur compte rapidement (limite 256) movwf TMR0 bcf INTCON, T0IF ;on remet les flags d'interruption à 0 incf etat,f ;on change d'etat. ; /todo swapf 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 ; fonctions etat1 ;dans l'etat 1, luminosité minimale movlw B'00001000' ; movwf CCPR1L ; ce registre règle directement le rapport cyclique "duty cycle" return etat2 movlw B'00001100' ;luminosité un peu plus forte movwf CCPR1L return etat3 movlw B'00010000' ;et ainsi de suite... movwf CCPR1L return etat4 movlw B'00011000' movwf CCPR1L return etat5 movlw B'00100000' movwf CCPR1L return etat6 movlw B'00110000' movwf CCPR1L return etat7 movlw B'01000000' movwf CCPR1L return etat8 movlw B'01100000' movwf CCPR1L return etat9 movlw B'10000000' movwf CCPR1L return etat10 movlw B'11000000' movwf CCPR1L return etat11 movlw B'11111111' movwf CCPR1L return etat12 movlw B'11000000' movwf CCPR1L return etat13 movlw B'10000000' movwf CCPR1L return etat14 movlw B'01100000' movwf CCPR1L return etat15 movlw B'01000000' movwf CCPR1L return etat16 movlw B'00110000' movwf CCPR1L return etat17 movlw B'00100000' movwf CCPR1L return etat18 movlw B'00011000' movwf CCPR1L return etat19 movlw B'00010000' movwf CCPR1L return etat20 movlw B'00001100' movwf CCPR1L return etat21 movlw B'00001000' movwf CCPR1L clrf etat return ;principal main init ; initialisation des registres clrf TMR0 bsf STATUS, RP0 ;on fait ce qu'il y a à faire ds la banque 1 movlw B'00000111' movwf OPTION_REG ;on divise l'horloge par 256 pour TMR0 movlw B'00000000' movwf TRISA ;le portA sont des sorties movlw B'00000000' movwf TRISB ;on met des sorties sur le PORTB movlw B'11111111' movwf PR2 ;règle la valeur de la période de PWM bcf STATUS, RP0 ;on fait ce qu'il y a à faire ds la banque 0 movlw B'10100000' movwf INTCON ;on autorise les interruptions sur TMR0 movlw B'00001111' ;PWM mode movwf CCP1CON movlw B'0111111' ;activer TMR2 avec le décomptage max movwf T2CON movlw B'00001000' ;configuration de l'unité CCP du PIC movwf CCPR1L bcf STATUS, RP0 ;on se remet ds la banque 0 movlw 1 movwf etat ;début programme start nop goto start END ; directive 'end of program'