TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Algec en 18 de Julio de 2011, 13:21:32
-
A ver si podeis echarme una mano, no se porque no me funciona una seleccion con dos entradas A5 y A4
Os subo el programa y el ISIS
Mil gracias
#include <16F628.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,MCLR,NOPROTECT,BROWNOUT,NOLVP
static int16 timer_count=0; // timer1 sobrecarga del contador
byte valor; //valor de seleccion de los dos pines, va del 0 al 3, es decir 4 posibilidades
#INT_EXT
void ext_isr()
{
timer_count=0; //resetea el contador del timer1
}
#int_timer1 //Esta funcion es llamada cada vez que
void timer_isr() { //timer1 sobrepasa (2^16).
timer_count++;
}
void main() {
setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 ); //inicializa timer1
enable_interrupts(INT_TIMER1); //activa la interrupcion de timer1
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
ext_int_edge(H_TO_L); //inicializa la interrupcion por cambio de estado de B0, Activa a nivel bajo
enable_interrupts(INT_EXT); //activa la interrupcion externa de B0
enable_interrupts(GLOBAL);
#use fast_io (A)
#use fast_io (B)
loop:
{
valor =(input(PIN_A4))+(input(PIN_A5)*2);
switch(valor)
{
case 0:
{
output_high(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
break;
case 1:
{
{
output_high(PIN_B1);
output_low(PIN_B0);
output_low(PIN_B2);
output_low(PIN_B3);
}
}
break;
case 2:
{
output_high(PIN_B2);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B3);
}
break;
case 3:
{
{
output_high(PIN_B3);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
}
break;
}
}
}
goto loop; //bucle de vuelta, espera a que se requiera una interrupcion
}
-
Hola Algec.
Casi seguro tu problema es debido a que con los fuses estás activando la función MCLR y justamente dicha función utiliza el PIN RA5, así que no vas a poder usar dicho pin como I/O. O deshabilitas MCLR o utilizas otro pin para tu programa.
-
Pues si, seguro, no me habia dado cuenta.
Para que es el MCLR?, no tengo ni idea, pero es que la base la cogi de un programa hecho ya.
-
Son las siglas de MasterClear y es para poder resetear al micro externamente. En el datasheet vas a poder encontrar buena información.
-
Pues deberia ser eso, pero no, no funciona al menos en la simulacion. TE subo un pequeño ISis mas simple y claro para testearlo, con 4 leds que sacan salida en funcion de el valor que toman los dos pines A4 Y A5
-
Si utilizas fast_io deberías definir la configuración I/O de los puertos. Caso contrario seguramente no se configurarán como lo necesitás, Probá eliminando primero las líneas de fast_io y, si funciona y lo deseas, luego agregalas junto a la configuración que te mencioné recién.
Saludos.
-
subiste el archivo de proteus, pero te falto el .hex o el .cof para poder probarlo
-
A ver ahora
-
cambia tus fuses; ponle:
#fuses HS,NOWDT,NOMCLR,NOPROTECT,BROWNOUT,NOLVP
y tambien quitale la interrupcion por pin b0, ya que lo estas usadno para prender un led, no como entrada
-
Efectivamente ahora si, Pense que solo tenia que quitar el MCLR , no sabia que habia que poner El NOMCLR.
Lo de la interrupcion es que quedo del programa origen,
Mil gracias de nuevo