Translate, Traductor

martes, 31 de agosto de 2010

Modulos LCD con PICs

;Los modulos LCD son otra opcion para la visualizacion de datos, diferente a los display de 7 segmentos, los modulos LCD tienen sus procpios controladores  quienes interpretan las ordenes y memoria donde almacenan los simbolos que se quieren visualizar. Usan el codigo de caracteres ASCII.




vista frontal
vista trasera

;Es un estandar que tengan 14 pines, aunque algunos tienen dos mas para el control de la luz (back litgh) los pines 15 y 16

NOMBRE DE LOS PINES

;  Vss   VDD   contraste    R/S   R/W  enable     DO    D1    D2     D3    D4          
;   1         2            3             4      5         6             7      8       9      10      11

12      13     14  
D5     D6    D7  

DESCRIPCION DE LOS PINES

; Vss    GND

; VDD    +5v

;CONTRASTE    Aumenta o disminuye el contraste del modulo, se puede conectar un potenciometro de 10K, los extremos a +5v y GND y el centro al este PIN

;R/S    Se indica si es un dato o una orden lo que se le quiere enviar al modulo
     0 = instruccion,   1 = dato

;R/W    Se indica la operacion es de escritura o de lectura.
     0 = escritura,   1 = lectura
     normalmente lo mantenemos con un cero '0'

;ENABLE    Habilita el modulo para cualquier operacion.

;DO....D7    Se escribe el dato o el comando que se quiere dar al modulo.


UTILIZACION

Entre las ordenes y los datos que se le envian al modulo es necesario agregar
retardos, segun los fabricantes son del orden de los microsegundos, yo voy usar
retardos de 1ms para todo el programa.


    INICIALIZACION

Para el funcionamiento es necesario primero inicializar el modulo.
Se deben seguir los siguientes pasos:

    1   RS = 0

    2    E = 0

    3    cargar el comando para configurar el modo de funcionamiento en 0..D7
           comunicacion a 8 bits
           usar las dos lineas del modulo
           tamano del caracter  7x5

    4   E = 1

    5    espera un tiempo  ( 1ms)

    6   E = 0

    7  cargo comando

        enciendo el LCD
        enciendo el cursor
        cursor intermitente

    8   E = 1

    9    espera un tiempo  ( 1ms)

    10   E = 0
       
        revisar el manual para mas comandos
   
    y todo listo

    este es el pedazo de codigo que hace lo indicado

    BCF           PORTA,0    ;RS = 0
    BCF           PORTA,1    ;E = 0
    MOVLW    B'00111000'    ;8 BITS 2 LINEAS 7X5
    MOVWF    PORTB  
    BCF           PORTA,0    ;RS=0
    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA
    CALL        RET_1MS
    BCF           PORTA,1    ;E = 0
    CALL        RET_1MS
    MOVLW    B'00001111'    ;ON LCD, ON CURSOR, ON INTER  
    MOVWF    PORTB  
    BCF           PORTA,0    ;RS=0
    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA
    CALL        RET_1MS
    BCF          PORTA,1    ;E = 0
    CALL        RET_1MS


    ESCRIBIR UN DATO

    1  Cargo el dato en D0 a D7

    2  RS = 1

    3  E = 1

    4  espero un momento

    5  E = 0

    ejemplo visualizando la letra E

    MOVLW    A'E'
    MOVWF    PORTB
    BSF           PORTA,0
    BSF           PORTA,1
    CALL        RET_10MS
    BCF          PORTA,1
    CALL        RET_10MS
circuito de prueba  click para ver grande

CODIGO DE PRUEBA COMPLETO      

    LIST    P=16F88
    INCLUDE    P16F88.INC
    ERRORLEVEL -302
  
    CBLOCK    0X20
    PDel0 , PDel1
    ENDC

    ORG    00
    GOTO    CONFIGURACION
;Retardo geneerado con el PCIDEL, agradezco a su autor
;
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

RET_1MS  movlw     .248      ; 1 set number of repetitions
        movwf     PDel0     ; 1 |
PLoop01  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) is the time over?
        goto      PLoop01    ; 2 no, loop
PDelL11  goto PDelL21         ; 2 cycles delay
PDelL21  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done



CONFIGURACION  NOP
    BANKSEL    ADCON1
    CLRF           ANSEL
    CLRF          TRISA
    CLRF          TRISB
    BANKSEL    ADCON0
    CLRF           PORTA
    CLRF           PORTB
  
    CALL        RET_1MS
    BCF          PORTA,0    ;RS = 0
    BCF          PORTA,1    ;E = 0
    MOVLW    B'00111000'    ;8 BITS 2 LINEAS 7X5
    MOVWF    PORTB  
    BCF           PORTA,0    ;RS=0
    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA
    CALL         RET_1MS
    BCF          PORTA,1    ;E = 0
    CALL        RET_1MS
  
    MOVLW    B'00001111'    ;ON LCD, ON CURSOR, ON INTER  
    MOVWF    PORTB  
    BCF           PORTA,0    ;RS=0
    BSF           PORTA,1    ;E=1 HABILITO ESCRITURA
    CALL         RET_1MS
    BCF           PORTA,1    ;E = 0
    CALL        RET_1MS

  

    MOVLW    A'E'    ; Cargo el ASCII de la E
    MOVWF    PORTB    ;Envio la E al puerto
    BSF           PORTA,0
    BSF           PORTA,1
    CALL        RET_10MS
    BCF          PORTA,1
    CALL       RET_10MS

INICIO        NOP
    GOTO     INICIO  

  
    END
      
Copyright 2010 EDWIN ESPINOSA
      
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".

viernes, 13 de agosto de 2010

Fusibles de configuracion "Bit's de configuracion" de los PIC's

Los bit's de configuracion o mas comunmente llamados "fusibles" permiten confugurar ciertas funciones en los microcontroladores PIC, como el tipo de cristal para el oscilador, permiten proteger el codigo en el micro, entre muchas funciones. La cantidad de funciones que se pueden configurar con los fusibles dependen del microcontrolador, si tenemos en el 16F84A  4 funciones, en el 16F88 son alrededor de 13 funciones.

Bueno y para que sirven?
Como lo dije antes son para configurar algunas funciones del micro, como el tipo de oscilador, la proteccion de codigo, habilitar el perro guardian ( por que si no este los muerde), habilitar el reset maestro, habilitar un reset inicial, habilitar reset por bajo voltage en la fuente, y otros que como les dije depende del micro usado.

Ahhh y cuando se usan??
En el momento en que se quiere programar el micro se le deben configurar los fusibles ( esto es usando un software como el WINPIC800,  me parece necesario agradecer a los creadores de este software quienes nos permiten descargarlo y usarlo sin ningun problema, www.winpic800.com,  GRACIAS!!!!!!) y si estamos usando alguno de los programadores de MICROCHIP como el pickit2 o el pickit3 debemos escribir la configuracion de estos fusibles en la cabecera de nuestro fuente antes de compilar.

Como se que fusibles usa  mi pequeño monstruo?
Como siempre digo "pues en el manual del micro", jeje suena obvio, y los podes obtener del fichero que incluimos en la cabecera del fuente,  el  P16F88.INC por ejemplo, que se encuentra en la carpeta "MPASM suite" que esta dentro de la carpeta "microchip" donde instalamos el MPLAB, ojo que el nombre del fichero depende del micro.

De los ficheros antes mencionados obtube lo siguiente:

Para el 16F84A


_CP_ON                       EQU     H'000F'
_CP_OFF                      EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_PWRTE_OFF                   EQU     H'3FFF'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LP_OSC                      EQU     H'3FFC'
_XT_OSC                      EQU     H'3FFD'
_HS_OSC                      EQU     H'3FFE'
_RC_OSC                      EQU     H'3FFF'

de donde se arma nuestra palabra de configuracion anteponiendo la directiva  "__CONFIG"

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &  _XT_OSC

Que es lo que debemos poner en la cabecera del fuente.

Aqui va la del 16F88


_CONFIG1               EQU     H'2007'
_CONFIG2                EQU     H'2008'

;Configuration Byte 1 Options
_CP_ALL                               EQU     H'1FFF'
_CP_OFF                              EQU     H'3FFF'
_CCP1_RB0                              EQU     H'3FFF'
_CCP1_RB3                              EQU     H'2FFF'
_DEBUG_OFF                              EQU     H'3FFF'
_DEBUG_ON                               EQU     H'37FF'
_WRT_PROTECT_OFF               EQU     H'3FFF' ;No program memory write protection
_WRT_PROTECT_256               EQU     H'3DFF' ;First 256 program memory protected
_WRT_PROTECT_2048            EQU     H'3BFF' ;First 2048 program memory protected
_WRT_PROTECT_ALL             EQU     H'39FF' ;All of program memory protected
_CPD_ON                               EQU     H'3EFF'
_CPD_OFF                               EQU     H'3FFF'
_LVP_ON                              EQU     H'3FFF'
_LVP_OFF                              EQU     H'3F7F'
_BODEN_ON                               EQU     H'3FFF'
_BODEN_OFF                              EQU     H'3FBF'
_MCLR_ON                              EQU     H'3FFF'
_MCLR_OFF                              EQU     H'3FDF'
_PWRTE_OFF                              EQU     H'3FFF'
_PWRTE_ON                               EQU     H'3FF7'
_WDT_ON                              EQU     H'3FFF'
_WDT_OFF                              EQU     H'3FFB'
_EXTRC_CLKOUT                 EQU     H'3FFF'
_EXTRC_IO               EQU     H'3FFE'
_INTRC_CLKOUT               EQU     H'3FFD'
_INTRC_IO                              EQU     H'3FFC'
_EXTCLK                               EQU     H'3FEF'
_HS_OSC                              EQU     H'3FEE'
_XT_OSC                                EQU     H'3FED'
_LP_OSC                               EQU     H'3FEC'

;Configuration Byte 2 Options
_IESO_ON                               EQU     H'3FFF'
_IESO_OFF                               EQU     H'3FFD'
_FCMEN_ON                               EQU     H'3FFF'
_FCMEN_OFF                              EQU     H'3FFE'



y la palabra seria algo como esto:

__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;Program Configuration Register 2
__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF


Si necesitan de otro micro la pueden consultar el el fichero del micro como les comente antes, ahhh  bueno pues!!!!  me pueden escribir yo se las pongo aqui.