La salida 12F683 no se comporta como se esperaba

Tengo un micro 12F683 y este es mi primer programa usando el nuevo compilador MPLAB con XC8.

He configurado Timer1 para que se active cada ms. Por ahora, necesitaría que un LED se encienda y se apague, pero debo hacer esto con una IFdeclaración porque luego agregaré otras acciones allí. Aquí está el código de interrupción:

#define PWM GPIObits.GP5

void interrupt High_Priority_Interrupt(void) {
  if (CCP1IF) {
      if (PWM) {
          PWM = 0; //NEVER excuted
      }
      else {
          PWM = 1; //ALWAYS executed
      }
      CCP1IF = 0;
  }
}

Por alguna razón, la salida nunca se establece en 1. Si reemplazo todo el código, PWM^=1;funciona de maravilla. Pero necesito hacerlo con la ifdeclaración. ¿Qué estoy haciendo mal?

¿ Cómo se declara exactamente PWM?
En este punto, el enfoque más directo sería mirar el código que el compilador está generando para esta función.
Al menos debería mostrar un ejemplo mínimamente compilable del problema. La configuración de PWM, la configuración del temporizador, la configuración de GPIO y la configuración de interrupciones están TODAS involucradas, no solo el pequeño fragmento que muestra aquí.
Secundo lo que sugiere Dave. Abra el archivo lst y eche un vistazo. Si PWM nunca se establece en 1, quizás CCP1IFnunca sea cierto. Además, dado que las interrupciones no son deterministas, debe (al menos en mi experiencia con AVR) declarar cualquier variable que se volatileuse en el ISR o el compilador la optimizará para que sea de solo lectura, ya que nunca cambia en el flujo regular del programa y su rutina de interrupción nunca es llamada por software.

Respuestas (1)

Este es un problema con los registros de entrada/salida en los núcleos de línea de base y de rango medio. Tanto los registros de entrada como de salida de los puertos se leen del búfer de entrada y si configuró el pin como entrada o salida analógica, la entrada digital se desconecta y no puede leer el registro del puerto de salida. En su caso, el pin está configurado como salida y cada vez que intenta leerlo para verificar su valor, obtiene cero (del búfer de entrada).

Para resolver esto, configure el pin como entrada y agregue el botón para controlar la señal de entrada y cambie el LED en otro pin o cambie PWM a variable y funcionará.

Además, en el mismo documento hay otro problema con respecto a los puertos IO y las instrucciones de lectura, modificación y escritura respondidas aquí

Puede leer más aquí (Página 2, INSTRUCCIONES DE LECTURA-MODIFICACIÓN-ESCRITURA EN LOS REGISTROS DE PUERTO)