interrupcion RB4-RB7

Cualquier cosa relacionado con la programación de Microcontroladores PIC en C utilizando el compilador CCS.

interrupcion RB4-RB7

Notapor kar105s » Dom Jul 18, 2010 9:43 pm

Hola, les consulto sobre un problema que tengo con las interrupiones rb4-rb7 , me sucede que la interrupción se ejecuta una sola vez.
He seguido el programa con el Watch de mplab y encuentro que cuando se ejecuta la instrucción de lectura escritura del puerto
" output_b(input_b());" el trisb que estaba configurado como entrada del pulsador se coloca a 0 y así regresa de la interrupción y no vuelve a responder al pulsador.
Lo resolví con una instrucción dentro de la propia rutina de interrupción que repone el tris " trisb,6=1;"
Pero desearía saber porque sucede esto y como resolverlo.
Desde ya muchas gracias .Saludos
kar105s
 
Mensajes: 4
Registrado: Jue Dic 31, 2009 1:22 pm

Re: interrupcion RB4-RB7

Notapor biblioman » Lun Jul 19, 2010 7:54 am

Hola kar105s. Por defecto los pines del puerto B están configurados como entrada, no se muy bien que quieres hacer con la instrucción output_b(input_b()); pero se ve bastante rara. Para poder ayudarte, lo mejor es que incluyas el código completo de tú ejemplo.

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: interrupcion RB4-RB7

Notapor kar105s » Lun Jul 19, 2010 2:53 pm

Hola Biblioman ,en el tutorial Recursos del PIC- Uso de la Interrupción por cambio de estado en RB4-RB7 , se describe la nota donde indica que hay que hacer una lectura/escritura del puertoB.
La instruccion "output_b(input_b());" no hace nada, la intención es que solo lee y escribe el puerto B con el mismo valor. en teoria no debiera alterar nada.
De todas formas encontré el error : me olvidé la directiva de configuración de puerto #use fast_io(b) (Nota: con standar_io() no funciona)
Te comento que suprimí esa instrucción (output_b(input_b()) por que mi código incluía una lectura del puerto y tambián funciona correcto.
Muchas gracias por tu respuesta.
De todas formas agrego el código ya que esa instrucción la copie de otros programas que encontre y puede que alguien tenga el mismo problema.

/*Incrementa contador en cada interrupción por pulsador en RB6.
*/
#include <16f84a.h> // Selecciona el PIC
#fuses XT,NOWDT,NOPROTECT,PUT // Opciones de configuración
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#include <lcd_Entrenador1.h> //lib lcd: E:RA2, RS:RA0, RB1-RB4
#use fast_io(b)
#use fast_io(a)
#bit TRISB6=0x86.6
#bit rbpu = 0x81.7
#byte portb =0x06

// variables globales
int cont=0;

#int_RB // Interrupción por activación
void RB_isr(void) { // externa RB4-RB7
// output_b(input_b()); no hace falta si el cádigo incluye lectura de puerto

if(bit_test(portb,6)==0){ // LECTURA DEL PUERTO B
cont++;
lcd_putc("\f");
printf(lcd_putc,"%d",cont);
}
}//fin isr

// función principal
void main(void) {
// varialble locales
rbpu=0; //habilito pullup
output_b(0); //limpio el puertoB
lcd_init();
printf(lcd_putc,"%d",cont); //muestra el valor 0

TRISB6=1; //configuro pin 6 del puerto B como entrada

//configuración de puertos
enable_interrupts(INT_RB);
enable_interrupts(global);

// Programa Principal

while(true); //bucle infinito

}//fin main
kar105s
 
Mensajes: 4
Registrado: Jue Dic 31, 2009 1:22 pm


Volver a Programación PIC en C con CCS

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron