34 votos

¿Qué es el golpeo de bits?

Soy nuevo en la programación de microcontroladores. Estoy usando el controlador ATmega32-A y el compilador CodeVisionAVR. Estoy utilizando el generador de forma de onda (AD9833) para generar una señal de onda sinusoidal utilizando la comunicación SPI. Soy capaz de generar la onda sinusoidal con éxito. Ahora estoy pasando esa señal al sensor. La salida del sensor se selecciona a través del multiplexor y se envía al ADC. Ahora quiero leer los valores del ADC utilizando la comunicación SPI. He intentado mucho para configurar los registros de ADC. Todavía no está funcionando. Para ver el código de comunicación SPI echa un vistazo a mi post anterior Configuración de los registros del ADC mediante comunicación spi . Estoy utilizando la comunicación USART(RS232) para imprimir los valores en el PC(PuTTY).

Alguien me aconsejó que usara el golpe de mordida. Soy nuevo en ese concepto. ¿Puede alguien proporcionarme un código de ejemplo de golpeo de bits de la comunicación SPI. ¿Cómo iniciar ese procedimiento? ¿Puede alguien proporcionarme un buen material? ¿Necesito algún hardware externo?

He escrito esto, incluyendo las conexiones de las clavijas:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}

28voto

lillq Puntos 4161

El golpeo de bits consiste en crear toda la serie de pulsos en el software, en lugar de depender de una pieza de hardware dentro del microcontrolador.

Muchos microcontroladores tienen un hardware SPI, y entonces todo lo que tienes que hacer es escribir un byte en el registro de salida, y el controlador SPI desplazará los datos hacia fuera, y al mismo tiempo recibirá datos del esclavo. Puedes obtener una interrupción cuando la transferencia esté completa, y luego leer los datos recibidos.

Pero algunos microcontroladores no tienen el hardware SPI a bordo y entonces tienes que simularlo haciendo todo manualmente. SPI tiene un número de modos diferentes, usaré este diagrama de pulsos como ejemplo:

enter image description here

Así, mientras que un controlador SPI dedicado se encarga de todos los pulsos, el cambio de datos y la sincronización, cuando se hace un intercambio de bits hay que realizar todas las acciones uno mismo:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

Cambiar los bits de SPI es relativamente sencillo, el código para cambiar los bits de I2C, por ejemplo, será más complejo, y necesitarás un temporizador de alguna manera si quieres cambiar los bits del protocolo UART.

10voto

Alex Andronov Puntos 178

El bit-banging se refiere al concepto de que las señales que salen o entran en un dispositivo sean generadas/muestreadas por software en lugar de por hardware. Evidentemente, se necesita algo de hardware, pero cuando se utiliza el bit-banging, el único hardware para cada salida es un latch que puede ser explícitamente activado o desactivado por el software, y el único hardware para cada entrada es una interfaz para permitir que el software compruebe si es alto o bajo (y normalmente ejecutar una rama condicional para un estado pero no para el otro).

La velocidad máxima que puede alcanzarse con el bit-banging será, por lo general, una fracción de lo que podría lograrse con hardware de propósito general, pero fuera de las limitaciones impuestas por la velocidad del procesador, el bit-banging es mucho más versátil, y puede utilizarse en circunstancias en las que el hardware de propósito general no es del todo adecuado y el hardware de propósito especial no sería rentable.

Por ejemplo, muchos controladores tienen un puerto "estilo SPI" que se comporta esencialmente de la siguiente manera: cuando se escribe un byte en un determinado registro, el hardware generará un cierto número de pulsos de reloj (normalmente ocho), sincronizando un bit de datos en el flanco de subida de cada pulso de reloj y muestreando un bit de datos entrante en el flanco de bajada. Generalmente, los puertos de estilo SPI de los controladores permitirán configurar una variedad de características, pero en algunos casos puede ser necesario interconectar un procesador con un dispositivo que haga algo inusual. Un dispositivo puede requerir que los bits de datos sean procesados en múltiplos diferentes a ocho, o puede requerir que los datos sean tanto de salida como de muestreo en el mismo flanco de reloj, o puede tener algún otro requisito inusual. Si el hardware concreto del controlador que se utiliza puede soportar los requisitos precisos, estupendo (algunos proporcionan números de bits configurables, tiempos de transmisión y recepción configurables por separado, etc.) Si no, puede ser útil el golpeo de bits. Dependiendo del controlador, el bit-banging de una interfaz SPI tardará entre 2 y 10 veces más que dejar que el hardware se encargue de ello, pero si los requisitos no se ajustan al hardware que uno tiene, intercambiar datos más lentamente puede ser mejor que no poder hacerlo en absoluto.

Una cosa importante que hay que tener en cuenta con los diseños de golpeo de bits es que son más simples y robustos en circunstancias en las que los dispositivos con los que se comunican están esperando que el controlador de golpeo de bits genere toda su temporización, o en las que el controlador podrá esperar, sin distracción, a que llegue un evento, y en las que podrá hacer todo lo que necesita hacer con ese evento antes de que llegue cualquier otro evento sobre el que tenga que actuar. Son mucho menos robustos en circunstancias en las que un dispositivo tendrá que ser capaz de reaccionar a estímulos externos en un plazo relativamente corto, pero no puede destinar el 100% de su energía a vigilar dichos estímulos.

Por ejemplo, supongamos que se desea que un procesador transmita datos en serie al estilo UART a una velocidad muy alta en relación con su velocidad de reloj (por ejemplo, un PIC que ejecuta 8.192 instrucciones por segundo desea emitir datos a 1200 bps). Si no se activan las interrupciones, esta transmisión no es difícil (reloj un bit cada siete ciclos de instrucción). Si un PIC no hiciera nada más que esperar un byte de datos de 1200 bps entrante, podría ejecutar un bucle de 3 ciclos esperando el bit de inicio, y luego proceder a la relojería de los datos a intervalos de siete ciclos. De hecho, si un PIC tuviera un byte de datos listo para enviar cuando llegara un byte de datos entrante, siete ciclos por bit serían suficientes para que el PIC enviara su byte de datos simultáneamente con la lectura del byte entrante. Del mismo modo, un PIC que iniciara una transmisión de 1200bps podría mirar si el dispositivo con el que se comunica está enviando una respuesta, si dicha respuesta tuviera un tiempo fijo con respecto a la transmisión original . Por otro lado, no habría forma de que los PICs de esa velocidad manejaran las comunicaciones bit-bang de tal manera que cualquiera de los dos dispositivos pudiera transmitir en cualquier momento que considerara oportuno (a diferencia de tener un dispositivo que pudiera transmitir cuando lo considerara oportuno, y hacer lo que quisiera cuando no transmitiera, y un dispositivo que tuviera que pasar la mayor parte de su tiempo sin hacer nada más que esperar las transmisiones del primer dispositivo).

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