fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

interrupcion "ON CH...
 
Avisos
Vaciar todo

interrupcion "ON CHANGE" en los dspic en CCS

5 Respuestas
2 Usuarios
0 Reactions
1,792 Visitas
dragonet80
Respuestas: 1328
Topic starter
(@dragonet80)
Ardero
Registrado: hace 17 años

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?

Responder
4 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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?

Responder
dragonet80
Respuestas: 1328
Topic starter
(@dragonet80)
Ardero
Registrado: hace 17 años

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?

Responder
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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í?

Responder
dragonet80
Respuestas: 1328
Topic starter
(@dragonet80)
Ardero
Registrado: hace 17 años

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.

Responder
Compartir: