TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: SJD2 en 01 de Marzo de 2006, 11:35:00
-
hola, soy nuevo en esto del pic. estoy haciendo un programa usando la interrupcion interna en RB4, con el 16f877. no se que pasa en el programa, seguramente habre puesto alguna burrada. el programa consiste en dar a rb4 y que suene un buz piezoeléctrico y al volver a darle se apague, asi indefinidamente.
haber si alguien puede ayudarme:
gracias
//
// Dispositivo: PIC 16F877 Compilador: CCS vs3.236
// Entorno IDE: MPLAB IDE v7.3 Simulador: Proteus 6.7sp3
//
#include <16f877.h> //pic a utilizar
#fuses XT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(c)
#use fast_io(b)
#byte port_b=0x06 //declaracion del puerto b
int last_b;
byte changes;
///DECLARACION DE FUNCIONES GLOBALES
void buzzer(void); //funcion que hace sonar el buz del portc dada la interrupcion
///PROGRAMA
void main(void)
{
set_tris_b (0b111110111); //portb entrada menos pin B0 es salida
set_tris_c (0b00000100);
enable_interrupts(int_rb); //activar interrupcion rb4:7
enable_interrupts(GLOBAL); //activar interrupciones
//variable que almacena que pin a realizado la interrupcion
last_b=port_b;
do{
changes = last_b ^ port_b; //changes<-pin que genera la interrupcion
last_b = port_b; //last_b=como estaba el portb antes de interrupcion
if (bit_test(changes,4 )) //¿PIN_B4 genera interrupcion?
buzzer(); //SI -> ejecuta va a la interrupción
else
output_low(pin_c2); //No,
}while(TRUE); //bucle infinito
}
///FUNCION QUE EJECUTA LA SECUENCIA DE ZUMBIDO DEBIDO A INTERRUPCION POR EL PORTB4:7
#INT_RB
void buzzer(void)
{
do{
output_high(PIN_C2);
delay_ms(1);
output_low(PIN_C2);
if (bit_test(changes,4 )) //¿PIN_B4 genera interrupcion?
break;
}while(true);
}
massiah desde cantabria
-
El Seteo del Tris del puerto B, está mal, has puesto 9 dígitos y debieras poner solo 8.
ME podrias explicar que es lo que hace esta funcion?
changes = last_b ^ port_b;
Otra cuestión, aparentemente usas esta instrucción enable_interrupts(int_rb); para habilitar la interrupción
Si esto es asi, tu rutina irá al vector de interrupciones y en tu código no lo veo en nigun lado.
Además te digo, dada la simplicidad de lo que quieres hacer, no te hace falta habilitar ninguna interrupción.
-
gracias, ya lo he solucionado el codido de las_b sobra. lo estba haciendo bastante mal porque me sobraban bastantes cosas elk código era el siguiente:
//
// Dispositivo: PIC 16F877 Compilador: CCS vs3.236
// Entorno IDE: MPLAB IDE v7.22 Simulador: Proteus 6.7sp3
//
#include <16f877.h> //pic a utilizar
#fuses XT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(c)
#use fast_io(b)
#byte port_b=0x06 //declaracion del puerto b
int a = 0;
///DECLARACION DE FUNCIONES GLOBALES
void buzzer(void); //funcion que hace sonar el buz del portc dada la interrupcion
///PROGRAMA
void main(void)
{
set_tris_b (0b11110111); //portb entrada menos pin B0 es salida
set_tris_c (0b00000100);
enable_interrupts(int_rb); //activar interrupcion rb4:7
enable_interrupts(GLOBAL); //activar interrupciones
//variable que almacena que pin a realizado la interrupcion
do{
if (a)
{ output_high (PIN_C2);
delay_ms (1);
output_low (PIN_C2);
}
}while(TRUE); //bucle infinito
}
///FUNCION QUE EJECUTA LA SECUENCIA DE ZUMBIDO DEBIDO A INTERRUPCION POR EL PORTB4:7
#INT_RB
void buzzer(void)
{
if (bit_test(port_b,4 )) //¿PIN_B4 genera interrupcion?
{ if (!a)
{
a = 1; }
else
{
a = 0; }
}
}
-
Me alegro que hayas solucionado tu problema.
Saludos 