interrupcion del RB0

hola a todos.
Tengo un programa con el f877 que usa la interrupcion del pin RB0 como contador de eventos, el cual me funciona bien.
Los resultados de las lecturas de me los muestra en un lcd 2x16.
Sin embargo, y ahi va mi pregunta, en cierto momento el conteo se altera como si los pulsos los recibiera a altísimas velocidades lo cual no es cierto pues solo llegan pulsos cada segundo.
Asi pues, el contador se "enloquece" y llega un momento que el display se apaga y toca resetear.
Por casualidad, desconecte el cable que llega al pin RB0 y lo toqué con la mano y empezó a presentar este mismo problema por lo que creí que era por no tenerla a tierra, entonces puse la resistencia del pin a tierra y reconecté la entrada de los pulsos externo a ver si se arreglaba.... pero no :( . Sigue igual. Funciona digase 10 minutos bien y luego sucede esto.

Que puede ser? será que la resistencia debe ir es a +V ? por lo del Pull Ups ?

si alguien me puede sacar de este lio se lo agradezco mucho..
 
Puede ser que RB0 se dispare por ruido, interferencia, rebotes si lo tenés conectado a un switch...
Cómo lo tenés conectado actualmente?.
Viendo lo que decís de que hay un cable conectado directamente a RB0... bueno el cable bien puede tomar interferencia, no estaría demás poner una resistencia en serie (100 ohms) con algún capacitor chico (56 pf) para ver si es eso (si está armado quizás podés conectar eso en el borne de entrada para hacer una prueba sencilla).
Lo del pull-up o pull-down te asegura un estado lógico de la entrada en 0 (pull-down) o 1 (pull-up) si al cable no le aplica tensión el dispositivo conectado en el otro extremo, pero no te elimina interferencia porque la tensión del cable seguiría entrando en forma directa a RB0.
Me suena interesante eso de que anda por 10 minutos, y recién después salta el problema. Eso podría hablar de que hay algo que se calienta y mete problemas (cotejar consumos) o por ahí activás algo a los 10 minutos....
En fin, estaría bueno que pongas un diagrama (o lo expliques con palabras en todo caso) de que es lo que está conectado a RB0.
Saludos
 
Gracias Argodan por tu interés. Te comento...
la conexion está asi

pin RB0---------------------- pulsos de entrada (un pulso por segundo)
I
I
R x 1k
I
I
GND

Es asi la conexión. Igual puse la R de 1k desde +V pero pasa igual. Funciona hasta 30 o 40 minutos bien y de un momento a otro, se "enloquece" el conteo y se queda en blanco el display. Otras veces es mas rápido que presenta el problema. Lo de los 10 minutos no es que sea en ese preciso momento, es mas bien a modo de ejemplo... a veces 5, 10 o más minutos.
Suena muy convincente lo del ruido que entra por el cable. Pondré un condensador del pin a tierra a ver como me funciona.
Te estaré comentando... .
 
Ok, esperamos a ver que pasa. Acordate de probar con una resistencia serie desde la entrada del cable hasta RB0.

(<1K)
entrada cable --|-- Rserie --------|-----RB0
(pulsos) | ----
Rpd ---- 56pf
| |
GND GND

No hace falta sacarle el pull-down (la resistencia que ya pusiste).
Ahora, que características tiene los pulsos que mandas por el cable, son entre 0 y 5V?, que corriente puede mandar el dispositivo del otro extremo del cable?

También como dice mabauti, puede haber lío con el programa, alguna rutina en la que entrás después del tiempo que comentaste, algún desborde de alguna variable que no hayas tenido en cuenta.

Y si ves que el problema sigue fijate si hay algo en el circuito que haya calentado (a dedímetro con una pulsera estática, despues de cortar alimentación por supuesto).

En fin, si no hay caso vas a tener que postear la mayor cantidad de información posible, porque podrían ser muchas cosas.
 
Hola Juankah, yo te aconsejo q pruebes añadiendo un buffer a la salida del pin RB0 (74LS245) y de la salida del buffer al LCD, inclusive los 14 pines del LCD deberian ser manejados via buffer, de lo contrario es probable q te despidas de tu pic, ya que estos son tan delicados como que los soplas y adios, yo tuve alguna vez ese problema cuando comence a manejar pic's y el problema era corriente, el LCD necesita cierta cantidad de corriente en su funcionamiento, de lo contrario funciona a la de Dios y cmo tu dices que a veces da 5mins o a veces 10mins o 20mins, no es constante, a veces da y otras no.

Otro problema puede ser el copilador que utilices, cual estas utilizando MPLAB? Pic Basic Pro?, algunas veces copila mal y hace que los registros en la programación no sean secueciales, me explico puede que tu interrupcion la manejes por pulling o programando el registro de interrupcion, en cualquiera de los dos casos utilizas saltos o jmp algunas veces, muy raras veces el copilador carga mal el programa al pic y este se enloquece y uno piensa que hice mal, y revisa el hardware y nada esta todo bien, prueba programando de nuevo y si es necesario cambia de programador.

Si vas ha utilizar buffers, dos seran los que utilices, uno para los pines de datos del LCD que son ocho y otro para los tres de control RS RW y E, el 74LS245 maneja un bus de ocho bits que pueden ser transmitidos de A a B o de B a A configurable por medio de dos pines de control DIR y Enable... ah y me olvidaba es triestado, en su datasheet dice mas y facil de manejar, prueba y me avisas como te va...

Saludos
 
Hola a todos y gracias por sus respuestas.. les cuento como voy... ahhh primero que todo, los pulsos provienen de un reed swiche que está pegado a la rueda de un carro, pues el programita es de un tacómetro.
Entonces puse el capacitor de 47nf a la entrada del pin RB0 pero no le puse la resistencia en serie. El probrema persiste, empieza a trabajar pero a medida que el carro avanza el contador se descontrola pues muestra en el display números erroneos y en un momento dado se apaga. Puse un led de monitoreo que enciende y apaga durante todo el lazo del proceso y aun con el display en blanco el led sigue funcionando como si todo fuera bien.
a continuacion la subrutina de interrupcion.

;--------------- RUTINA DE INTERRUPCION --------------------------
incr_tarifa
btfss INTCON,INTF
goto fin_int

normal incf pulsos,1
movlw x_pulsos ;x_pulsos es una constante
xorwf pulsos,0
btfss STATUS,CERO
goto resetee


rx_pulso incf mts_l,1 ;parte baja de cont. de metros
movlw 0xff
xorwf mts_l,0
btfss STATUS,CERO
goto sume
incf mts_h,1 ;parte alta de cont. de metros

;aqui va una suma propia que hace parte de una gestion del programa

sume movlw valor_h ;parte alta sumando 1
movwf ACCaHI
movlw valor_l ;parte baja sumando 1
movwf ACCaLO

movf total_h,0 ;parte alta sumando 2
movwf ACCbHI ;parte baja sumando 2
movf total_l,0
movwf ACCbLO

call D_add ;
RESULTADO ; LA SUMA QUEDA EN TOTAL

movf ACCbHI,0
movwf total_h ;pasa resultado a reg. tot
movf ACCbLO,0
movwf total_l
clrf pulsos
goto resetee

resetee movlw inicio_timer
movwf TMR0

fin_int bcf INTCON,T0IF
bcf INTCON,INTF

retfie

como ven es algo supremamente sencillo solo con el contador de pulsos incrementa un registros y de acuerdo a la cantidad de pulsos hace una sumatoria.

COMO VEN TAMBIEN,,, TRABAJO CON EL ASSEMBLER DE MICROCHIP PUES NO SE TRABAJAR EN C.
 
Atrás
Arriba