Translate, Traductor

jueves, 31 de mayo de 2012

Control de un modulo LCD con un PIC 16F883

Programa que sirve para el control de un modulo LCD (si requiere saber sobre los módulos LCD de un paseo por http://xorwf.blogspot.com/2010/08/modulos-lcd-con-pics.html )

El programa esta hecho para un microcontrolador PIC 16F883 y para ser usado o con otro microcontrolador se necesita cambiar en el código la referencia del PIC y los bit's de configuración.

En el caso de un PIC 16F886 solo necesitaríamos cambiar la referencia del micro en las directivas LIST e INCLUDE

Circuito esquemático



Código fuente para el PIC



LIST P=16F883
INCLUDE P16F883.INC

ERRORLEVEL -302

 __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF

#DEFINE CONTROL PORTA
#DEFINE DATO8BITS PORTB
#DEFINE RS 0
#DEFINE   EN 1
#DEFINE HOME      B'00000011'
#DEFINE BORRAR    B'00000001'
#DEFINE MOV_IZQ   B'00011100' ;OKMUEVE DISP Y CUR IZQ
#DEFINE MOV_DER   B'00011000'
#DEFINE MOV_C_IZQ B'00010000' ;OKMUEVO CURSOR IZQUIERDA
#DEFINE MOV_C_DER B'00010100' ;OKMUEVO CURSOR DERECHA
#DEFINE TXT_IZQ   B'00000111' ;DESPLAZO EL TEXTO A LA IZQUIERDA CUANDO ESCRIBO UN CARACTER
#DEFINE TXT_DER   B'00000100' ;DESPLAZO EL TEXTO A LA DERECHA CUANDO ESCRIBO UN CARACTER



CBLOCK 0X20
MPDEL0, PDEL0, PDEL1, PDEL2, VAR_CURSOR
VECES_IZQ, VECES_DER, VAL1, PDel0, VECES_M, MOV_TAB
ENDC

ORG 00H
GOTO CONFIGURA

;-------------------------------------------------------------
; CODE GENERATED BY PDEL  VER 1.0  ON 08/06/2007 AT 05:50:40 P.M.
; DESCRIPTION: WAITS 1000000 CYCLES
;-------------------------------------------------------------
PDELAY   MOVLW     .14       ; 1 SET NUMBER OF REPETITIONS (C)
PDELAY2         MOVWF     PDEL0     ; 1 |
PLOOP0   MOVLW     .72       ; 1 SET NUMBER OF REPETITIONS (B)
        MOVWF     PDEL1     ; 1 |
PLOOP1   MOVLW     .247       ; 1 SET NUMBER OF REPETITIONS (A)
        MOVWF     PDEL2     ; 1 |
PLOOP2   CLRWDT           ; 1 CLEAR WATCHDOG
        DECFSZ     PDEL2,1   ; 1 + (1) IS THE TIME OVER? (A)
        GOTO       PLOOP2     ; 2 NO, LOOP
        DECFSZ     PDEL1,1 ; 1 + (1) IS THE TIME OVER? (B)
        GOTO       PLOOP1     ; 2 NO, LOOP
        DECFSZ     PDEL0,1 ; 1 + (1) IS THE TIME OVER? (C)
        GOTO       PLOOP0     ; 2 NO, LOOP
PDELL1   GOTO PDELL2         ; 2 CYCLES DELAY
PDELL2   CLRWDT               ; 1 CYCLE DELAY
        RETURN               ; 2+2 DONE
;-------------------------------------------------------------



MPDELAY   MOVLW     .100;.248       ; 1 SET NUMBER OF REPETITIONS
        MOVWF     MPDEL0     ; 1 |
MPLOOP0   CLRWDT           ; 1 CLEAR WATCHDOG
        DECFSZ     MPDEL0,1   ; 1 + (1) IS THE TIME OVER?
        GOTO       MPLOOP0     ; 2 NO, LOOP
MPDELL1   GOTO MPDELL2         ; 2 CYCLES DELAY
MPDELL2   CLRWDT               ; 1 CYCLE DELAY
        RETURN               ; 2+2 DONE


DATO MOVWF DATO8BITS
BSF CONTROL,RS
BSF CONTROL,EN
CALL MPDELAY
BCF CONTROL,EN
CALL MPDELAY
RETURN

INSTRUC MOVWF PORTB
BCF CONTROL,RS
BSF CONTROL,EN
CALL MPDELAY
CALL MPDELAY
BCF CONTROL,EN
CALL MPDELAY
CALL MPDELAY
RETURN

INIT_LCD MOVLW .1
MOVWF PDEL0
CALL PLOOP0
BCF CONTROL,RS
BCF CONTROL,EN
MOVLW B'00111000' ;8 BITS 2 LINEAS 7X5
CALL INSTRUC
MOVLW B'00001111' ;ON LCD, ON CURSOR, ON INTER
CALL INSTRUC
MOVLW BORRAR
CALL INSTRUC
RETURN


LINE_2 MOVLW .64
GOTO_A MOVWF VAR_CURSOR
MOVLW HOME
CALL INSTRUC
SEC_LINE MOVLW MOV_C_DER
CALL INSTRUC
DECFSZ VAR_CURSOR,F
GOTO SEC_LINE
RETURN

DESP_IZQ MOVWF VECES_IZQ
INCF VECES_IZQ,F
DESP_I NOP
DECFSZ VECES_IZQ,F
GOTO DESPI
RETURN
DESPI MOVLW MOV_C_IZQ
CALL INSTRUC
CALL PDELAY
GOTO DESP_I


DESP_DER MOVWF VECES_DER
INCF VECES_DER,F
DESP_D NOP
DECFSZ VECES_DER,F
GOTO DESPD
RETURN
DESPD MOVLW MOV_C_DER
CALL INSTRUC
CALL PDELAY
GOTO DESP_D

BORRAR_R MOVLW BORRAR
CALL INSTRUC
RETURN

HOME_R MOVLW HOME
CALL INSTRUC
RETURN


MARQUESINA MOVWF VECES_M
NOP
MARQ_1 DECFSZ VECES_M,F
GOTO MARQ
RETURN
MARQ MOVLW TXT_IZQ
CALL INSTRUC
MOVLW ' '
CALL DATO
CALL PDELAY
GOTO MARQ_1



ELEC ADDWF PCL,F
DT "ELECTRONICA"



CONFIGURA NOP
BANKSEL ANSEL
    CLRF    ANSEL
    CLRF    ANSELH
    BANKSEL TRISB
    MOVLW    B'01101100'
    MOVWF    OSCCON
    MOVLW    B'00000000'
    MOVWF    TRISA
    MOVLW    B'00000000'
    MOVWF    TRISB
    MOVLW    B'00000000'
    MOVWF    TRISC
    BANKSEL PORTB





EJEMPLO

CALL INIT_LCD
CALL MPDELAY

CLRF MOV_TAB
TAB1 MOVF MOV_TAB,W
CALL ELEC
CALL DATO
INCF MOV_TAB,F
MOVLW .11
XORWF MOV_TAB,W
BTFSS STATUS,Z
GOTO TAB1
CLRF MOV_TAB


CALL PDELAY





INICIO NOP



GOTO INICIO


END

martes, 29 de mayo de 2012

Contador de 0 a 99 con pulsadores

El contador es de 0 a 99 usando la tecnica de la multiplexion, tiene un pulsador para la cuenta ascendente y otro para la cuenta descendente.

IMPORTANTE      recomiendo comparar este codigo con el que no tiene pulsadores.

Video de la implementacion


el circuito esquematico


y el codigo fuente

    LIST P=16F886
    INCLUDE P16F886.INC
    ERRORLEVEL -302
    
    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF
    
    CBLOCK    0X20
    PDel0, PDel1, DECENAS, UNIDADES
    ENDC
    


    ORG    00
    GOTO    CONFIGURA


RET_10MS  movlw     .8        ; 1 set number of repetitions (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .249      ; 1 set number of repetitions (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 cycle delay
        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done

        
TABLA    ADDWF    PCL,F
    RETLW    B'00111111'
    RETLW    B'00000110'
    RETLW    B'01011011'
    RETLW    B'01001111'
    RETLW    B'01100110'
    RETLW    B'01101101'
    RETLW    B'01111100'
    RETLW    B'00000111'
    RETLW    B'01111111'
    RETLW    B'01101111'
    
MOSTRAR    MOVF    UNIDADES,W    ;cargo el valor de las unidades
    CALL    TABLA
    BSF    PORTC,5    ;activo el display unidad
    BCF    PORTC,4    ;desactivo el display decena
    MOVWF    PORTB
    CALL    RET_10MS
    MOVF    DECENAS,W    ;cargo el valor de las decenas
    CALL    TABLA
    BCF    PORTC,5    ;desactivo el display unidad
    BSF    PORTC,4    ;activo el display decena
    MOVWF    PORTB
    CALL    RET_10MS
    RETURN
    
VER    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR    ;LOGRO UN RETARDO DE 160ms
    RETURN
    
CONFIGURA     NOP
BANKSEL    ANSEL    ;paso al banco 3
CLRF    ANSEL
CLRF    ANSELH
BANKSEL TRISB
MOVLW    B'01101100'
MOVWF    OSCCON
MOVLW    B'00000011'
MOVWF    TRISA
MOVLW    B'00000000'
MOVWF    TRISB
MOVLW    B'00000000'
MOVWF    TRISC
BANKSEL    PORTB    ;paso al banco 0
CLRF    PORTB
CLRF    DECENAS
CLRF    UNIDADES

INICIO   CALL MOSTRAR
BTFSC PORTA,0
GOTO UP
BTFSC PORTA,1
GOTO DOWN
GOTO INICIO 



UP CALL     VER    
INCF     UNIDADES,F
MOVLW     .10
XORWF     UNIDADES,W
BTFSC     STATUS,Z
GOTO     INC_DECENAS
CALL     MOSTRAR
GOTO     INICIO
    
INC_DECENAS     CLRF     UNIDADES
    INCF     DECENAS,F
    MOVLW     .10
    XORWF     DECENAS,W
    BTFSC     STATUS,Z
    CLRF     DECENAS
    CALL     MOSTRAR
    GOTO     INICIO
   
DOWN CALL     VER    
DECF     UNIDADES,F
MOVLW     .255
XORWF     UNIDADES,W
BTFSC     STATUS,Z
GOTO     DEC_DECENAS
CALL MOSTRAR
GOTO     INICIO
    
DEC_DECENAS     MOVLW .9
MOVWF UNIDADES
    DECF     DECENAS,F
    MOVLW     .255
    XORWF     DECENAS,W
    BTFSS     STATUS,Z
    GOTO INICIO
    MOVLW .9
    MOVWF DECENAS
    CALL MOSTRAR
    GOTO     INICIO
        
    END



Copyright 2012 edwtron
       
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o  una version superior.
     Leer la licencia GNU gpl para mas detalles. 

    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".

sábado, 26 de mayo de 2012

Contador de 0 a 99 con PIC 16F886

Éste programa es para un contador de 0 a 99 usando el metodo de la multiplexión.

    LIST P=16F886
    INCLUDE P16F886.INC
    ERRORLEVEL -302
    
    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF
    
    CBLOCK    0X20
    PDel0, PDel1, DECENAS, UNIDADES
    ENDC
    


    ORG    00
    GOTO    CONFIGURA


RET_10MS  movlw     .8        ; 1 set number of repetitions (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .249      ; 1 set number of repetitions (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 cycle delay
        decfsz    PDel1, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done

        
TABLA    ADDWF    PCL,F
    RETLW    B'00111111'
    RETLW    B'00000110'
    RETLW    B'01011011'
    RETLW    B'01001111'
    RETLW    B'01100110'
    RETLW    B'01101101'
    RETLW    B'01111100'
    RETLW    B'00000111'
    RETLW    B'01111111'
    RETLW    B'01101111'
    
MOSTRAR    MOVF    UNIDADES,W    ;cargo el valor de las unidades
    CALL    TABLA
    BSF    PORTC,5    ;activo el display unidad
    BCF    PORTC,4    ;desactivo el display decena
    MOVWF    PORTB
    CALL    RET_10MS
    MOVF    DECENAS,W    ;cargo el valor de las decenas
    CALL    TABLA
    BCF    PORTC,5    ;desactivo el display unidad
    BSF    PORTC,4    ;activo el display decena
    MOVWF    PORTB
    CALL    RET_10MS
    RETURN
    
VER    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR
    CALL    MOSTRAR    ;LOGRO UN RETARDO DE 160ms
    RETURN
    
CONFIGURA    NOP
    BANKSEL    ANSEL    ;paso al banco 3
   CLRF    ANSEL
     CLRF    ANSELH
     BANKSEL TRISB
     MOVLW    B'01101100'
     MOVWF    OSCCON
     MOVLW    B'00000000'
     MOVWF    TRISA
     MOVLW    B'00000000'
     MOVWF    TRISB
     MOVLW    B'00000000'
     MOVWF    TRISC
    BANKSEL    PORTB    ;paso al banco 0

    CLRF    PORTB
    CLRF    DECENAS
    CLRF    UNIDADES

INICIO    CALL    VER    ;Esta rutina me sirve como un
            ;retarde de 20ms aprox
    INCF    UNIDADES,F
    MOVLW    .10
    XORWF    UNIDADES,W
    BTFSC    STATUS,Z
    GOTO    INC_DECENAS
    CALL    VER
    GOTO    INICIO
    
INC_DECENAS    CLRF    UNIDADES
    INCF    DECENAS,F
    MOVLW    .10
    XORWF    DECENAS,W
    BTFSC    STATUS,Z
    CLRF    DECENAS
    CALL    VER
    GOTO    INICIO
        
    END

Plantilla y fusibles para programar el 16F88


Plantilla para trabajar con el PIC 16F88, esta configurado para trabajar con oscilador interno a 4 MHz

Seria interesante que la comparen con la plantilla de otro microcontrolador para que se den cuenta de las diferencias que hay cunado se cambia de referencia y que no es tan complicado

LIST P=16F88
INCLUDE P16F88.INC

__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

CBLOCK 0X20

ENDC



ORG 00
GOTO CONFIGURA

;En este espacio podemos colocar los retardos y otras subrrutinas



CONFIGURA  NOP
BANKSEL TRISB
CLRF ANSEL
MOVLW B'01101100'
MOVWF OSCCON
        MOVLW     B'00000000'    ;  1 entrada, 0 salida
        MOVWF     TRISA
        MOVLW     B'00000000'    ;   1 entrada, 0 salida
        MOVWF     TRISB
BANKSEL PORTB
CLRF PORTB

INICIO  
       
       GOTO     INICIO



END

viernes, 25 de mayo de 2012

Plantilla y fusibles para programar el 16F886

Ésta es una plantilla base para construir un programa para el microcontrolador 16F886, solo la copian y la pegan en su hoja de trabajo nueva en el MPLAB

    LIST P=16F886

    INCLUDE P16F886.INC
    ERRORLEVEL -302

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF

    CBLOCK    0X20
   
    ENDC


     ORG 00
     GOTO    CONFIGURA
    

    
    
CONFIGURA    NOP
     BANKSEL ANSEL
     CLRF    ANSEL
     CLRF    ANSELH
     BANKSEL TRISB
     MOVLW    B'01101100'
     MOVWF    OSCCON
     MOVLW    B'00000000'
     MOVWF    TRISA
     MOVLW    B'00000000'
     MOVWF    TRISB
     MOVLW    B'00000000'
     MOVWF    TRISC
     BANKSEL PORTB

INICIO 


        GOTO    INICIO
        END

 Mucha suerte!!!!