12F683 la salida no se comporta como se esperaba

2

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

He configurado el temporizador1 para que se dispare aproximadamente cada ms. Por ahora necesitaría un LED para encender y apagar, pero debo hacer esto con una declaración IF 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 el código completo con PWM^=1; , funciona como un encanto. Pero necesito hacerlo con la declaración if . ¿Qué estoy haciendo mal?

    
pregunta sharkyenergy

1 respuesta

1

Este es un problema con los registros de entrada / salida en los núcleos de línea de base y de rango medio. Los registros de entrada y salida de los puertos se leen desde el 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 se configura 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 encienda el LED en otro pin o cambie PWM a variable y funcionará.

Además, en el mismo documento hay otro problema relacionado con los puertos IO y la instrucción de lectura-modificación-escritura respondida aquí

Puede leer más aquí (Página 2, READ-MODIFY-WRITE INSTRUCTIONS EN EL PUERTO REGISTROS)

    
respondido por el elent

Lea otras preguntas en las etiquetas