Usando el compilador C18 en Mac OS X

1

Actualmente estoy en una clase de microcontroladores, en la que usamos el PIC18F4550 y debo usar el compilador C18 (algo orientado a Windows y usado para calificar). Estoy tratando de instalar esto en Mac OS X, y estoy teniendo dificultades.

No puedo encontrar un compilador C18 válido que funcione en Mac OS X. En cambio, encuentro un compilador XC8, que Microchip dice que es un reemplazo completo. Pero, cuando intento compilar el código a continuación, me da un error, y este código se usa ampliamente en mi clase.

#pragma interrupt low_isr       // both lines generate errors
_asm goto low_isr _endasm

Sí, he encontrado un compilador C18, pero es Sólo para Windows. A pesar de lo duro que busco, solo puedo encontrar el compilador XC8. Foros en línea indican que el compilador C18 para Mac OSX se ha desconectado.

    
pregunta Scott

2 respuestas

2

En el nuevo compilador XC8, puede definir una rutina de interrupción de baja prioridad como esta:

void interrupt low_priority ISR (void)
{
 ...
}

Más información: Guía del usuario del compilador MPLAB® XC8 C

    
respondido por el m.Alin
1

Ohhhh C18 ... ¡Cómo te amo! Aunque tampoco tengo quejas en xc8.

Es difícil encontrar una forma sencilla de instalar el compilador C18 en OSX, pero PUEDE hacerlo. Acabo de instalarlo en una máquina con Windows y transfirí los archivos a mi mac: P Sí, es una opción de mala calidad, ¡pero funcionó!

Bien, entonces sobre tu problema de interrupción. No tenemos sus mensajes de error, pero al mirar su código, creo que veo lo que está mal. Parece que te faltan algunas cosas, pero estoy haciendo suposiciones aquí.

Cuando desee agregar una interrupción a su foto, debe recordar que hay dos tipos de interrupciones: prioridad baja y prioridad alta. Depende de usted decidir a dónde pertenecen sus interrupciones periféricas (como los pines IO externos). Estoy seguro de que ya lo sabe, a juzgar por el hecho de que está utilizando una interrupción de baja prioridad. Solo quería reiterarlo.

Ahora, para el pic18f4550, el vector de baja prioridad se encuentra en la dirección 0x18 en la memoria. Por lo tanto, debe escribir una línea pragma que tenga este aspecto:

#pragma code low_vector=0x18

Ahora, necesita definir un prototipo de función que maneje sus solicitudes de interrupción. Llamémoslo "low_int_fcn ()"

void low_int_fcn();

A continuación, incluimos las instrucciones de ensamblaje que apuntan a la función de interrupción que realizó en el paso anterior:

void low_interrupt(){
  _asm GOTO low_int_fcn _endasm
}

Luego escribimos

#pragma code
#pragma interruptlow low_int_fcn

Finalmente, en su función de interrupción, escriba el código que debe ejecutarse cuando se active la interrupción. Por ejemplo:

void low_int_fcn(){
  if(INTCON3bits.INT2IF == 1){
     //do stuff
     INTCON3bits.INT2IF = 0;  // Clear the interrupt flag
  }
}

Recuerde habilitar las interrupciones en su configuración, es decir:

#pragma config IESO=ON

y deberías ser bueno para ir! Sé que esta fue una respuesta larga y probablemente ya sabías un montón de lo que dije, pero tuve muchos problemas con esto en el pasado y quería asegurarme de que al menos tuvieras un buen conocimiento de ello. p>

Por cierto, si aún no lo sabe, en MPLabX, vaya a Ayuda > Contenido de ayuda y podrá encontrar una gran cantidad de documentación sobre compiladores C18 / xc8 ... ¡e incluso ejemplos! Puede encontrar un ejemplo de interrupción en Herramientas del idioma > C18 Toolchain > MPLab C Compiler para PIC18 > Características del idioma > Pragmas > #pragma interruptlow.

¡Vale la pena leer la documentación! Espero que esto haya ayudado!

    
respondido por el superkittens

Lea otras preguntas en las etiquetas