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.