TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: morante en 19 de Agosto de 2008, 13:59:53
-
Lo primero, un saludo a todos. Hace poco que he empezado con esto de los PIC, así que llevo unas semanas leyendo , y me está sirviendo de mucho.
Ya he hecho algún programilla en ensamblador, así que me he decidido a programar en C. Estoy haciendo un sencillito programa de un deposito con dos sensores que produzcan una interrupcion por cambio de estado (INT_RB). El problema es que en la simulación con proteus, no consigo que entre en la interrupción, y no sé a que puede deberse. El codigo es:
----------------------------------------------------------------------------------------------------------------------------
#include <16F84a.h> ////Dispositivo que utilizo.
#fuses XT,NOWDT,NOPUT,NOPROTECT ////Configuracion de fusibles.
#use delay(clock=4000000) ////cristal a 4MHZ.
#byte port_b=0x06 /*Asigna port_B con un objeto
en la direccion 6 de la memoria(puerto B).*/
///#byte port_a=0x05
#use fast_io(b)
#int_rb
void IntPortB4_7()
{
if (pin_b6==1) ///si el deposito esta vacio
{
output_bit(pin_a0,1);
}
if (pin_b7==0) ///si el deposito esta lleno
{
output_bit(pin_a0,0);
}
}
void main (void) ////funcion principal.
{
port_b_pullups(TRUE); ////Habilitadas resistencias pull-ups
SET_TRIS_B(0xFF); ////Declaro el puerto B como entrada.
SET_TRIS_A(0x00); ////Declaro el puerto A como salida.
///output_bit(pin_a0,0);
enable_interrupts(INT_RB); ////Hablilito la interrupcion externa.
enable_interrupts(GLOBAL);
sleep();
}
---------------------------------------------------------------------------------------------
Algo que me extraña es que al realizar la depuración en proteus, al ver el codigo C, las lineas de la funcion de interrupcion no tienen dirección asignada. No se si esto es indicativo de algo.
Espero vuestra ayuda.
-
Hola. Bienvenido al foro.
Varias cositas...en lugar de usar una condición if(pin==1) o if(pin==0) me parece que sería mejor que hagas if(input(pin)) o if(!input(pin))
Segundo: la interr por cambio de estado en RB0 tiene un flanco. Podes configurar la interr para que interrumpa en un cambio de flanco de bajo a alto o de alto a bajo. Asegurate que estés cambiando el estado del RB0 según la config que hayas elegido.
Tercero: Como no hay nada después del sleep() supongo que al producirse la interr y salir de la mísma, el programa probablemente ejecute todas las líneas de memoria flash, luego se resetee. Tal vez esto produzca comportamientos inadecuados. Pone un bucle después del sleep().
Saludos.
-
Ok, probaré todo lo que me dices. Lo que no entendí es lo del sleep.
Yo suponía que el micro permanece en sleep hasta que se produce una interrupción. En ese instante realiza la funcion int y vuelve al modo sleep, no???
si no es así que, cómo tendría que ponerlo???
Mil gracias de nuevo
-
Para hacer un bucle infinito y que el programa no termine existen varios métodos.
Mediante la instrucción for.
for (; ;)
{
sleep();
}
Mediante la instrucción while.
while (1)
{
sleep();
}
Mediante la instrucción do-while.
do
{
sleep();
} while(1);
Por cierto, en el post fijo de este subforo existen varios temas con multitud de ejemplos, entre los cuales podrás encontrar el de como tratar interrupciones del puerto B.
Suerte!!! ;)
-
ya solucioné el problema de las interrupciones. El fallo estaba en las condiciones if que no eran muy correctas, como ya me corrigió BrunoF. Gracias a ambos.
-
¿Eres de La Puebla?
-
Qué va!, soy de Sevilla capital.