Cambio de bit y valor de PUERTO en PIC18F4520

0

Estoy trabajando en un PIC18f4520. Para hacer mi prueba, he conectado un led a la foto. Los siguientes elementos son los pasos que me gustaría hacer:

  • Guarde el valor del puerto establecido para el LED (que parpadea de acuerdo con la subrutina ISR que escribí, y puede verse en este caso como una señal de reloj). Por esto lo hice:

    unsigned char portValue;   // initialization
    TRISBbits.TRISB5 = 0;      // LED on RB5 set as output
    
    portValue = PORTBbits.RB5; // operation in the main while loop  
    
  • Izquierda desplaza los bits de portValue en uno, pero con la inserción del valor RB5 . Para ilustrar:

    --> if RB5 = 1, I would have portValue = 0b0000 0001 
    --> at t+1, RB5 = 0 then portValue = 0b0000 0010
    --> at t+2, RB5 = 1 then portValue = 0b0000 0101
    --> and so on (RB5 taking 1 or 0 and no other value)
    

Con lo que he escrito hasta ahora solo puedo hacer un desplazamiento a la izquierda. Pero no puedo encontrar una manera de "agregar" el RB5 ...

Hace algo como

portValue = portValue<<(&PORTBbits.RB5); 

podría funcionar? Las operaciones de cambio de bits son bastante nuevas para mí, por lo que mis preguntas pueden ser extrañas.

De todos modos, gracias de antemano!

    
pregunta Daymov

2 respuestas

0

Bitshifting funciona así:

result = value << amount

esto desplaza los bits de la variable valor por cantidad de bits a la izquierda. Utilice > > para desplazar a la derecha.

Entonces, antes de almacenar tu nuevo bit, debes cambiar portValue en un bit, así:

portValue = portValue << 1;

Ahora, el primer bit será 0 de manera predeterminada y puedes guardar tu nuevo bit allí de esta manera:

portValue = portValue | PORTBbits.RB5;

Esto supone que la variable PORTBbits.RB5 solo tendrá los valores 0 o 1, por lo que todos los bits, excepto el bit 0, siempre son 0. Para asegurarse de esto, puede enmascarar PORTBbits.RB5 con 0x01 así:

portValue = portValue | (PORTBbits.RB5 & 0x01);

Esto asegurará que solo se cambiará el primer bit.

Esto ahora se puede combinar en una línea si lo desea:

portValue = (portValue << 1 ) | (PORTBbits.RB5 & 0x01);
    
respondido por el Warloxx
0
portValue <<= 1; //left shift every time round
portValue |= (PORTBbits.RB5) ? 1 : 0; //set LSB of portValue if RB5 is true
    
respondido por el Martin

Lea otras preguntas en las etiquetas