MSB y LSB ¿Cómo debería modificar el código?

#1
Hola, amigos.

¿Alguien me podría ayudar y decir cómo debería modificar este código para enviar los datos como MSB o como LSB :unsure: ?

En la forma actual el dato 0x880A se me modifica y obtengo 0x8A80, pero no logro ni MSB ni LSB

PHP:
while(1)
    {
          data = 0x880A;
        
          for (uint8_t i = 16; i > 0; i--)
  {
               Pixel_PORT&=(~(1<<Pixel_SCK));            // SCK low
               if (data & 1) Pixel_PORT |= (1<<Pixel_DOUT);    // Data High
               else Pixel_PORT &= ~(1<<Pixel_DOUT);        // Data Low
               Pixel_PORT|=(1<<Pixel_SCK);            // SCK high
               data >>= 1;                    // shift
          }
    }
Muchas gracias.
 
Última edición:
#2
no entendì que quieres hacer exactamente

0x880A hacer separar 88 y 0A si girarlos A0 88
o moverlos de lugar 8A 80

explica mejor con otras variables como 0x12AF ninguna se repite y asi hace mas didactica la explicacion

usa mascaras logicas para hacer la separacion eso te puedo decir pues no te entendi mucho
 
#3
Hola TRILO-BYTE

Perdónsi no fui claro con mi explicación.
Lo que quiero hacer es enviar 16 bits de manera serial, acompañado de una señal de clock. Una salida del micro envía datos y otra salida la señal de clock. Es para usarlo como SPI pero por software, y quiero poder elegir si lo hago en el orden MSB o LSB. ¿Se entiende, espero que si o lo repito de otro modo?

Gracias por tu ayuda.
 
#4
Hace tiempo realicé algo similar para controlar un CI 74HC595, pero a 8 bits y con PIC C Compiler de CCS.

Modifiqué el proyecto a 16 bits para mostrarlo como ejemplo y tal vez sea lo que quieres realizar.
También le agregué a la rutina la posibilidad de seleccionar enviar MSB o LSB primero.

Si el ejemplo es como lo que quieres hacer, entonces podrás adaptarlo a tu entorno, o darte una idea.

Suerte.
 

Adjuntos

#5
claro que es posible enviar 8,16 ,24,32 ,64 ,etc.
lo que tambien es posible enviar hasta PWM en los 74hc595 claro todo es por software

lo que debes hacer es lo siguiente

hacer una funcion que envie 8 bits al registro de corrimiento

void _74hc595 (char dato)
{
//algoritmo
return dato;
}


y lo que hay que hacer despues es enviar 8 bits y despues los otros 8 bits todo eso jugando con el latch o el enable

ejemplo

char puerto1
char puerto2

puerto1=0xFF ;
puerto2=0xCE ;
//habilitamos el 595
LATCH=0;

_74HC595(puerto2);
_74HC595(puerto1);

LATCH=1;
//deshabilitamos el 595


y asi envie solo 8 bits 2 veces la idea es solo enviar 8 bits y si lo enviamos nuevamente el dato es empujado al otro registro

es decir podemos enviar las vecces que quieras un dato solo usando un char

el algoritmo lo tienes que pensar TU ;)
 
#6
D@rkbytes muchas gracias, con el ejemplo que me enviaste pude resolver mi problema.

Me faltaba usar el dato correcto en donde tu pones 0x8000 y 0x01 según el modo elegido, además de considerar la orientación del desplazamiento << o >>

Luego retoque un poco un par de lineas para emprolijar mi código pero sigo manteniendo el que puse al comienzo de mi consulta y funciona bien.

Muchas gracias
 
Arriba