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 IF
declaració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 if
declaración. ¿Qué estoy haciendo mal?
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)
david tweed
PWM
?david tweed
scott seidman
sherrellbc
CCP1IF
nunca sea cierto. Además, dado que las interrupciones no son deterministas, debe (al menos en mi experiencia con AVR) declarar cualquier variable que sevolatile
use 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.