¿Cuál es la manera correcta de alternar un bit único y un registro completo en la programación del microchip C?

0

Estoy tratando de escribir un código donde, cuando se presiona un botón, se alterna un PUERTO entero.

Entonces obtuve un botón en el PUERTO E en el pin 0, y 8 leds en el PORTD, también obtuve un indicador de depuración en el pin 1 del PUERTO E

void main() {

     // Interrupt flags, enable global and external interrupt
     INTCON = 0x90;
     TRISE.F0 = 1;
     TRISE.F1 = 0;
     TRISD= 0x00;

     do {
        if (PORTE.F0 == 1) {
           Delay_ms(100);
           if (PORTE.F0 == 1) {
              LATD ^= 1;
              Delay_ms(1000);
             }
          }
          PORTE.F1 ^= 1;
          Delay_ms(1000);
     } while(1);

}

El problema es que ninguna de las dos cosas sucede, al presionar un botón no se alterna el puerto D y el pin 1 en el PUERTO E no parpadea como debería.

En caso de que obtuviera un microcontrolador 18F4550 con un oscilador de 20 Mhz, codificando en C con el compilador mikroC IDE, dejé que el IDE configurara todos los bits de configuración. ¿En qué me he equivocado?

Prueba simple.

void main() { 
  TRISD=0; 
  LATD = 0xFF;
  while(1){
    LATD=~LATD;
    Delay_ms(1000)
  } 
}

esto hace que los leds parpadeen cada segundo.

Actualizar.

Cambié la declaración de alternancia de LATD a LATD ^= 0xFF; como sugiere una respuesta. Pero esto hizo que no funcionara. Así que estoy pensando que definitivamente el problema sobre las declaraciones de detección de pulsación de botón.

Así es como se establecen los bits de configuración:

    
pregunta diegoaguilar

1 respuesta

1

Veo muchos problemas con tu código que probablemente te causen dolor.

En primer lugar (no creo que este sea tu problema principal), habilitas las interrupciones pero no tienes ninguna función para detectarlas. Si se produjera una interrupción, es probable que su PIC se reinicie (comportamiento no definido).

En segundo lugar, cuando intentas alternar tu LATD, en realidad solo estás cambiando el bit más bajo. Cuando ingresas el literal 1, el compilador lo interpreta como 0x01. Si desea cambiar todo el byte, debería xor con 0xFF (255) en su lugar.

En tercer lugar, parece que no configura los bits de configuración en ningún lugar ni configura su oscilador. Sin configurar estos valores, es posible que tenga un chip que se ejecute a una velocidad muy baja y que su Retardo sea más largo de lo que espera (no ha proporcionado su definición de éter, por lo que no puedo confirmar o rechazar esta hipótesis).

EDITAR: Analicé esto más y creo que he encontrado tu problema principal. Si observa el pinout en la hoja de especificaciones de este PIC, encontrará que el pin RE0 comparte un pin físico con una entrada analógica. El estado predeterminado en los microcontroladores PIC es que la entrada analógica anule la entrada digital. Debe desactivar la entrada analógica a través del registro ADCON1 para poder obtener una entrada digital (consulte el código de prueba a continuación).

Como parece que has determinado que tu oscilador se está ejecutando, sugiero la siguiente prueba si puedes leer el botón correctamente:

void main(){
    TRISD=0;
    ADCON1 = 0x0F;
    LATD =0;
    while(1) LATD = (PORTE & 0x01) ? 0xff : 0x00;
}

Debería ver que sus LED siguen el nivel lógico de su interruptor.

    
respondido por el Mathieu L.

Lea otras preguntas en las etiquetas