Está en la página 1de 9

PWM CON PIC 16F628A

LIST P=16F628A
INCLUDE <P16F628A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON &
_INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON

;------------------------------------------------------------
cblock 0x20 ; Beginn General Purpose-Register
;-------------------------- counters
count1
count2
count3
varia
;--------------------------
endc
;--------------------------
#DEFINE pwmu PORTB,3
;--- Reset --------------------------------------------------
org h'00'
goto init ; reset -> init
;--- Interrupt ----------------------------------------------
org h'04'
;--------------------------
init clrf PORTA
clrf PORTB
movlw 0x07 ; Turn comparators off and enable pins for I/O
movwf CMCON
bcf STATUS,RP1
call usi ; port settings
call pause
movlw 0xFF
movwf PORTB
call pause ; wait 126ms
call set_timer

;-------------------------
uu movlw d'0'
movwf CCPR1L
call pause


movlw d'0'
movwf varia
aa incfsz varia,1
goto contin
goto cero

contin movfw varia
movwf CCPR1L
call pause
goto aa

cero movlw d'255'
movwf CCPR1L
call pause

movlw d'255'
movwf varia

bb decfsz varia,1
goto zontin
goto uu

zontin movfw varia
movwf CCPR1L
call pause
goto bb



;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set_timer
clrf T2CON
clrf TMR2
clrf INTCON
bsf STATUS,RP0
clrf PIE1
bcf STATUS,RP0
clrf PIR1
bsf STATUS,RP0
movlw 0xFF
movwf PR2 ; compare with 255
bcf STATUS,RP0
movlw 0x02
movwf CCPR1L
movlw 0x03
movwf T2CON ; prescaler 1:16 and postscaler 1:1
movlw 0x3C
movwf CCP1CON
bsf T2CON,TMR2ON ;turn on timer, see pic16f628 datasheet
return

;*********************************************************************;
Delay
;*********************************************************************
pause movlw 0x02 ;126 ms
movwf count3
d3 movlw 0x3F ;63 ms
movwf count1
d1 movlw 0xFA ; 1ms
movwf count2
d2 nop
decfsz count2,F
goto d2
decfsz count1,F
goto d1
decfsz count3,F
goto d3
retlw 0x00
;============================================================
usi bsf STATUS,RP0 ; Bank 1
movlw 0xFF ; all input
movwf TRISA
movlw 0x00
movwf TRISB ; all output
bcf STATUS,RP0 ; Bank 0
return
;============================================================
end
;============================================================


PRACTICA PARA EL ADC, UTILIZO UN POTENCIOMETRO EN RA0 Y EL VALOR EN
BINARIO LO VISUALIZO EN LA LCD
;****************************************************************************************************************
**************************
INCLUDE <P16F877A.INC>
LIST P=16F877A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOREN_ON &
_LVP_OFF

;REDIFINICION DE NOMBRE

#DEFINE PUERTO_A PORTA
#DEFINE PUERTO_B PORTB
#DEFINE PUERTO_C PORTC
#DEFINE LCD_RS PORTC,7
#DEFINE LCD_RW PORTC,6
#DEFINE LCD_E PORTC,5
#DEFINE LCD_PUERTO PORTB



CBLOCK H'20' ;BLOQUE DE VARIABLES O REGISTROS
CONT1
CONT2
CONT3


BINARIO_B
BINARIO_A
DECENAMIL
UNIDADMIL
CENTENA
DECENA
UNIDAD

ENDC


ORG H'00'
GOTO COMIENZO

ORG H'100'
COMIENZO

CALL PUERTO ;LLAMDA A PUERTO.
CALL CONFIG_LCD ;LLAMO A CONFIGURACION DE LCD
CALL RETARDO3 ;ESPERA DE 3 SEGUNDOS
CALL VISUALIZAR_LCD ;VISUALIZO EN LA L1 "ING. MECATRONICA"

CICLO
CALL CONFIG_ADC ;CONFIGURACION DE ADCON 0
CALL ADC ;CONFIGURO
CALL VALOR_ADC
GOTO CICLO





;************************************************************************************************************
; BLOQUE DE RUTINAS BLOQUE DE RUTINAS

*****************************
PUERTO

BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'00000000'
MOVWF TRISD
MOVLW B'111'
MOVWF TRISE
CLRF OPTION_REG
NOP
MOVLW B'10000000'
MOVWF ADCON1 ;1PARA ADRSH=2 Y ADRESL=8,0
OSCILADO/8,TODOS ANALOGICOS

BCF PIE1,ADIE ;DESABILITO LA INTERRUPCION DE CONVERSIOB
BCF STATUS,RP0 ;VUELVO AL BANCO 0
MOVLW B'00000000'
MOVWF INTCON
RETURN

;************************************************************************************************************
;RUTINA PARA LA CONFIGURACION DE LAS OPERACIONES DE LA LCD

CONFIG_LCD

MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X06 ;CONFIGURA EL MODO DE ENTRADA COMO EL
INCREMENTO DEL CURSOR Y MODO
NORMAL(AQUIPUEDOACTIVAR DESZPLAZAMIENTO)

CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X0F ;COFIG DISPLAY CONTROL:
DISPALY=ON,CURSOR=ON,PARPADEO DEL CURSOR=ON
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X38 ;FUNCTION SET:BUS DE 8 BIT,LCD DE 2
LINEAS,CARACTER DE 5X7 PUNTOS
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
RETURN

;****************************************************************************************************************
**************************
;RUTINIA DE HABILATACION DE CONTROL Y DATOS PARA LA CONFIGURACION DEL LCD

CONTROL_LCD
MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE
BCF LCD_RW ;COLOCO RW=0 PARA ACTIVAR LA ESCRITURA
BCF LCD_RS ;COLOCO RS=0 PARA ACTIVAR EL CONTROL

SALTOX
BSF LCD_E ;COLOCO E=0 PARA DAR EL PULSO
NOP
NOP
BCF LCD_E ;PARA DAR POR TERMINADO EL PULSO
BCF LCD_RW ;PARA LIMPIARLO
BCF LCD_RS ;PARA LIMPIARLO
GOTO RETARDO1 ;VOY AL RETARDO DE 5m SEGUNDOS PARA LA
ESPERA DE LA LCD

DATO_LCD

MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE EL DATO A
VISUALIZAR EN LA LCD
BCF LCD_RW ;COLOCO RW=0 PARA LA ESCRITURA
BSF LCD_RS ;COLOCO RS=1 PARA ACTIVAR EL MODO DE
DATOS

GOTO SALTOX ;ME VOY A SALTOX PARA DAR EL PULSO DE
; ACTIVACION Y LIMPIAR LOS REGISTROS

;****************************************************************************************************************
VISUALIZAR_LCD
CALL BORRAR_LCD ;BORRO LA LCD POR SI TENGO ALGO EN ELLA
MOVLW 'I' ;SEGMENTO 1 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 2 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'G' ;SEGMENTO 3 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '.' ;SEGMENTO 4 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'M' ;SEGMENTO 6 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'E' ;SEGMENTO 7 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 8 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 9 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'T' ;SEGMENTO 10 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'R' ;SEGMENTO 11 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'O' ;SEGMENTO 12 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 13 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'I' ;SEGMENTO 14 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 15 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 16 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 0XC0 ;LO UTILIZO PARA MOVERME A LA LINEA 2
CALL CONTROL_LCD ;HABILITACION DE CONTROL
MOVLW 'A' ;SEGMENTO 1 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'D' ;SEGMENTO 2 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 3 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '=' ;SEGMENTO 4 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITAION DE DATOS
RETURN

;****************************************************************************************************************
;RUTINA PARA BORRAR LA LCD
BORRAR_LCD
MOVLW 0X01 ;EQUIVALENTE AL CONTROL BORRAR LCD
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;****************************************************************************************************************
;RUTINA PARA REGRESAR EL CURSOR AL INICIO
REGRESAR_LCD
MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;****************************************************************************************************************
CONFIG_ADC
MOVWF B'01000001'
MOVWF ADCON0 ;CONFIGURO OSCILADO/8,CANAL 0, GO, ENCIENDO
GOTO RETARDO5 ;ESPERA EL TIEMPO DE ADQUISICION 25uS

;****************************************************************************************************************
ADC
BSF ADCON0,GO ;INICIA EL PROCESO
CALL RETARDO5 ;ESPERA DE ADQUISICION
REPETIR
BTFSC ADCON0,2 ;CHEQUEO SI LA CONVERSION TERMINO
GOTO REPETIR
MOVFW ADRESH ;MUEVO LOS 2 BITS MAS SIGNIFICATIVOS A W
MOVWF BINARIO_B ;CARGO LOS 2 BITS MAS SIGNIFICATVIOS A
BINARIO_B
BANKSEL ADRESL ;ME MUEVO AL BANCO 1 DONDE ESTA EL ADRESL
MOVFW ADRESL ;CARGO EN W EL VALOR DE ADRESL
BANKSEL BINARIO_A ;ME MUEVO AL BANCO 0 DONDE ESTA BINARIO_A
MOVWF BINARIO_A ;CARGO EL BINARIO_A CON EL VALOR DE 2 QUE
;VIENE DEL ADRESL
GOTO BIN_BCD ;VOY A LA SUBRUTINA BIN_BCD, YA QUE TENGO LOS
; VALORES DELCONVERTIDOR

;****************************************************************************************************************
BIN_BCD
SWAPF BINARIO_B,W
ANDLW 0X0F
ADDLW 0XF0
MOVWF UNIDADMIL
ADDWF UNIDADMIL,F
ADDLW 0XE2
MOVWF CENTENA
ADDLW 0X32
MOVWF UNIDAD
MOVF BINARIO_B,W
ANDLW 0X0F
ADDWF CENTENA,F
ADDWF CENTENA,F
ADDWF UNIDAD,F
ADDLW 0XE9
MOVWF DECENA
ADDWF DECENA,F
ADDWF DECENA,F
SWAPF BINARIO_A,W
ANDLW 0X0F
ADDWF DECENA,F
ADDWF UNIDAD,F
RLF DECENA,F
RLF UNIDAD,F
COMF UNIDAD,F
RLF UNIDAD,F
MOVF BINARIO_A,W
ANDLW 0X0F
ADDWF UNIDAD,F
RLF UNIDADMIL,F
MOVLW 0X07
MOVWF DECENAMIL
MOVLW 0X0A
LB1
ADDWF UNIDAD,F
DECF DECENA,F
BTFSS STATUS,C
GOTO LB1
LB2
ADDWF DECENA,F
DECF CENTENA,F
BTFSS STATUS,C
GOTO LB2
LB3
ADDWF CENTENA,F
DECF UNIDADMIL,F
BTFSS STATUS,C
GOTO LB3
LB4
ADDWF UNIDADMIL,F
DECF DECENAMIL,F
BTFSS STATUS,C
GOTO LB4
RETURN
;****************************************************************************************************************
VALOR_ADC
MOVLW 0X30
ADDWF DECENAMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF UNIDADMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF CENTENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF DECENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF UNIDAD,W
CALL DATO_LCD
MOVLW 0X0C ;COFIG DISPLAY CONTROL: dISPALY =ON,
CURSOR=OFF, PARPADEO DEL CURSOR=OFF
CALL CONTROL_LCD
MOVLW B'11000101' ;POSICIONO EL CURSOR EN LA SEGUNDA FILA
; POSICION 5
GOTO CONTROL_LCD
RETARDO1
MOVLW .41 ;RETARDO DE 5MILISEGUNDOS
MOVWF CONT1
MOVlW .41
MOVWF CONT2
DEMORA1
DECFSZ CONT1,F
GOTO DEMORA1
DECFSZ CONT2,F
GOTO DEMORA1
RETURN
;****************************************************************************************************************
RETARDO2
MOVLW .183 ;RETARDO DE 1 SEGUNDOS
MOVWF CONT1
MOVlW .183
MOVWF CONT2
MOVLW .11
MOVWF CONT3
DEMORA2
DECFSZ CONT1,F
GOTO DEMORA2
DECFSZ CONT2,F
GOTO DEMORA2
DECFSZ CONT3,F
GOTO DEMORA2
RETURN
;****************************************************************************************************************
RETARDO3
CLRF CONT1 ;RETARDO DE 3 SEGUNDOS PARA MOSTRAR EL NUMERO
CLRF CONT2
MOVLW .16
MOVWF CONT3
DEMORA3
DECFSZ CONT1,F
GOTO DEMORA3
DECFSZ CONT2,F
GOTO DEMORA3
DECFSZ CONT3,F
GOTO DEMORA3
RETURN
;****************************************************************************************************************
RETARDO4
MOVLW .18 ;RETARDO DE 1MILISEGUNDOS
MOVWF CONT1
MOVlW .18
MOVWF CONT2
DEMORA4
DECFSZ CONT1,F
GOTO DEMORA4
DECFSZ CONT2,F
GOTO DEMORA4
RETURN
;****************************************************************************************************************
RETARDO5
MOVLW .8 ;RETARDO DE 25u SEGUNDOS
MOVWF CONT1
DEMORA5
DECFSZ CONT1,F
GOTO DEMORA5
RETURN
;****************************************************************************************************************
END

También podría gustarte