;*************************
; adc to pwm uso adresh ed adresl
; converte un segnale analogico sul pin 3 AN4
; lo restituisce in pwm sul pin 9 RB3
; filtrato da un FPB il risultato ottimo.
; con qx da 20Mhz periodo pwm di 50 uS
; una conversione ogni 50 uS 
; clk per adc clk/8
; vref- =+2,5V al pin ra2 pin 1 
; it9dpx 29 giu 2013 16:00 eccellente
; ATTENZIONE MPLAB6.20 non simula la pwm
;*************************

   PROCESSOR       16F88
   RADIX           DEC
   INCLUDE         "P16F88.INC" 

   ERRORLEVEL      -302
   ERRORLEVEL      -305

   
    __CONFIG  H'2007', H'2F42'
    __CONFIG  H'2008', H'3FFC'

       ORG 00 
  GOTO   PWM1

    ORG 04
   CALL  AVVIA_ADC ;eseguo una conversione

     MOVFW  ADRESH ;8 bit dell' adc
     MOVWF  CCPR1L ;inviati su CCPR1L

  CALL   BANK1
    MOVFW  ADRESL ;2 bit dell' adc 
    MOVWF  0X70   ;salvo ADRESL

  CALL  BANK0
    BCF   CCP1CON,4 ;spengo i due bit LSB
    BCF   CCP1CON,5 ;residenti su ccp1con

    BTFSC  0X70,6     ;li aggiorno coi
    BSF    CCP1CON,4  ;coi 2 bit salvati
    BTFSC  0X70,7     ;prima, i due bit
    BSF    CCP1CON,5  ;LSB di ccp1con

FINE_INT
    BCF  INTCON,2 ;spengo segnalazioni interr.
    BCF  PIR1,1   ;spengo segnalazioni interr.
    BSF  INTCON,7 ;riattivo interrupt
  CALL   BANK1
    MOVLW  B'00000010' ;riattivo interrupt
    MOVWF  PIE1        ;del timer 2
  RETFIE   
;-----------------------
AVVIA_ADC
  CALL    BANK1
    MOVLW   00010100B ;vrf- su ra2
    MOVWF    ANSEL    ;input anal. su RA4
  CALL    BANK0  
    MOVLW   01100001B ;accendo adc - input su RA4
    MOVWF    ADCON0   ;clk per adc = clk/8
 ;adc on - su ra4

    BSF    ADCON0,2    ;avvia conversione
CE_DATO
    BTFSC  ADCON0,2
    GOTO   CE_DATO     ;conv. in corso

  RETURN
;........................

PWM1          
  CALL  BANK0         
    BSF    PORTB,3
    MOVLW B'00000100' ;accendo
    MOVWF  T2CON      ;timer 2

    CLRF  CCPR1L  ;cancello registri
    CLRF  CCPR1H  ;per il Duty-Cycle

    MOVLW  .125    ;dutty cycle 50%
    MOVWF  CCPR1L  ;dutty cycle 50%

    MOVLW B'00001100' ;attivo modo pwm
    MOVWF  CCP1CON    ;attivo modo pwm

  CALL  BANK1
    MOVLW  0007   ;spegne comparatore.
    MOVWF  CMCON  ;attivo porte come I/O
 
    MOVLW   00000000B ;attivo ingressi
    MOVWF    ANSEL    ;come digitali
 
    MOVLW   00010000B ;attivo vref- su RA2
    MOVWF    ADCON1   ;bit Left justified.

    MOVLW   7          ;attivo resistenze
    MOVWF   OPTION_REG ;di pull-up sugli ingressi

    MOVLW .250  ;valore del periodo
    MOVWF PR2   ;del pwm generato

    MOVLW  B'11110000'  ; abilita 7-6-5-4 come inp
    MOVWF  TRISB        ; abilita 3-2-1-0 come out

    MOVLW  B'11000000'
    MOVWF  INTCON      ;attivo interrupt periferici 
    MOVLW  B'00000010'
    MOVWF  PIE1        ;attivo interrupt timer 2
LOOP5
    NOP
    NOP
    NOP
    NOP
    GOTO LOOP5   
;----------------------
BANK0
   BCF     STATUS,RP1
   BCF     STATUS,RP0
   RETURN
BANK1
   BCF     STATUS,RP1
   BSF     STATUS,RP0
   RETURN
BANK2
   BSF     STATUS,RP1
   BCF     STATUS,RP0
   RETURN
BANK3
   BSF     STATUS,RP1
   BSF     STATUS,RP0
   RETURN
;-----------------------

	END


















