Autor Tema: Visualizar en formato binario a LCD  (Leído 3289 veces)

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

Desconectado Dhanjel

  • PIC10
  • *
  • Mensajes: 5
Visualizar en formato binario a LCD
« en: 27 de Agosto de 2011, 12:46:57 »
Buenos días foristas , soy nuevo en el foro y quiero pedirles un favor.

Tengo que implementar un contador de 8 bits, que visualice en formato binario a LCD 2x16. Como hasta ahora comienzo, decidí hacer primero un contador con longitud de un nibble, osea, de "0000" hasta "1111" (código ascii) para ver en lcd y luego implementar una subrutina que aproveche esto para que visualice un nibble y luego el otro y ver así el byte,pero como 1's y 0's.

Uso un PIC16F84A, el contador lo incrementa un pulsador en RBO, cargo el valor del contador en W y llamo una tabla con los caracteres ascii, y también uso otro registro llamado "puntero" que me cuenta si los caracteres visualizados a LCD son 4, si son menos, es porque no ha salido el último caracter 1/0 a LCD y vuelvo a la tabla para sacarlo.


Mi  problema es que uso la técnica de DT"0000" DT"0001", el "contador"  es puntero del mensaje (o nibble) y el "puntero" es el puntero dentro del mensaje, que indica ala posición del caracter para sacar a LCD.

La cosa es que el conteo en Proteus cuenta bien al principio y se estropea;
Inicializa en "0000", incremento a  "0001", "0010" y luego cuanta mal, pero  no es rebote, ya hice varios retardos y nada funciona, y al grabar el PIC sin darle pulso, cuenta como loco, lo cual es raro porque el incremento del contador y el puntero los controlo, pero hay algo de lo que no me he dado cuenta y que no puedo resolver.

Hasta me copié una rutina del libro "PIC16F84A Desarrollo de proyectos" llamada "LCD_MENS.INC", pero el asunto es que
en esta, se carga la etiqueta del mensaje (caracteres ascii) , pero en mi caso, yo cargo el valor del contador y lo uso como puntero para cada etiqueta en la tabla de mensajes  y el puntero, para controlar el fin del mensaje, verificando que envió los 4 caracteres.

Este es el código que hice:

list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;********************************************************************************************************************************
        ORG 0X00
       GOTO INICIO

      contador EQU  0x0C 
      puntero  EQU  0x0D

      CBLOCK  0x0E
      ENDC     
;*********************************************************************************************************************************
Mensajes_BIN  ADDWF PCL,1

BIN_0000
 DT "0000"
;BIN_0001
 DT "0001"
;BIN_0010
 DT "0010"
;BIN_0011
 DT "0011"
;BIN_0100
 DT "0100"
;BIN_0101
 DT "0101"
;BIN_0110
 DT "0110"
;BIN_0111
 DT "0111"
;BIN_1000
 DT "1000"
;BIN_1001
 DT "1001"
;BIN_1010
 DT "1010"
;BIN_1011
 DT "1011"
;BIN_1100
 DT "1100"
;BIN_1101
 DT "1101"
;BIN_1110
 DT "1110"
;BIN_1111
 DT "1111"
FinMensajes_BIN
;*******************************************************************************************************************************

INICIO
          call  LCD_Inicializa
          clrf  contador         ;este registro comienza en 0 ,es el puntero para acceder a los valores binarios del nibble
          clrf  puntero          ;este registro comienza en 0, cuenta el # de caracteres del valor binario, que deben ser 4
           
          movlw '0'              ;el conteo esta iniciado desde "0000"
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter

Principal
       
          btfss PORTB,0           ;si se oprime pulsador en RB0
          goto  Principal         ;
suelta    btfsc PORTB,0           ;revisa que se halla soltado
          goto  suelta            ;elimina rebote, 50ms
          call  Retardo_100ms
          call  LCD_Borra         ;borra el caracter actual en lcd para visualizar otro valor, al que incrementa
          incf  contador,1        ;aumenta contador para que busque un nibble distinto cada vez
envia     
          movf  contador,0        ;cargo el contador para que sea puntero de las tablas
          addwf puntero,0         ;sumo el valor puntero que indica la posición del caracter
          addlw BIN_0000          ;se carga la dirección BI_0000 como punto de partida
          addlw  .1               ;hasta donde los valores de puntero,contador+1 lo determinen
          call  Mensajes_BIN
          call  LCD_Caracter      ;rutina lcd que muestra caracteres scii en la pantalla lcd
          incf  puntero
prueba                            ;cuando sale un caracter, registra cada vez hasta que llegue al cuarto
          movlw 0x04              ;puntero=4?
          xorwf puntero,0         ;acaba de escribir los 4 caracteres y si faltan, entonces sigue hasta el último
          btfss STATUS,Z          ;ya acabó?
          goto  envia             ;no, apunta al siguiente caracter
          clrf  puntero           ;si, puntero se borra y esperamos pulso para volver a incrementar
          goto  Principal
         
include<LCD_4BIT.INC>
include<RETARDOS.INC>
 
end

   

         
           
           

           







Desconectado Dhanjel

  • PIC10
  • *
  • Mensajes: 5
Re: Visualizar en formato binario a LCD
« Respuesta #1 en: 27 de Agosto de 2011, 12:56:55 »
Buenos días foristas , soy nuevo en el foro y quiero pedirles un favor.

Tengo que implementar un contador de 8 bits, que visualice en formato binario a LCD 2x16. Como hasta ahora comienzo, decidí hacer primero un contador con longitud de un nibble, osea, de "0000" hasta "1111" (código ascii) para ver en lcd y luego implementar una subrutina que aproveche esto para que visualice un nibble y luego el otro y ver así el byte,pero como 1's y 0's.

Uso un PIC16F84A, el contador lo incrementa un pulsador en RBO, cargo el valor del contador en W y llamo una tabla con los caracteres ascii, y también uso otro registro llamado "puntero" que me cuenta si los caracteres visualizados a LCD son 4, si son menos, es porque no ha salido el último caracter 1/0 a LCD y vuelvo a la tabla para sacarlo.


Mi  problema es que uso la técnica de DT"0000" DT"0001", el "contador"  es puntero del mensaje (o nibble) y el "puntero" es el puntero dentro del mensaje, que indica ala posición del caracter para sacar a LCD.

La cosa es que el conteo en Proteus cuenta bien al principio y se estropea;
Inicializa en "0000", incremento a  "0001", "0010" y luego cuanta mal, pero  no es rebote, ya hice varios retardos y nada funciona, y al grabar el PIC sin darle pulso, cuenta como loco, lo cual es raro porque el incremento del contador y el puntero los controlo, pero hay algo de lo que no me he dado cuenta y que no puedo resolver.

Hasta me copié una rutina del libro "PIC16F84A Desarrollo de proyectos" llamada "LCD_MENS.INC", pero el asunto es que
en esta, se carga la etiqueta del mensaje (caracteres ascii) , pero en mi caso, yo cargo el valor del contador y lo uso como puntero para cada etiqueta en la tabla de mensajes  y el puntero, para controlar el fin del mensaje, verificando que envió los 4 caracteres.

Este es el código que hice:

list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;********************************************************************************************************************************
        ORG 0X00
       GOTO INICIO

      contador EQU  0x0C 
      puntero  EQU  0x0D

      CBLOCK  0x0E
      ENDC     
;*********************************************************************************************************************************
Mensajes_BIN  ADDWF PCL,1

BIN_0000
 DT "0000"
;BIN_0001
 DT "0001"
;BIN_0010
 DT "0010"
;BIN_0011
 DT "0011"
;BIN_0100
 DT "0100"
;BIN_0101
 DT "0101"
;BIN_0110
 DT "0110"
;BIN_0111
 DT "0111"
;BIN_1000
 DT "1000"
;BIN_1001
 DT "1001"
;BIN_1010
 DT "1010"
;BIN_1011
 DT "1011"
;BIN_1100
 DT "1100"
;BIN_1101
 DT "1101"
;BIN_1110
 DT "1110"
;BIN_1111
 DT "1111"
FinMensajes_BIN
;*******************************************************************************************************************************

INICIO
          call  LCD_Inicializa
          clrf  contador         ;este registro comienza en 0 ,es el puntero para acceder a los valores binarios del nibble
          clrf  puntero          ;este registro comienza en 0, cuenta el # de caracteres del valor binario, que deben ser 4
           
          movlw '0'              ;el conteo esta iniciado desde "0000"
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter

Principal
       
          btfss PORTB,0           ;si se oprime pulsador en RB0
          goto  Principal         ;
suelta    btfsc PORTB,0           ;revisa que se halla soltado
          goto  suelta            ;elimina rebote, 50ms
          call  Retardo_100ms
          call  LCD_Borra         ;borra el caracter actual en lcd para visualizar otro valor, al que incrementa
          incf  contador,1        ;aumenta contador para que busque un nibble distinto cada vez
envia     
          movf  contador,0        ;cargo el contador para que sea puntero de las tablas
          addwf puntero,0         ;sumo el valor puntero que indica la posición del caracter
          addlw BIN_0000          ;se carga la dirección BI_0000 como punto de partida
          addlw  .1               ;hasta donde los valores de puntero,contador+1 lo determinen
          call  Mensajes_BIN
          call  LCD_Caracter      ;rutina lcd que muestra caracteres scii en la pantalla lcd
          incf  puntero
prueba                            ;cuando sale un caracter, registra cada vez hasta que llegue al cuarto
          movlw 0x04              ;puntero=4?
          xorwf puntero,0         ;acaba de escribir los 4 caracteres y si faltan, entonces sigue hasta el último
          btfss STATUS,Z          ;ya acabó?
          goto  envia             ;no, apunta al siguiente caracter
          clrf  puntero           ;si, puntero se borra y esperamos pulso para volver a incrementar
          goto  Principal
         
include<LCD_4BIT.INC>
include<RETARDOS.INC>
 
end

   
ahora que lo veo (de nuevo) me parece corto, hay algún otro control que deba hacer, es como si después del segundo incremento se saltara como loco, ya intenté varias cosas por ejemplo puse contador y punteo fuera del bloque de las variables, ya que las subrutinas lcd y retardos, inician con sus propias variables y el CBLOCK,ENDC así que los dejé por fuera, antes eran
CBLOCK 0x0c
contador
puntero
ENDC

 y los dejé así:

 contador EQU  0x0C 
 puntero  EQU  0x0D

      CBLOCK  0x0E
      ENDC     

Igual no sirve el conteo completo y me preocupa que al grabar el microPIC real, se incrementa solo y muy rápido, o sea si el es software y no el rebote, pero no no he siquiera intuido que sea, además no es siquiera oredenado, como un contador hexa LCD que se salta como loco igual, pero si deja ver un incremento ordenado.

Gracias por su ayuda.
         
           
           

           








Desconectado Dhanjel

  • PIC10
  • *
  • Mensajes: 5
Re: Visualizar en formato binario a LCD
« Respuesta #2 en: 27 de Agosto de 2011, 12:58:46 »
Buenos días foristas , soy nuevo en el foro y quiero pedirles un favor.

Tengo que implementar un contador de 8 bits, que visualice en formato binario a LCD 2x16. Como hasta ahora comienzo, decidí hacer primero un contador con longitud de un nibble, osea, de "0000" hasta "1111" (código ascii) para ver en lcd y luego implementar una subrutina que aproveche esto para que visualice un nibble y luego el otro y ver así el byte,pero como 1's y 0's.

Uso un PIC16F84A, el contador lo incrementa un pulsador en RBO, cargo el valor del contador en W y llamo una tabla con los caracteres ascii, y también uso otro registro llamado "puntero" que me cuenta si los caracteres visualizados a LCD son 4, si son menos, es porque no ha salido el último caracter 1/0 a LCD y vuelvo a la tabla para sacarlo.


Mi  problema es que uso la técnica de DT"0000" DT"0001", el "contador"  es puntero del mensaje (o nibble) y el "puntero" es el puntero dentro del mensaje, que indica ala posición del caracter para sacar a LCD.

La cosa es que el conteo en Proteus cuenta bien al principio y se estropea;
Inicializa en "0000", incremento a  "0001", "0010" y luego cuanta mal, pero  no es rebote, ya hice varios retardos y nada funciona, y al grabar el PIC sin darle pulso, cuenta como loco, lo cual es raro porque el incremento del contador y el puntero los controlo, pero hay algo de lo que no me he dado cuenta y que no puedo resolver.

Hasta me copié una rutina del libro "PIC16F84A Desarrollo de proyectos" llamada "LCD_MENS.INC", pero el asunto es que
en esta, se carga la etiqueta del mensaje (caracteres ascii) , pero en mi caso, yo cargo el valor del contador y lo uso como puntero para cada etiqueta en la tabla de mensajes  y el puntero, para controlar el fin del mensaje, verificando que envió los 4 caracteres.

Este es el código que hice:

list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;********************************************************************************************************************************
        ORG 0X00
       GOTO INICIO

      contador EQU  0x0C 
      puntero  EQU  0x0D

      CBLOCK  0x0E
      ENDC     
;*********************************************************************************************************************************
Mensajes_BIN  ADDWF PCL,1

BIN_0000
 DT "0000"
;BIN_0001
 DT "0001"
;BIN_0010
 DT "0010"
;BIN_0011
 DT "0011"
;BIN_0100
 DT "0100"
;BIN_0101
 DT "0101"
;BIN_0110
 DT "0110"
;BIN_0111
 DT "0111"
;BIN_1000
 DT "1000"
;BIN_1001
 DT "1001"
;BIN_1010
 DT "1010"
;BIN_1011
 DT "1011"
;BIN_1100
 DT "1100"
;BIN_1101
 DT "1101"
;BIN_1110
 DT "1110"
;BIN_1111
 DT "1111"
FinMensajes_BIN
;*******************************************************************************************************************************

INICIO
          call  LCD_Inicializa
          clrf  contador         ;este registro comienza en 0 ,es el puntero para acceder a los valores binarios del nibble
          clrf  puntero          ;este registro comienza en 0, cuenta el # de caracteres del valor binario, que deben ser 4
           
          movlw '0'              ;el conteo esta iniciado desde "0000"
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter
          movlw '0'
          call  LCD_Caracter

Principal
       
          btfss PORTB,0           ;si se oprime pulsador en RB0
          goto  Principal         ;
suelta    btfsc PORTB,0           ;revisa que se halla soltado
          goto  suelta            ;elimina rebote, 50ms
          call  Retardo_100ms
          call  LCD_Borra         ;borra el caracter actual en lcd para visualizar otro valor, al que incrementa
          incf  contador,1        ;aumenta contador para que busque un nibble distinto cada vez
envia     
          movf  contador,0        ;cargo el contador para que sea puntero de las tablas
          addwf puntero,0         ;sumo el valor puntero que indica la posición del caracter
          addlw BIN_0000          ;se carga la dirección BI_0000 como punto de partida
          addlw  .1               ;hasta donde los valores de puntero,contador+1 lo determinen
          call  Mensajes_BIN
          call  LCD_Caracter      ;rutina lcd que muestra caracteres scii en la pantalla lcd
          incf  puntero
prueba                            ;cuando sale un caracter, registra cada vez hasta que llegue al cuarto
          movlw 0x04              ;puntero=4?
          xorwf puntero,0         ;acaba de escribir los 4 caracteres y si faltan, entonces sigue hasta el último
          btfss STATUS,Z          ;ya acabó?
          goto  envia             ;no, apunta al siguiente caracter
          clrf  puntero           ;si, puntero se borra y esperamos pulso para volver a incrementar
          goto  Principal
         
include<LCD_4BIT.INC>
include<RETARDOS.INC>
 
end

   
ahora que lo veo (de nuevo) me parece corto, hay algún otro control que deba hacer, es como si después del segundo incremento se saltara como loco, ya intenté varias cosas por ejemplo puse contador y punteo fuera del bloque de las variables, ya que las subrutinas lcd y retardos, inician con sus propias variables y el CBLOCK,ENDC así que los dejé por fuera, antes eran
CBLOCK 0x0c
contador
puntero
ENDC

 y los dejé así:

 contador EQU  0x0C 
 puntero  EQU  0x0D

      CBLOCK  0x0E
      ENDC     

Igual no sirve el conteo completo y me preocupa que al grabar el microPIC real, se incrementa solo y muy rápido, o sea si el es software y no el rebote, pero no  he siquiera intuido que sea, además no es siquiera ordenado, como un contador hexa LCD que se salta como loco igual, pero si deja ver un incremento ordenado.

Gracias por su ayuda.
         
           
           

           









Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Visualizar en formato binario a LCD
« Respuesta #3 en: 30 de Agosto de 2011, 12:16:44 »
¿Como tienes conectado el pulsador al RB0?