1 votos

bucles con el compilador C18 en mplabide para 18f4550

Me encuentro con problemas al encender varios LEDs simultáneamente en un microcontrolador 18f4550 bajo el mismo "while(1)". Soy nuevo en la programación. [C18 compilador con Mplab ide.]

Pude alternar el parpadeo de los led RB0 y RB1 con un trozo de código encontrado en la web poniendo los pines RB en salida y luego haciéndolos altos.

#include<pic18f4550>
// Chip config and setting for make RB pins output 

void main(void) // Main block
   {

   While(1)
        {
          blink-RB-two-led-alternatively-forever(); // a function prototype for blinking RB0 and RB1 Alternatively. 

         } // loop forever 

   }

Eso funciona bien sin ningún problema. Puedo hacer lo mismo con los pines de PortD también, sin problemas.

Pero quiero que RD0 y RD1 parpadeen alternativamente , Simultáneamente con RB0-RB1.

Significa que cuando enciendo el pic18f4550 deseo que ambos RB0-RB1 y RD0-RD1 parpadeen alternativamente y simultáneamente.

He probado esto. Pero no funcionó.

void main(void) // Main block
   {

   While(1)
        {
          blink-RB-two-led-alternatively-forever(); // a function prototype for blinking RB0 and RB1 Alternatively. 

          blink2-RD-two-led-alternatively-forever(); // a function prototype for blinking RD0 and RD1 Alternatively. 

         }

   }

El bucle entra en " blink-RB-two-led-alternatively-forever(); " y sigue parpadeando los pines RB0 y RB1 y nunca llega al segundo prototipo de función.

Si cambio el Orden Entonces RD0 -RD1 comienza a parpadear alternativamente Pero nunca llega a PortB.

Por favor, sugiérame una solución. Cómo hacer que ambas cosas funcionen simultáneamente.

Muchas gracias de antemano.

1voto

George Netu Puntos 133

Parece que la función "blink-Rx-dos-led-alternativa-para-siempre();" en realidad se queda en el bucle para siempre.

No tenemos el código de esta subrutina, pero asumiría que el código llega a la primera función (la que coloques primero, como has descrito), entra en ella, y hace parpadear el LED para siempre, tal y como dice el nombre del prototipo.

Si quieres que ambos LEDs parpadeen, empieza por inicializar tus puertos B y D como salidas (el registro TRISx). Entonces, entra en el bucle while(1) [1], OR exclusivo de cada bit, y añade un retardo para establecer el tiempo o parpadeará tan rápido que sólo se verá tenue. Un retardo puede ser tan simple como configurar un bucle for con un número grande y decrementar hasta llegar a 0.

EDITAR: La operación OR exclusiva conmuta un bit (un 1 se convierte en un 0 y un 0 se convierte en un 1), así que, por ejemplo, para la variable uint8_t mi_luz, para conmutar el bit 0, se escribiría

mi_luz ^= 0b00000001;

o podrías escribir mi_luz = mi_luz ^ 0b00000001;

El "^" es el operación OR exclusiva .

Además, si vas a utilizar C, hazte con una copia de Kernighan y Ritchie no podría prescindir de él.

[1] un for(;;) para crear un bucle infinito es a menudo preferible a usar while(1)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X