TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: 200810521 en 29 de Junio de 2011, 17:26:33
-
Hola, estoy haciendo un programa de control de temperatura lm35 en el cual la temperatura se debe mostrar el lcd, en la simulacion de proteus si funciona, osea displaya la temperatura, pero cuando lo implemento no sale nada, ( si prende el lcd, pero no envia ningun dato al parecer.)
Gracias de antemano
A continuacion les adjunto el programa y la imagen de la simulacion.
(http://s2.subirimagenes.com/fotos/previo/thump_6597385simulacion.png)
el programa:
;-----[ Ajustes Iniciales ]----------
LIST P=PIC16F877A
include "P16F877A.INC"
;include "Macros.asm"
;----------------------------------------------------------------------------------
;-----[ Literales y Constantes ]-----
;----------------------------------------------------------------------------------
;-----[ Variables ]-----
contador equ 0x30
retardo equ 0x31
HEXADECIMAL equ 0X32
ASCII_M equ 0x33
ASCII_H equ 0x34
ASCII_L equ 0x35
;compara equ 0x32
;----------------------------------------------------------------------------------
;-----[ Vectores ]-----
org 0x000 ; Vector de todos los Re-inicios
goto Principal ; Primera línea del Programa Principal
org 0x005
; Para si (por error) ocurriera una interrupción
;----------------------------------------------------------------------------------
;-----[ Tablas ]-----
;
; Sin tablas
;----------------------------------------------------------------------------------
;-----[ Programa Principal ]-----
;
Principal
call Inicio ; Inicia todo lo necesario
Lazo
goto Leds ; Recibe la informacion
;-----[ Inicio ]-----
;-----------------------------------------------------------------------------------
;Inicialización del puerto A:
Inicio
CLRF STATUS ;Selecciona Banco 0
CLRF PORTB ;Inicializa latches de datos de PORTB
MOVLW 0x41 ;Selecciona el Fosc/8,canal 0 del adc, enciende el conversor
MOVWF ADCON0
BSF STATUS, RP0 ; Se selecciona el banco 1
BCF STATUS, RP1
MOVLW 0x01 ;Selecciona todos los pines analogicos y el resultado se guerda en ADRESL
MOVWF ADCON1
MOVLW 0xFF ;configura todas patitas del puerto A como entradas
MOVWF TRISA
MOVLW 0x00 ;configura todas patitas de puerto B
MOVWF TRISB ;como salidas digitales
MOVWF TRISC ;como salidas digitales
return
;-----------------------------------------------------------------------------------
;Una vez inicializado el puerto
Leds
BCF STATUS,RP0 ;regresa al banco 0
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
Ciclo
BSF ADCON0,2 ; empiesa la conversion
BTFSS PIR1,6 ;se espera a q termine la conversion
GOTO Ciclo
movf ADRESL,w ;se mueve el valor de la conversion a w
BCF PIR1,6 ;se limpia el bit ADIF
CALL Hex_Ascii ;llama a convertir a ascii
call limpia ;limpia el lcd
movf ASCII_H,w ;imprime el valor de centenas en el lcd
call envia
movf ASCII_M,w ;imprime el valor de decenas en el lcd
call envia
movf ASCII_L,w ;imprime el valor de unidades en el lcd
call envia
movlw 0xDF ;visualiza "°"
call envia
movlw "C"
call envia
GOTO Ciclo
;-----------------------------------------------------------------------------------
delay
movlw 0xF9
movwf retardo
cicloGG
movlw 0xFF
movwf contador
ciclo2
decfsz contador
goto ciclo2
decfsz retardo
goto cicloGG
return
;-----------------------------------------------------------------------------------
;subrutina para inicializar el lcd
inicialcd
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
call comando ; Se da de alta el comando
movlw 0x0C ; Se selecciona la primera linea
call comando ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
call comando ; Se da de alta el comando
bsf PORTB, 1 ; Rs se pone en 1 para deshabilitar el uso de comandos
return
;-----------------------------------------------------------------------------------
;subrutina para enviar comandos
comando
movwf PORTC
bsf PORTB, 0 ; Pone la señal E en 1, espera un tiempo y luego la regresa a
call delay
call delay
bcf PORTB, 0
call delay
return
;subrutina para enviar un dato
;-----------------------------------------------------------------------------------
envia
bsf PORTB, 1 ; rs en 1
call comando
return
;-----------------------------------------------------------------------------------
linea2
bcf PORTB, 1 ; rs en 0
movlw 0xc0 ; selecciona linea 2 pantalla en el LCD
call comando ; Se da de alta el comando
return
;-----------------------------------------------------------------------------------
limpia
bcf PORTB, 1 ; rs en 0
movlw 0x01 ; limpia lcd pantalla en el LCD
call comando ; Se da de alta el comando
return
;-----------------------------------------------------------------------------------
;convertimos el valor del adc a decimal(ascii)
Hex_Ascii ;cargar en W el dato hex.
MOVWF HEXADECIMAL
clrf ASCII_H ;Para BCD D'0'
clrf ASCII_M ;Para BCD D'0'
clrf ASCII_L ;Para BCD D'0'
Centenas
;-----------------------------------------------------------------------------------
movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
;-----------------------------------------------------------------------------------
Decenas
movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
;-----------------------------------------------------------------------------------
Unidades
movf HEXADECIMAL,W ;El resto pertenece
movwf ASCII_L ;a las unidades BCD
clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
;-----------------------------------------------------------------------------------
Bcd_A_Ascii
movlw H'30' ;H'30' --> W
iorwf ASCII_L,F ;Convierte de BCD a ASCII
iorwf ASCII_M,F ;Convierte de BCD a ASCII
movf ASCII_H,F ;ASCII_H --> F
btfsc STATUS,Z ;? ASCII_H es D'00' ?
goto Espacio ;Si
movlw H'30' ;H'30' --> W
iorwf ASCII_H,F ;Convierte de BCD a ASCII
return ;Retorna
;-----------------------------------------------------------------------------------
Espacio
movlw '0' ;A' ' --> W
movwf ASCII_H ;A' ' --> ASCII_H
return ;Retorna
END
-
.
¿Qué display estás usando? ¿Al encenderlo no muestra nada o muestra solo cuadros negros?
-
Recuadros negros en la parte de arriba del lcd es el 1620a-17 el comun el de pantalla azul
ayuda mañan es mi presentacion final
-
Recuadros negros en la parte de arriba del lcd es el 1620a-17 el comun el de pantalla azul
ayuda mañan es mi presentacion final
los cuadros nnegros es porque necesitas cambiarle el contraste, ponle un poteciometro al pin 3 de la lcd, y variale hasta que se vean bien los numeros
-
Colocaste potenciometro de contraste?
-
si puedo regular el contraste pero igual no me bota nada asi le baje el contraste o le suba
-
deberias ver al menos que los cuadros negros van aclarandose u obscureciendo, como tienes conectado tu potenciometro?
-
Si puedo regular el potenciometro para ver los cuadritos negros pero si lo veo en mi simulacion pero pienso que algo esta mal en el programa sin embargo la simulacion si funciona puedes revisar el programa para ver si esta algo mal porfavor.
-
me parece que tu programa esta bien, si fucniona en la simulacion deberia funcionar en hardware, si estas poniendole cristal y el boton del mclr?
-
si esta el cristal de 10m herz y el potenciometro a 10 k pero igual no displaya nada nose porque?
-
Resistencia en PIN MCLR? Que configuración de fusibles colocas?
-
si en la pata 1 con un pulsador que mas podria ser?
-
Que configuración de fusibles colocas?
-
A QUE TE REFIERES CON ESO?
-
Que configuración de fusibles colocas?
se refiere a que palabras de configuracion le pusiste a tu programa
-
te reifers a mis pines de entrada y salida
?
-
te reifers a mis pines de entrada y salida
?
se refiere a como esta configurado tu pic, con o sin master clear, con oscilador interno, o externo, etc. en el mplab aparece en "configure", y luego en "configuration bits"
-
Hola a Todos
Viendo el programa principal veo que cuando comienza haces un GOTO PRINCIPAL y luego de hay saltas a CALL INICIO
en la subrutina inicio configuras los puertos y demas dentro de la BANCO 1 y terminas con return sin volver antes al BANCO 0 al salir ? :shock: siguiendo el programa veo que si vuelves al BANCO 0 pero dentro de la rutina siguiente LEDS ? creo que tendrias que modificar esto porque estando en el banco1 no podras volver del llamado :shock:.
Tambien vi que cuando inicializas el lcd no tienes una demora antes de comenzar con los comandos ,tendrias que esperar un tiempo antes de comenzar con esto ya que la velocidad de inicio del microcontrolador es mayor a la del lcd y puede que no este listo para recivir comandos de forma inmediata. :shock:
principal
call Inicio ; Inicia todo lo necesario
Lazo
goto Leds ; Recibe la informacion
;Inicialización del puerto A:
INICIO
CLRF STATUS ;Selecciona Banco 0
CLRF PORTB ;Inicializa latches de datos de PORTB
MOVLW 0x41 ;Selecciona el Fosc/8,canal 0 del adc, enciende el conversor
MOVWF ADCON0
BSF STATUS, RP0 ; Se selecciona el banco 1
BCF STATUS, RP1
MOVLW 0x01 ;Selecciona todos los pines analogicos y el resultado se guerda en ADRESL
MOVWF ADCON1
MOVLW 0xFF ;configura todas patitas del puerto A como entradas
MOVWF TRISA
MOVLW 0x00 ;configura todas patitas de puerto B
MOVWF TRISB ;como salidas digitales
MOVWF TRISC ;como salidas digitales
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
;-----------------------------------------------------------------------------------
;Una vez inicializado el puerto
Leds
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
Saludos!!