Consideraciones Para el uso del PIC16F877A

Que tal. tengo un ligero problema con un PIC16F877A, la cosa es que lo utilizo en un proyecto para un termometro digital. la temperatura se muestra en un lcd HD44780 de 2x16 caractéres.
he programado el codigo y todo el programa , quiero pensar , se encuentra bien , no creo que haya algun tipo de error en el mismo, esto lo digo por que lo he simulado en el Proteus, lo primero que hace es una subrutina donde se lee el dato que se encuentra en el puerto b, y separa las centenas, decenas , y unidades , y las guarda en 3 locaciones de memoria distintas, estas son
20h , 21h, 22h . posteriormente habiendo impreso el pedazo de texto "Temp.=" de 6 espacios, salta a otra rutina del programa que se encarga de imprimir "RAM1,RAM2,RAM3,D,E,C,., , , ," EN EL LCD y regresa a la rutina de capturar el nuevo dato en PORTB y asi consecutivamente se cicla el programa.
Y el problema es que cuando la pata RB3 del PORTB es llevada a 1 logico, el programa se traba
y pareciera como si se reseteara el PIC, y el texto se desplaza ó se desordena.
aqui dejo el link del video para que se aprecie mejor:

YouTube - Broadcast Yourself.

el LCD esta controlado por: RS=PORTD,0 , E=PORTD,, el bus de datos está configurado para 8 bits, y esta controlado por PORTC, y PORTB es la entrada de datos desde el ADC0804LCN.

espero que alguien me pueda decir si hay consderaciones que me salté con el PIC16F877A
y que es lo que puedo hacer.

El código .asm que programé es:
-----------------------------------------------------------------------------------------------------------------------------

LIST p=16F877A , R=DEC
__FUSES _RC_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
INCLUDE <P16F877A.INC>

;----PORT CONFIGURATION------------------------------------------

CLRF PORTB
CLRF PORTD
CLRF PORTC
BSF STATUS,5
MOVLW B'00000000'
MOVWF PORTD
MOVLW B'11111111'
MOVWF PORTB
MOVLW B'00000000'
MOVWF PORTC
BCF STATUS,5
CLRF PORTD
CLRF PORTC
CLRF RAM1
CLRF RAM2
CLRF RAM3
CLRF RAM4
CLRF RAM5
CLRF RAM6
CLRF RAM7


COUNT1 EQU 0EH
COUNT2 EQU 0FH
RAM1 EQU 20H
RAM2 EQU 21H
RAM3 EQU 22H
RAM4 EQU 23H
RAM5 EQU 24H
RAM6 EQU 25H
RAM7 EQU 26H


;------------- START LCD-----------------------


START CALL DELAY1
CALL DELAY1
CALL DELAY1
MOVLW 48
CALL CONT
MOVLW 6
CALL CONT
MOVLW 12
CALL CONT
GOTO MAPORTB
;----------------------------------------------------------------------
MAPORTB
RESTA MOVLW 0 ;------------START----------------------
MOVWF COUNT2
MOVWF RAM5
MOVWF RAM1
MOVWF RAM2
MOVWF RAM3

GET_VAL MOVF PORTB,W
MOVWF RAM5

OP1 MOVF RAM5,W
XORLW 0
BTFSC STATUS,Z
GOTO BEGIN
DECF RAM5,F
INCF COUNT2,F
MOVF COUNT2,W
MOVWF RAM1
MOVF COUNT2,W
XORLW B'1010'
BTFSC STATUS,Z
GOTO OP2
GOTO OP1

OP2 CLRF COUNT2
INCF RAM2,F
MOVF RAM2,W
XORLW B'1010'
BTFSC STATUS,Z
GOTO OP3
GOTO OP1

OP3 CLRF RAM2
INCF RAM3,F
MOVF RAM3,W
XORLW B'1'
BTFSC STATUS,Z
NOP
GOTO OP1 ;-----------------END----------------

;---------------------------------------------------------------

PRINT BSF PORTD,0
CONT BSF PORTD,1
MOVWF PORTC
CALL DELAY2
BCF PORTD,1
RETURN
BEGIN

RESET MOVLW 0
MOVWF RAM4

CYCLE MOVF RAM4,W
XORLW 6
BTFSC STATUS,Z
GOTO VALP
GOTO RUN

RUN MOVF RAM4,W
CALL TABLA
CALL PRINT
CALL DELAY2
INCF RAM4,F
GOTO CYCLE

TABLA ADDWF PCL,1
RETLW "T"
RETLW "e"
RETLW "m"
RETLW "p"
RETLW "."
RETLW "="

VALP
MOVF RAM3,W
CALL TABLA2
CALL PRINT
MOVF RAM2,W
CALL TABLA2
CALL PRINT
MOVF RAM1,W
CALL TABLA2
CALL PRINT
MOVLW "D"
CALL PRINT
MOVLW "E"
CALL PRINT
MOVLW "C"
CALL PRINT
MOVLW "."
CALL PRINT
MOVLW " "
CALL PRINT
MOVLW " "
CALL PRINT
MOVLW " "
CALL PRINT
GOTO MAPORTB

TABLA2 ADDWF PCL,F
RETLW "0"
RETLW "1"
RETLW "2"
RETLW "3"
RETLW "4"
RETLW "5"
RETLW "6"
RETLW "7"
RETLW "8"
RETLW "9"
RETLW "0"


DELAY1 MOVLW 255
MOVWF COUNT1
LOOP1 DECFSZ COUNT1,1
GOTO LOOP1
MOVLW 255
MOVWF COUNT1
LOOPA DECFSZ COUNT1,1
GOTO LOOPA
RETURN

DELAY2 MOVLW 250
MOVWF COUNT1
LOOP2 DECFSZ COUNT1,1
GOTO LOOP2
RETURN
END
-----------------------------------------------------------------------------------------------------------------------

el archivo .HEX es :
-----------------------------------------------------------------------------------------------------------------------
:020000040000FA
:1000000086018801870185018801870183160030F8
:100010008800FF3086000030870083128801870146
:10002000A001A101A201A301A401A501A6018220B2
:100030008220822030304520063045200C3045207B
:10004000212800308F00A400A000A100A200060813
:10005000A4002408003A03194A28A4038F0A0F08B1
:10006000A0000F080A3A0319362829288F01A10A8F
:1000700021080A3A03193D282928A101A20A2208C9
:10008000013A0319000029280814881487008B20DE
:10009000881008000030A3002308063A03195E28E0
:1000A00051282308572044208B20A30A4C2882077C
:1000B000543465346D3470342E343D342208762047
:1000C0004420210876204420200876204420443013
:1000D000442045304420433044202E3044202030FA
:1000E000442020304420203044202128820730340E
:1000F00031343234333434343534363437343834BC
:1001000039343034FF308E008E0B8428FF308E005F
:100110008E0B88280800FA308E008E0B8D28080080
:02400E00F33F7E
:00000001FF
-----------------------------------------------------------------------------------------------------------------------
 

Adjuntos

  • circuitojpeg_726.jpg
    circuitojpeg_726.jpg
    218.1 KB · Visitas: 50
no conozco mucho sobre pic
pero bueno esto es lo que creo que esta pasando

el pic internamente esta configurado con un pull up, y este de talle se te haya escapado.

Bueno tendríamos que desactivarlo, para que las resistencias que tu tienes como pull up, funcione como tal; y cuando aplique 1logico como mencionas, realmente sea el que llega y no es interpretado por el pic como "0" lógico.

es algo de RBPU(OPTION REG<7>)

suerT
 
Hola, agrega a tu palabra de configuración (ahí al inicio donde dice _FUSES etc etc)
agregale en cualquier lado /puede ser al final) &_LVP_OFF

Dime luego si funciona............
Saludos
Raúl
 
Debes poner en el programa esto:

ORG 0
GOTO ........ ;Cuando hay un reset, el CP viene aca y se dirige al principio del
;programa

ORG 4
....... ......... ;Aquí va la interrupción, si no hay interrupción poner lo mismo que
;ORG 0
 
Muchas gracias , el problema, como lo decía Elvic estaba en el registro de OPCIONES, en el bit 7 que es el que me habilita la función Pull-up, esto es para que el bit que se le esta enviando en este caso 0 ó 1 no se almacene en el bus de datos del puerto y lo interprete como una instrucción de interrupción para salir del estado de sleep , en este caso lo uso para deshabilitar todo eso y mando 1 bit al registro, para poderlo usarlo sin problemas.

nuevamente , Muchas gracias!
 
Atrás
Arriba