Autor Tema: No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0  (Leído 2200 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Buenas tarde amigos por curiocidad escribi un programa para manejo de LCD a 20Mhz usando el TMR0 como temporizador pues lor programas que he visto solo generan temporizacion por una rutina y quise probar otra opcion.
Lo logre pero no se por que no puedo cambiar a la segunda linea pues cuando elimino el TMR0 y uso una rutina que haga el trabajo de temporizacion funciona de maravilla.............ahora les muestro el codigo espero me ayuden y les doy las gracias de antemano.

; ------------------------------------------------------------
; Programa para uso de LCD con PIC 16F876A a 20 Mhz
; utilizando el TMR0 como temporizacion
; ------------------------------------------------------------
      processor 16F876A
      include <P16F876A.INC>
   errorlevel -302

; -----------------------------------------   
; Variables para DELAY
; -----------------------------------------
   cblock   0x20
   TMP_LCD            ; Variable para Dato temporal del LCD
   VECTOR            ; Vector para manejo de Temporizacion
   VEC_TMP            ; Registro de almacenamiento del Vector
   COMAN_T            ; Variable para Registar comandos internor
      endc

; -----------------------------------------
; Definiciones 
; -----------------------------------------
#define   RS   4         ; RESET de la LCD   
#define   E   5         ; ENABLE de la LCD

     Org    0         ; Vector de RESET
    goto    INICIO   

    Org      4         ; Vector de INTERRUPCIONES
    goto   Inter

; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
INICIO:
    clrf    PORTA               ; Limpia PORTA
    clrf    PORTB                    ; Limpia PORTB   
    bsf       STATUS, RP0 

    movlw    b'11000000'
    movwf   TRISA                         ; Configura PORTA
    clrf    TRISB                       ; Configura PORTB como salida
    movlw   b'00000100'           ; presscaler TMR0 1:32
    movwf   OPTION_REG
    bcf    STATUS,   RP0          ; Regresa al banco 0
    movlw   D'200
    movwf   TMR0

    bsf   INTCON,   T0IE          ; Habilitacion de Interrupcion por TMR0
    bsf    INTCON,   GIE            ; Habilitacion general de Interrupciones
    movlw    D'30'      
    movwf    TMP_LCD               ; Valor de Temporizacion del LCD para 20 ms
    movlw    B'00000010'      
    movwf   VEC_TMP
    movwf   VECTOR

; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
    call    INICIO_LCD        ; Configura el LCD
    call    M1                      ; Muestra Mensaje
    call    LINEA2                ; Configura linea 2
    call    M2                       ; Muestra Mensaje

Seguir:
     nop
    goto    $-1   

; -----------------------------------------
; Mensajes a Mostrar
; -----------------------------------------
M1:
      movlw    'H'          ; Mueve 'H' a W
   movwf    PORTB       ; Mueve lo que hay en W a PORTB
   call    ENVIA       ; Imprime en LCD
   movlw    'o'
   movwf    PORTB
   call    ENVIA
   movlw    'l'
   movwf    PORTB
   call    ENVIA
   movlw    'a'
   movwf    PORTB
   call    ENVIA
   movlw    ' '
   movwf    PORTB
   call    ENVIA
   movlw    'L'
   movwf   PORTB
   call    ENVIA
    movlw    'i'
   movwf    PORTB
   call    ENVIA
   movlw    'n'
   movwf    PORTB
   call    ENVIA
   movlw    '1'
   movwf    PORTB
   call    ENVIA
    return

; -----------------------------------------
M2:
    movlw    'H'        ; Mueve 'I' a W
   movwf    PORTB       ; Mueve lo que hay en W a PORTB
   call    ENVIA       ; Imprime en LCD
   movlw    'o'
   movwf    PORTB
   call    ENVIA
   movlw    'l'
   movwf    PORTB
   call    ENVIA
   movlw    'a'
   movwf    PORTB
   call    ENVIA
   movlw    ' '
   movwf    PORTB
   call    ENVIA
   movlw    'L'
   movwf    PORTB
   call    ENVIA
      movlw    'i'
   movwf    PORTB
   call    ENVIA
   movlw    'n'
   movwf    PORTB
   call    ENVIA
   movlw    '2'
   movwf    PORTB
   call    ENVIA
    return     

; -----------------------------------------
; Subrutina para inicializar el lcd
; -----------------------------------------
INICIO_LCD:
    bcf    PORTA,   RS   ; RS=0 MODO INSTRUCCION
    movlw    0x01      ; El comando 0x01 limpia la pantalla en el LCD
   movwf    PORTB
   call    COMANDO     ; Se da de alta el comando
   movlw    0x0C          ; Selecciona la primera línea
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   movlw    0x3C          ; Se configura el cursor
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   bsf    PORTA,    RS  ; Rs=1 MODO DATO
    return
       
; -----------------------------------------
; Rutina para enviar comandos al LCD
; -----------------------------------------
COMANDO:
    bsf    PORTA,   E   ; Pone la E=1
   bsf      COMAN_T,0   ; Activa la Temporizacion

Retardo:
   btfsc   VECTOR,   1   ; Vector de Retardo 1 de Comando
   goto   Retardo_1
   btfsc   VECTOR,   2   ; Vector de Retardo 2 de Comando
   goto   Retardo_2
   btfsc   VECTOR,   3   ; Vector de Retardo 2 de Comando
   goto   Retardo_3
   goto   Retardo

; -----------------------------------------
; Rutina para enviar Datos a vizualizar en el LCD
; -----------------------------------------
ENVIA:
   bsf    PORTA,   RS  ; RS=1 MODO DATO
   nop
   nop
   nop
   call    COMANDO       ; Se da de alta el comando
   Return

; -----------------------------------------
; Rutina para cambiar a la Lineal 2 del LCD
; -----------------------------------------
LINEA2:
   nop
   nop
   nop
   nop
    bcf    PORTA,   RS    ; RS=0 MODO INSTRUCCION
   nop
   nop
   nop
    movlw    0xC0      ; Selecciona linea 2 pantalla en el LCD
   movwf    PORTB
   call    COMANDO       ; Se da de alta el comando
    Return

Retardo_1:
    ;call    DELAY
   btfss   VECTOR,   1   ; Vector de Temporizacion 1
   goto   Retardo
   clrf   VECTOR
   
Retardo_2:
    ;call    DELAY
   btfss   VECTOR,   2   ; Vector de Temporizacion 2
   goto   Retardo
   clrf   VECTOR
    bcf    PORTA,    E   ; Pone la E=0

Retardo_3:   
   ;call    DELAY
   btfss   VECTOR,   3   ; Vector de Temporizacion 3
   goto   Retardo
   clrf   VECTOR
   movlw    B'00000010'   ; Preparacion de Reinicio de Vectores
   movwf   VEC_TMP      ; necesarios para la Rutina COMANDO
   movwf   VECTOR
   bcf      COMAN_T,0   ; Rompe la Temporizacion
   Return

; -----------------------------------------
; Rutina de atencion de Interrupciones
; -----------------------------------------
Inter:
   btfss   INTCON,   T0IF; Pregunta si el TMR0 se Reboso
   Retfie
   bcf      INTCON,   T0IF
   movlw   D'200'
   movwf   TMR0
   btfss   COMAN_T,0   ; Pregunta si el TMR0 se Reboso
   goto   Salir_T
   decfsz   TMP_LCD,F
   goto   Salir_T
   movlw    D'30'      ; Valor de Tempozacion del LCD
   movwf    TMP_LCD
   rlf      VEC_TMP,F
   movf   VEC_TMP,W
   movwf   VECTOR

Salir_T
   Retfie

    END
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #1 en: 06 de Julio de 2016, 14:45:16 »
No se si es correcto ni me fije demasiado acerca de que queres realizar en la linea 2, pero apenas vi la rutina de interrupciones note un error.

Te sugiero que leas el datasheet en esta seccion:

12.11 Context Saving During Interrupts
Pagina 154

Y veas el codigo que te da , para que lo uses.


Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #2 en: 06 de Julio de 2016, 15:30:47 »
Intento pasar de la linea 1 a la linea 2, esto lo tome de la explicacion de como hacerlo, enviando como comando 0XC0 indicando al LCD que quiero mostrar mensajes en la linea 2.............amigo no entendi. que quiso decir.................que cosa debo leer??
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #3 en: 06 de Julio de 2016, 15:54:08 »
Que la rutina de interrupcion esta mal, le falta codigo, a eso me referia. Por eso te decia que leas el manual del integrado, el datasheet.

En la cual te doy la el nombre de la seccion a la cual me refiero y la pagina, aunque esta ultima puede variar por que me fije en el pdf que tengo guardado en casa.

Alli tenes un codigo y explica el por que debe estar ese codigo en la rutina de interrupcion.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #4 en: 07 de Julio de 2016, 17:42:24 »
amigo encontre por internet un documento de una sola hoja............
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #6 en: 07 de Julio de 2016, 19:23:46 »
Gracias amigo.................por cierto he cambiado la lineas de la rutina Para la linea 2.......y pareciera que no reconociera la LCD ese comando C0.........pues los mensajes posteriores a ese comando no aparecen en la LCD
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #7 en: 10 de Julio de 2016, 11:54:46 »
Buenos dias, amigo creo que te referias a que no se guardaba la informacion del registro W y la direccion de memoria donde estaba antes de la interrupcion???............si vez el codigo no es del todo necesario, pero lo inclui pero seguia igual,,,,,,,,,,

hice unos cambios para averiguar que pasaba y me di cuenta que simplemente el PIC obviaba la segunda linea de la LCD, eso me indicaba que solo se configuro para una linea..........revisando ,e di cuenta de algo....

El codigo wque use en la configuracion es este:

INICIO_LCD:
    bcf    LCD_RS      ; RS=0 MODO INSTRUCCION
   bcf       LCD_E
    movlw    b'00111100'   ; El comando Configura la LCD
   movwf    PORTB
   call    COMANDO     ; Se da de alta el comando
   movlw    b'00000001' ; Selecciona la primera línea
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   movlw    b'00111100' ; Se configura Configura la LCD
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   bsf    LCD_RS     ; Rs=1 MODO DATO
    return

Lo configure malr regi .......

INICIO_LCD:
    bcf    LCD_RS      ; RS=0 MODO INSTRUCCION
   bcf       LCD_E
    movlw    b'00111100'   ; El comando Configura la LCD
   movwf    PORTB
   call    COMANDO     ; Se da de alta el comando
   movlw    b'00111100' ; Selecciona la primera línea
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   movlw    b'00111100' ; Se configura Configura la LCD
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   bsf    LCD_RS     ; Rs=1 MODO DATO
    return

y no funciono......................probando funciono as.
; -----------------------------------------
; Subrutina para inicializar el lcd
; -----------------------------------------
INICIO_LCD:
    bcf    LCD_RS      ; RS=0 MODO INSTRUCCION
   bcf       LCD_E
    movlw    b'00111100'   ; El comando Configura la LCD
   movwf    PORTB
   call    COMANDO     ; Se da de alta el comando
   movlw    b'00001100' ; Selecciona la primera línea
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   movlw    b'00111100' ; Se configura Configura la LCD
   movwf    PORTB
   goto    COMANDO     ; Se da de alta el comando
   bsf    LCD_RS     ; Rs=1 MODO DATO
    return

lo probe a 4 Mhz y 20Mhz y funciono......................gracias de todas maneras
       
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #8 en: 10 de Julio de 2016, 23:01:04 »
Citar
.si vez el codigo no es del todo necesario

En realidad ES necesario el codigo de guardar W y STATUS al entrar y reestablecerlo al salir.

Te sugiero lo que agregues, si es que no lo hiciste, y me alegro que pudiste solucionar el problema.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No puedo usar la segunda lines de LCD a 20Mhz temporizando con el TMR0
« Respuesta #9 en: 10 de Julio de 2016, 23:40:13 »
Eso lo se ...........pero escribi ese programa solo para ver esos mensajes en las 2 lineas, por eso no eran necesarios pero si voy a intergrar mas funciones al programas tengo que colocarlas..........gracias de todas maneras por la acotacion y el apoyo
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything