TITLE "PIC16F88 7chPWM_PP" ; ;-------------------------------------------------------------------- ; 7チャンネルPWM式制御器用プログラム ; CPU:16F88-I/P CLOCK:INTOSC@8MHz ; Programing by Legoemon ;-------------------------------------------------------------------- ; FileName:7chPWM_PP SUM=74E8 VER.1.0 2010.03.18 ; 2010.04.01 ;-------------------------------------------------------------------- LIST P=16F88 include ;---------------------------------------------------------------------------------------------------------------------------------- ;デバッグ時はこの行を活かしてした下の行をコメント行にする。 __CONFIG _CONFIG1, _CP_OFF &_DEBUG_ON & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _INTRC_IO & _WRT_PROTECT_OFF & _LVP_OFF & _CPD_OFF ;---------------------------------------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------------------------- ;リリース時はこの行を活かしてした上の行をコメント行にする。 ; __CONFIG _CONFIG1, _CP_OFF &_DEBUG_OFF & _WDT_ON & _BODEN_ON& _PWRTE_ON & _INTRC_IO & _WRT_PROTECT_OFF & _LVP_OFF & _CPD_OFF ;---------------------------------------------------------------------------------------------------------------------------------- __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ;----- General purpose register ----- ; ;************ bank memory 20-6F start *********** ; VARIABLE PA_BUF = H'20' ; PORT_A BUFF VARIABLE PB_BUF = H'21' ; PORT_B BUFF VARIABLE WORK = H'22' ; WORK MEMORY VARIABLE CNT = H'23' ; VARIABLE R3 = H'24' ;working ram VARIABLE R4 = H'25' ;working ram VARIABLE R5 = H'26' ;working ram VARIABLE R6 = H'27' ;working ram VARIABLE R7 = H'28' ;working ram VARIABLE R8 = H'29' ;working ram VARIABLE usec50F = H'2A' ; 50usec FLUG VARIABLE msec10F = H'2B' ; 10msec FLUG VARIABLE msec100F = H'2C' ; 100msec FLUG VARIABLE SEC1FLG = H'2D' ; 1sec FLUG VARIABLE msec10 = H'2E' ; 10msec COUNTER VARIABLE msec100 = H'2F' ; 100msec COUNTER VARIABLE sec1 = H'30' ; 1sec COUNTER VARIABLE PWM_CTR = H'31' ; PWM Period Counter VARIABLE PWM_DTY0 = H'32' ; PWM ch0 Duty Counter VARIABLE PWM_DTY1 = H'33' ; PWM ch1 Duty Counter VARIABLE PWM_DTY2 = H'34' ; PWM ch2 Duty Counter VARIABLE PWM_DTY3 = H'35' ; PWM ch3 Duty Counter VARIABLE PWM_DTY4 = H'36' ; PWM ch4 Duty Counter VARIABLE PWM_DTY5 = H'37' ; PWM ch5 Duty Counter VARIABLE PWM_DTY6 = H'38' ; PWM ch6 Duty Counter VARIABLE PWM_BUF = H'39' ; PWM OUTPUT Buffer VARIABLE ADCH0 = H'40' ; CH0 A/D DATA VARIABLE ADCH1 = H'41' ; CH1 A/D DATA VARIABLE ADCH2 = H'42' ; CH2 A/D DATA VARIABLE ADCH3 = H'43' ; CH3 A/D DATA VARIABLE ADCH4 = H'44' ; CH4 A/D DATA VARIABLE ADCH5 = H'45' ; CH5 A/D DATA VARIABLE ADCH6 = H'46' ; CH6 A/D DATA VARIABLE BCD_1H = H'61' ; BCD1~100 VARIABLE BCD_1L = H'62' ; BCD1~10&~1 ; ; ;************ bank memory 20-6F end *********** ; ; ;************ common memory 70-7F start *********** ; VARIABLE W_ = H'70' ; VARIABLE STATUS_ = H'71' ;for interrupt routine VARIABLE FSR_ = H'72' ;for interrupt routine VARIABLE R_ = H'73' ;for interrupt routine VARIABLE H_byte = H'74' ;working ram VARIABLE L_byte = H'75' ;working ram VARIABLE R0 = H'76' ;working ram VARIABLE R1 = H'77' ;working ram VARIABLE R2 = H'78' ;working ram ; VARIABLE H_temp = H'79' ;working ram VARIABLE L_temp = H'7A' ;working ram ; VARIABLE H_AD = H'7B' ; A/D BUF H register VARIABLE L_AD = H'7C' ; A/D BUF L register VARIABLE ADCH = H'7D' ; A/D channel VARIABLE wait_cn = H'7E' ; delay counter2 VARIABLE CURSOR = H'7F' ; LCD cursor position(0-79) ; ;************ common memory 70-7F end *********** ; ; ;************ bank memory A0-EF start *********** ; VARIABLE LCD_BUF1 = H'A0' ; LCD display buffer1(80Bytes) ; ;************ bank memory A0-EF end *********** ; ; ;************ bank memory 120-16F start *********** ; VARIABLE LCD_BUF2 = H'20' ; LCD display buffer2(80Bytes) ; ;************ bank memory 120-16F end *********** ; ; ;************ bank memory 1A0-1EF start *********** ; VARIABLE LCD_BUF3 = H'A0' ; LCD display buffer3(80Bytes) ; ;************ bank memory 1A0-1EF end *********** ; PAGE ; ;----------------------------------------------------------- ; I/O Port Constant ;----------------------------------------------------------- ; RS_PORT EQU PORTB ; RS-232C port RS_RxD EQU 2 ; RS-232C input port (RB2) RS_TxD EQU 5 ; RS-232C output port (RB5) ; ;----------------------------------------------------------- ; ather constant ;----------------------------------------------------------- ; ADCON0set EQU H'C1' ; channel set & A/D ON TMR50us EQU D'215' ; 8,000,000Hz/4/2=1us 256-50=206 + 9 PWM_PRD EQU H'7F' ; PWM Period ; ;-------------------------------------------------------- ; PAGE ; ;******************************************************** ;* Top of program * ;******************************************************** ; ORG 0 nop GOTO START ;GOTO Main program ORG 4 GOTO INT ; ;******************************************************** ;******************************************************** ;*    * ;* Program Start * ;*    * ;******************************************************** ;******************************************************** ; START ; ;******************************************************** ;* Initialize * ;******************************************************** ; BCF STATUS,RP0 ;BANK0 BCF STATUS,RP1 ; BCF INTCON,GIE ; ALL NONMASK INT DISABLE CLRF PORTA ; CLRF PORTB ; ; ;*** Bank=1 *** ; BSF STATUS,RP0 ;BANK1 ;(0)NC ;(111)IRCF2-IRCF0 8MHz ;(0)OSTS ;(1)IOFS ;(00)SCS movlw 0x78 movwf OSCCON BSF OPTION_REG,NOT_RBPU ; portB pull up OFF! BSF OPTION_REG,INTEDG ; RB0/INT Rising Edge ;TIMER0 BCF OPTION_REG,T0CS ; INTERNAL CLK SORCE BCF OPTION_REG,PSA ; priscaler=TMR0 BCF OPTION_REG,PS2 ; TMR0 priscaler=1:2 BCF OPTION_REG,PS1 ; BCF OPTION_REG,PS0 ; ;A/D BANKSEL ANSEL ; Select Bank of ANSEL MOVLW B'1111111' ; All Analog inputs MOVWF ANSEL ; MOVLW B'10000000' ; RightSet REF=Vdd,Vss MOVWF ADCON1 ; ;USART(Tx Mode) ; MOVLW H'20' ; Set Async mode MOVLW H'02' ; Tx not use MOVWF TXSTA ; Set Tx mode MOVLW D'12' ; Set Baud Rate 9.6bps AT 8MHz MOVWF SPBRG ; Set BRG Reg ;I/O PORT MOVLW B'00111111' ;PA:012345=IN 67=OUT 5=mclr MOVWF TRISA ;PortA DIR setup MOVLW B'11000000' ;PB:012345=OUT 67=IN(A/D) MOVWF TRISB ;PortB DIR setup ; ;*** Bank=0 *** ; BCF STATUS,RP0 ;BANK0 ; ;TIMER0 ; MOVLW TMR10ms MOVLW TMR50us MOVWF TMR0 ; ;AD MOVLW ADCON0set ;RCOSC,AN0,START,INT_RST,ADON MOVWF ADCON0 BCF PIR1,ADIF ;A/D INT FLAG CLEAR ; ;USART(Rx Mode) ; MOVLW H'90' ; SET Async & Enable MOVLW H'00' ; NOT USE MOVWF RCSTA ; ;TIMER2 MOVLW B'0000011' ; TIMER2 INIT MOVLW 0 MOVWF T2CON ; MOVLW B'101100' ;CCP1CON=PWM MODE MOVLW 0 MOVWF CCP1CON ;INT ; BCF INTCON,EEIE ; EEROM WR INT DISABLE BSF PIE1,ADIE ; A/D INT ENABLE BSF ADCON0,GO BSF INTCON,TMR0IE ; TMRO INT ENABLE BCF INTCON,INTE ; RB0 INT DISABLE BCF INTCON,RBIE ; RB4-7 INT DISABLE BSF INTCON,PEIE ; Periferal INT ENABLE MOVLW D'200' ; 50us x 200 = 10ms MOVWF msec10 ; COUNTER RESET MOVLW D'10' ; 10ms x 10 = 100ms MOVWF msec100 ; COUNTER RESET MOVLW D'1' MOVWF sec1 ; COUNTER RESET MOVLW D'0' MOVWF ADCH ; A/D channel=0 CLRW MOVWF ADCH0 MOVWF PWM_DTY0 MOVWF ADCH1 MOVWF PWM_DTY1 MOVWF ADCH2 MOVWF PWM_DTY2 MOVWF ADCH3 MOVWF PWM_DTY3 MOVWF ADCH4 MOVWF PWM_DTY4 MOVWF ADCH5 MOVWF PWM_DTY5 MOVWF ADCH6 MOVWF PWM_DTY6 MOVWF PWM_CTR BSF INTCON,GIE ; ALL NONMASK INT ENABLE GOTO MAIN ; ; PAGE ; ;********************************************************************** ;********************************************************************** ;******* MAIN Program ******* ;********************************************************************** ;********************************************************************** ; MAIN CLRWDT ; Clear WatchDogTimer BTFSC msec10F,0 ; 10msec PASSED ? CALL MSEC10PROGRESS BTFSC msec100F,0 ; 100msec PASSED ? CALL MSEC100PROGRESS GOTO MAIN ; ;*********************** ;* 10msec経過 * ;*********************** ; MSEC10PROGRESS BCF msec10F,0 ;========================================================= BTFSC PORTA,7 B B1 BSF PORTA,7 B B2 B1 BCF PORTA,7 B2 ;========================================================= ;--------------------------------------------------------- INCF ADCH ,F ; NEXT AD CHANNEL MOVLW D'7' SUBWF ADCH,W BnC INT_AD1 CLRF ADCH ; A/D CHANNEL = 0 INT_AD1 MOVFW ADCH MOVWF R0 BCF STATUS,C RLF R0,F RLF R0,F RLF R0,W IORLW ADCON0set MOVWF ADCON0 ; BSF PORTA,7 MOVLW D'15' MOVWF R0 ACQ ;Wait the required acquisition time DECFSZ R0, F GOTO ACQ ; BCF PORTA,7 BSF ADCON0,GO BCF msec10F,0 ;---------------------------------------------------------- RETURN ;*********************** ;* 100msec経過 * ;*********************** ; MSEC100PROGRESS BCF msec100F,0 RETURN ; ;*********************** ;* 1秒経過 * ;*********************** ; SEC1PROGRESS ; CALL RS_TX BCF SEC1FLG,0 RETURN ;******************************************************** ;******************************************************** ;* Interrupt Routin * ;******************************************************** ;******************************************************** INT MOVWF W_ SWAPF STATUS,W MOVWF STATUS_ MOVFW FSR MOVWF FSR_ BCF STATUS,RP1 ;BANK0 BCF STATUS,RP0 ;BANK0 ;******************************************************** ;* TMR0 50us Timer Interrupt * ;******************************************************** BTFSS INTCON,TMR0IF ; TMR0 Timer Interrupt B INT_AD ; otherwise jump MOVLW TMR50us MOVWF TMR0 ; BSF usec50F,0 ; 50usec FLUG ON ;========================================================= ; BSF PORTA,7 ;========================================================= MOVFW PWM_CTR BZ INT01 DECF PWM_CTR,F MOVFW PWM_DTY0 BZ INT_D00 DECF PWM_DTY0,F BSF PORTB,0 B INT_D10 INT_D00 BCF PORTB,0 INT_D10 MOVFW PWM_DTY1 BZ INT_D11 DECF PWM_DTY1,F BSF PORTB,1 B INT_D20 INT_D11 BCF PORTB,1 INT_D20 MOVFW PWM_DTY2 BZ INT_D21 DECF PWM_DTY2,F BSF PORTB,2 B INT_D30 INT_D21 BCF PORTB,2 INT_D30 MOVFW PWM_DTY3 BZ INT_D31 DECF PWM_DTY3,F BSF PORTB,3 B INT_D40 INT_D31 BCF PORTB,3 INT_D40 MOVFW PWM_DTY4 BZ INT_D41 DECF PWM_DTY4,F BSF PORTB,4 B INT_D50 INT_D41 BCF PORTB,4 INT_D50 MOVFW PWM_DTY5 BZ INT_D51 DECF PWM_DTY5,F BSF PORTB,5 B INT_D60 INT_D51 BCF PORTB,5 INT_D60 MOVFW PWM_DTY6 BZ INT_D61 DECF PWM_DTY6,F BSF PORTA,6 B INT_T0_10ms INT_D61 BCF PORTA,6 B INT_T0_10ms INT01 MOVLW PWM_PRD MOVWF PWM_CTR ; PWM Period Counter Reset MOVFW ADCH0 MOVWF PWM_DTY0 MOVFW ADCH1 MOVWF PWM_DTY1 MOVFW ADCH2 MOVWF PWM_DTY2 MOVFW ADCH3 MOVWF PWM_DTY3 MOVFW ADCH4 MOVWF PWM_DTY4 MOVFW ADCH5 MOVWF PWM_DTY5 MOVFW ADCH6 MOVWF PWM_DTY6 ; ;*** 10ms Timer *** ; INT_T0_10ms DECF msec10,F ; 10msec COUNTER BNZ INT_T0_R MOVLW D'200' ; 50us x 200 = 10ms MOVWF msec10 ; COUNTER RESET BSF msec10F,0 ; 10msec FLUG ON ; ;*** 100ms Timer *** ; INT_T0_100ms DECF msec100,F ; 100msec COUNTER BNZ INT_T0_R MOVLW D'10' ; 10ms x 10 = 100ms MOVWF msec100 ; COUNTER RESET BSF msec100F,0 ; 100msec FLUG ON INT_T0_R BCF INTCON,TMR0IF ; clear TMR0 timeup interrupt flug ; ;******************************************************** ;* Interrupt by End of A/D Converjon * ;******************************************************** ; INT_AD BTFSS PIR1,ADIF ; End of A/D Converjon Interrupt B INT_RB0 ; Otherwise jump MOVFW ADRESH MOVWF H_AD BSF STATUS,RP0 ;BANK1 MOVFW ADRESL BCF STATUS,RP0 ;BANK0 MOVWF L_AD ;--------------------------- 0-1023 to 0-127 ------------ CLRC RRF H_AD,F ; SHIFT RIGHT 0-511 RRF L_AD,F ; SHIFT RIGHT CLRC RRF H_AD,F ; SHIFT RIGHT 0-255 RRF L_AD,F ; SHIFT RIGHT CLRC RRF H_AD,F ; SHIFT RIGHT 0-127 RRF L_AD,F ; SHIFT RIGHT ;-------------------------------------------------------- MOVLW ADCH0 ; TOP ADDRESS SET ADDWF ADCH,W ; CHANNEL PLUS MOVWF FSR MOVFW L_AD MOVWF INDF ;-------------------------------------------------------- INT_AD_END BCF PIR1,ADIF ; clear End of A/D Converjon interrupt flug ;******************************************************** ;* interrupt by RB0 changed * ;******************************************************** INT_RB0 BTFSS INTCON,INTF ; interrupt by RB0 changed B INT_RBIE ; Otherwise jump BCF INTCON,INTF ; clear RB0 changed interrupt flug ; ;******************************************************** ;* RB port change interrupt * ;******************************************************** INT_RBIE BTFSS INTCON,RBIF ; RB port change interrupt B INT_R ; Otherwise jump MOVWF R_ ; save Wreg INT_RBIE_R BCF INTCON,RBIF ; clear RB0 port changed interrupt flug ;******************************************************** ;* interruot end processing * ;******************************************************** INT_R ;========================================================= ; BCF PORTA,7 ;========================================================= MOVFW FSR_ MOVWF FSR SWAPF STATUS_,W MOVWF STATUS SWAPF W_,F SWAPF W_,W RETFIE END