clrf TMR1H BANK1 MOVLW B'00000111' ; prédiviseur de 256 : clrf TMR1L bsf PIE1,TMR2IE ; autoriser interrupt en durée de débordement : 65.53 ms bank1 TMR2 MOVWF OPTION_REG bsf PIE1,TMR1IE ; autoriser interruptions movlw 0x7c BANK0 timer 1 movwf PR2 CLRF TMR0 bank0 ; repasser banque 0 BANK0 MOVLW B'10100000' ; autorisation de bsf INTCON,PEIE ; interruptions bsf INTCON,PEIE ; interruptions l'intterupt Timer0 périphériques en service périphériques en service MOVWF INTCON bsf INTCON,GIE ; interruptions en bsf INTCON,GIE ; interruptions en ; T0= 4*Tosc*26*Prédiv service service ; n’oublier pas de baisser le flag à la fin. movlw B'00110001' ; prédiviseur 8, movlw B'01001110' bcf INTCON,2 ; tay7 l flag daroori TMR1ON = bit 0, b7,6 innutiles movwf T2CON ; b0 et b1 pour prédiv b1=1 movwf T1CON b0=0 : 16, b3==>b6 postdiv : 1001 = 10 et ; Programme principal non 9 ( voir datasheet ), b2 : TMR2 ON, B7 debut_programme innutilisé goto debut_programme ; Temps = Tcyc * prédiv * postdiv * (PR2+1) ; n’oublier pas de baisser le flag à la fin. ; n’oublier pas de baisser le flag à la fin. bcf PIR1,TMR1IF bcf PIR1,TMR2IF ; tay7 l flag daroori
CAN PWM Généralité
BANK1 movlw B'01100011' ; periode = 100 µs BANK0 macro MOVLW 0XFF movwf PR2 ; Tc=T timer 2 sans postdiv bcf STATUS,RP0 MOVWF TRISA ; PORTA en entrée bcf STATUS,RP0 bcf STATUS,RP1 MOVLW b'10001000' ; config de ADCON1 debut endm MOVWF ADCON1 ; bit7 = 1 : justification à movlw B'00000000' ; droite, b5,6,4 innutilisés, b0,b1,b2,b3 pour movwf CCPR1L BANK1 macro la config des pins ( 1000 : RA3 Vref+ et RA2 loop bsf STATUS,RP0 Vref-, les autre en analogiques ) incf CCPR1L,1 bcf STATUS,RP1 BANK0 movlw 0x3c endm AGAIN subwf CCPR1L,0 MOVLW b'10000001' ; config de ADCON0 btfss STATUS,Z BANK2 macro MOVWF ADCON0 ; diviseur de 32 ( b7 = 1, goto depart bcf STATUS,RP0 b6 = 0 ), b5,4,3 à 000 ==> RA0/AN0, bit 0 : goto debut bsf STATUS,RP1 ADON =1 : CAN On depart endm CALL TEMPO1 ; tempo de 20 µs = Taq + T bsf CCP1CON,5 qui dépend de la T(°C) + ... bsf CCP1CON,4 ; bit 4 et 5 pour activer les BANK3 macro BSF ADCON0,2 ; activer le Go/Done bits qui complètent le nombre de 10 bits bsf STATUS,RP0 ENCORE BTFSC ADCON0,2 bsf STATUS,RP0 bsf STATUS,RP1 GOTO ENCORE ; la CAN n'est pas terminé bcf TRISC,2 ; la pin RC2 : CCP1 en output endm CALL TEMPO2 ; Wait 2*Tad = 3.2 µs bcf STATUS,RP0 ; ********************************** MOVF ADRESH,0 MOVWF PORTD movlw B'00000101' org 0x000 ; Adresse de BSF STATUS,RP0 ; movwf T2CON ; prescale =1 , timer2 is on départ après reset MOVF ADRESL,0 bsf CCP1CON,3 ; pour activer le mode PWM goto init BCF STATUS,RP0 bsf CCP1CON,2 org 0x04 MOVWF PORTB call tempo push movwf w_temp GOTO AGAIN ; CAN encore goto loop ;save w & status ; T = 22 µs tempo: swapf STATUS,W TEMPO1 MOVLW 0X23 movlw 0xff movwf status_temp MOVWF CMP1 movwf mavar BOUC1 DECFSZ CMP1,1 B2: swapf status_temp,W ; GOTO BOUC1 movlw 0xaf restore w & status RETURN movwf compt movwf STATUS ; Temporisation de 3.2µs tempo d'attente ) B1: swapf w_temp, 1 TEMPO2 MOVLW 0X07 decfsz compt,1 swapf w_temp, W MOVWF CMP2 goto B1 retfie BOUC2 DECFSZ CMP2,1 decfsz mavar,1 ;*********************************** GOTO BOUC2 goto B2 LIST p=16F877 RETURN return #include <p16F877.inc>