Problema de TX de bit-bang

-2

Necesito ayuda. Tuve que crear una nueva serie para mi placa base. Decidí emular un serial a través de bit bang. El código está abajo. Estoy encontrando un problema en mi código de sincronización bit bang con un código RS232 tradicional. La placa base está generando la señal correctamente, pero el receptor no puede identificar el número enviado correctamente.

#include <avr/io.h>
#include "bit_bang.h"
#include <util\delay.h>
#define tx_pin_high() PORTB |= (1<<7)
#define tx_pin_low() PORTB &= ~(1<<7)



void init_port_bit_bag()
{

    DDRB = 0xFF; 
    PORTB  = 0x00; 
}

void uart_tx_bit_bang_8bit(unsigned char data)
{

    unsigned int i = 0;
    tx_pin_low();

    _delay_us(2);

    for( i=8 ; i!=0 ; --i) //LSB BIT
    {
        if(data & 0x01) 
        {
            tx_pin_high(); 
        }
        else 
        {
            tx_pin_low(); 
        }

        data >>= 1;
        _delay_us(156);
    }

    tx_pin_high();
    _delay_us(2);
}

He probado este código y funciona perfectamente. El bucle para generar la palabra es gastar 625,25 e enviados por byte, logrando así casi el ideal para tener los 9600 bps. Lo que necesito es sincronizar este código con un RS 232 tradicional en serie o crear una recepción de bit bang en serie . Realicé algunas pruebas usando las funciones tradicionales de RS 232 y siguiendo el código a continuación, el recibido es diferente de lo que se está enviando. ¿Alguien puede ayudarme por favor? El receptor de datos en serie está recogiendo diferente de lo que estoy enviando.

char uart_getchar (void)
{
    while (!(UCSRA & (1 << RXC)));
    return UDR;
}

while (1)
{          
           rx = uart_getchar();
           _delay_ms(30);

            uart_string("Information:");
        uart_putchar('\n');
        uart_putchar((rx/10)%10+'0');
        uart_putchar(rx%10+'0');
        uart_putchar('\n');
        _delay_ms(1000);
}

Eso es lo que he enviado.

#include <avr\io.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include "bit_bang.h"

int main(void)
{   
    char date1 = 6;   

    init_port_bit_bag();
    while (1)
    {
    uart_tx_bit_bang_8bit(date1);
    _delay_ms(10);
    }
}

Y estoy obteniendo los números 7, 14, 15,17. Creo que el error está en la sincronización del bit de inicio.

    
pregunta Nabil

1 respuesta

2

Si desea transmitir a 9600 baudios, sus retrasos son incorrectos. $$ \ frac {1} {9600} \ approx 104 {\ mu} s $$ Necesita 104 microsegundos para cada período de bits. Los bits de inicio y parada también son 104 microsegundos. Ahora, probablemente tendrá que restar el tiempo de procesamiento de la demora. Puede encontrar esto estudiando el tiempo de las instrucciones del procesador y escribiendo en el ensamblaje, o haga trampa y solo mida en un osciloscopio.

Pero seguro que _delay_us(2); y _delay_us(156); están mal.

    
respondido por el markrages

Lea otras preguntas en las etiquetas