Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
A ver si alguien que ya haya programado antes en los dspic y controle el tema de interrupciones en CCS me puede echar una mano.
Quiero ejecutar una interrupción cada vez que alguna de las entradas me varie (principalmente del puerto B ). Pero por más vueltas que le doy no consigo encontrar como hacerlo bien en CCS. Alguien me podría pasar algún ejemplo de como definir y activar una interrupción en CCS y para un dspic?
dragonet80, Sobre interrupciones en CCS se crean con el siguiente metodo
#INT_XXX
void funcion(){
Funciones a ejecutar con la interrupción;
}
en la ayuda veras lo que hay.
En galatea usamos interrupciones para los servos y para el mando a distancia.
la del mando a distancia es una interrupción externa por flanco de bajada.
#int_EXT
void cmando()
{
}
Y luego en el setup tenemos esto:
ext_int_edge(H_TO_L);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
Mi consejo... mira el data y la ayuda del ccs aunque... ¿para una dspic no es mejor usar el compilador de microchip?
Gracias BoOpS, te copio lo que tengo hecho:#int_cn1
void cn1_isr() {
SI1 = input(PIN_B0);
SI2 = input(PIN_B1);
cambio = 1;
}
void main(void) {
inicia_robot();
enable_interrupts(INT_CN1);
do {
while(!cambio);
if(SI1) {
output_high(pwm_motor_der);
}
else {
output_low(pwm_motor_der);
}
cambio = 0;
} while(1);
}
El "enable_interrupts(GLOBAL)" había leído que para los dspic no era necesario, por eso no lo ponía.
Hay que activar la interrupción del TIMER0 para usar la función on change ?
La verdad es que la ayuda del CCS me parece bastante penosa. Incluso hay cosas incorrectas.
El tema del flanco "ext_int_edge(H_TO_L);" la verdad es que me da igual si se activa por falnco de bajada o de subida. Lo que quiero es que me detecte cuando hay un cambio en alguna de las entradas. Sabes si por defecto me coge todas las entradas con "on change" o no me coge ninguna sino se lo especifico de alguna manera?
Porque uso CCS, porque me he acostumbrado a usarlo para el 16F. Para los 16F me resultaba mucho más sencillo que no en el de MPLAB. Para los dspic vale la pena pasarse al MPLAB?
No te digo del MPLAB, creo que es C18 o C30... mirate la web de microchip...
Por otra parte lo del flanco creo que hay una opción que es en cualquiera.
Lo del timer0 he copiado directamente de mi código así que se ha colado :$ perdona.
¿y la interrupción no funciona así?
Sí, ya se que te refieres al C30, pero siempre me ha parecido más complicado que el CCS.
Que va, no salta nunca del bucle while. Yo creo que falta algo por definir, pero no se lo que será. Tampoco estoy muy seguro de que la INT_CN1 sea la "input on change" pero diría que sí.
Con el CCS siempre parece que sale algún problema de estos raros, que no le pillas de donde puede venir. Quizá tengas razón y con el C30 se tiene mucho más control sobre el micro. No se, esperaré un poco a ver si solucionamos esto con el CCS antes de plantearme el cambio.