TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Pchuqui_1 en 11 de Septiembre de 2012, 15:36:25
-
Hola a todos. Tengo un problema con la interrupción externa por RB0. Lo que quiero realizar es que cuando se termine de ejecutar la interrupción por RB0 la misma sea deshabilitada, y luego habilitarla cuando yo lo desea. Lo que hice fue poner al final de la rutina de la interrupcion la instrución para desabilitarla, pero funciona muy mal.. la pila de desborda y no entiendo por que.. no puedo descubrir por que hace eso...
#include <16f882.h>
#device adc=10
#fuses xt,MCLR,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)
#use STANDARD_IO(B)
int16 TFB; // Tiempo flanco de bajada
float AP,AP1; // Valor final del ancho de pulso
int nuevopulso=0; // Entra otro pulso
int cambio=0; // Cambio de flanco de disparo
#define _FLEX_LCD
#define LCD_DB4 PIN_C0
#define LCD_DB5 PIN_C1
#define LCD_DB6 PIN_C2
#define LCD_DB7 PIN_C3
#define LCD_RS PIN_C4
#define LCD_RW PIN_C5
#define LCD_E PIN_C6
#include "flex_lcd.c"
#int_ext
void funcion_ext_int(){ //Función Interrupción
if(cambio==0){ // Flanco de Subida
set_timer1(0); //Inicializa TMR1
// ext_int_edge(0,H_TO_L); // Configurar para flanco bajada
cambio=1; // Control de cambio de flanco
} else { // Flanco de Bajada
TFB=get_timer1(); //Valor del Timer1 para el Flanco de bajada
ext_int_edge(0,L_TO_H); //Configurar para flanco subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //Pulso a calcular
disable_interrupts(int_ext);
}
}
}
void main() {
lcd_init();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Configuración TIMER1
ext_int_edge(0,L_TO_H); // Configurar para flanco subida
cambio = 0; // Control de cambio de flanco
enable_interrupts(int_ext); //Habilitación interrupción RB0
enable_interrupts(global); //Habilitación general
do {
if(nuevopulso==1){ // ¿Pulso nuevo?
AP = (TFB*0.000001); // Ancho de pulso en microsegundos de Timer1…
// a 4MHZ el T=1us*Timer1
AP1= 1/AP;
printf(lcd_putc,"\f%4.0f ", AP1); //Visualiza medida en LCD
nuevopulso=0; //Pulso medido
ext_int_edge(0,L_TO_H);
enable_interrupts(int_ext);
}
-
Así estaría bien :undecided: revisaste el ASM que te genera como para determinar porque se desborda la pila?
-
Ok. Yo pensé que no se podía deshabilitar una interrupción dentro de la misma rutina. El tema es que la interrupción se ejecuta muy rápido... y necesito que se corra todo el programa al menos una ves antes de la próxima interrupción. Voy a seguir buscando y no revise el ASM... lo simulo con el proteus y no funciona, en la proto menos.. jaa
-
Deshabilitar la interrupción dentro de la misma no es un problema, el algoritmo puede estar errado. Que intentas hacer?
-
Esa interrupción me controla la salida de un sensor inductivo. Es para hacer un tacometro para mi moto, hace tiempo que lo quiero hacer. Entonces con la interrupción externa detecto dos flancos de subida, así determino el periodo. Cuando está a altas revoluciones, el periodo es de ponele 20 uS. Entonces si no deshabilito la interrupción, no me da el tiempo para correr el resto del programa y se arma quilombo... No se si me explico?
Pdta: Ahora que tengo tiempo estoy a full.. jaa :D También estoy modificando la libreria del teclado 4x4 y tengo algunas dudas que no puede encontrar en mis libros ni en la red... :oops: :oops: :oops: Que significa esta sentencia?? kbd=~COL3&ALL_PINS; yo se que & es una "and" pero "=~" y esta... "&~". Y esto #define ROW0 (1 << 7)??? Donde aprendo C avanzado..... jaaaaa :5] :5]
-
Para estudiar sobre el tema:
Busca:
operadores a nivel de bits
~ operador complemento
& operador and
También precedencia de operadores. Por esto =&
Y directivas de preprocesador por lo de #define
Como libro de consulta el libro El-lenguaje-de-programación-c-
de kernighan & Ritchie
En el tutorial de suky hay ejemplos.
Saludos.
Jukinch
-
Respecto al tacometro, si quieres contar pulsos podes hacerlo con el CCP, para eso la interrupción externa no sirve.
Saludos!
-
Gracias suky. Lo voy a probar!!! ((:-))