Monitoreo de sensor con pic16f84

Alguien podria ayudarme a utilizar interrupciones externas y tMR0?
Trato de hacer un proyecto que monitoree un sensor mientras se encuentre sensando se incremente el timer0 cada segundo alguien podria ayudarme??
 
hola MARkoo, paso a explicarte como funciona la interrupción externa del pic16f84. La interrupción se aplica en el terminal RB0 (que corresponde al pin 6) ya sea por flanco ascendente o descendente; esto ultimo lo puedes determinar en el registro OPTION en el bit 6 (INTDG) donde "1" correpondera al flanco ascendente y "0" al flanco descendente.
Cuando se activa la interrupción lo que el pic hace es "saltar" automaticamente abandonando la tarea que este haciendo a la dirección de memoria 0004. O sea que podemos hacer que el pic atienda una tarea en el momento que nosostros decidamos por hardware. La manera tradicional en que se realiza la interrupción es la siguiente (en asembler)

org 00
goto inicio
org 04
goto inter
inicio bcf status,5 ;inicio del programa que queramos.

De esta manera luego utilizaras otra etiqueta para la interrupción y desarrollaras la subrutina de interrupcion. Como el pic guarda en la memoria la dirección en que estaba antes de que se produciera la interrupción externa se regresa al programa principal con la instrucción "RETFIE" que tiene la particularidad de que vuelve a esa dirección y sigue desarrollando el programa principal.

Con respecto a que requieres que el TMR0 aumente cada 1 segundo la unica manera que se me ocurre es variando el tipo de reloj para el mismo. En el mismo registro OPTION en el bit 5 (TOCS) tienes la opción de utilizar el reloj interno que es igual a la Fosc/4 (frecuancia de oscilador) en caso de que lo pongas a "0" y en caso de que este a "1" utilizará los pulsos introducidos a través del TOCKl que seria el terminal RA4 (pin 3). A su vez con el bit 4 (TOSE) del mismo registro podes hacer que incremente el TMR0 por flanco ascendente si este esta a "0" o por flanco descendente si esta a "1".
En este pin deberias conectar un oscilador de 1Hz que es sencillo de hacer con un circuito integrado como el 555.

Bueno espero haberte ayudado y despues me cuentas como te ha ido con tu proyecto. Suerte.
Nico
 
MARkoo, como dice Nicolas_Durst tienes que usar la interrupcion del pic, pero no es necesario utilizar un 555 como reloj, ya que el problema puede ser solucionado por software. tmr0 puede ser comandado por (fosc/4)/preescaler o por (fosc/4) o por TOCK4(ra4), si seleccionas un preescaler y tienes al pic funcionado a 4 mhz entonces al maximo preescaler tendras una interrupcion cada 33.3ms aproximadamente, lo que tienes que acer en tu interrupcion es preguntar el origen de la interrupcion por el registro INTCON si no estoy errado, ahi los 3 ultimos bits son banderas de interrupcion, lo unico que tienes que hacer es tener dos subrutinas, preguntas si se activo la bandera de overflow del TMR0, si lo esta la ceras(T0IF=0),y llamas a una subrutina, que debera contener un contador auxiliar, debera cada vez incrementar en 1 y preguntar si el contador auxiliar es 30, puesto que 33.3ms*30veces = 999ms ~ 1000ms = 1seg,
si es 30 entonces incrementas tus segundos......,luego preguntas la flag del RB0/INT y si esta seteada la ceras(INTF = 0 si no me equivoco) y llamas a tu subrutina pues se habra activado el sensor, pero si quieres mas velocidad de cheque del sensor(<33.3ms) entonces bajas el preescaler y calculas... segun el preescaler @4mhz los tiempos pueden ser: 512microsegundos,4 milisegundos, 8 milisegundos, etc puedes por ej poner el preesc. en 8ms y 1000ms/8ms = 125, cuentas con el auxiliar hasta 125d(hex'7d') y luego incrementas los segundos, y ahi tienes tu aplicacion.... espero haberte sido de ayuda,MARkoo


'los idiotas mantienen el orden, los genios dominan el caos....'
 
Atrás
Arriba