Bit Banging UART

4

Mi código completo se encuentra aquí .

Básicamente, estoy transmitiendo a un Arduino, y no estoy recibiendo el valor correcto (se dará cuenta de que estoy tratando de enviar d'22 '). Aquí está el método donde realmente mordí la transmisión:

// Method for transmitting value using serial bit banging
void uart_tx_bit_bang(unsigned char val) {
    unsigned char i;
    Tx_Pin = 0;                         // Start bit
    uart_time_delay();
    for ( i = 8 ; i != 0 ; --i ) {
        if (val & 0x01) Tx_Pin = 1;   // Begin with LSB
        else            Tx_Pin = 0;
        val >>= 1;
        uart_time_delay();
        }
    Tx_Pin = 1;                         // Stop bit
    uart_time_delay();
}

Dado que el retraso debe ser 1 / baudios, uart_time_delay() debe ser un retraso de 104us. Estoy usando __delay_us(104) de las bibliotecas PIC. Cualquier ayuda en esto es muy apreciada.

Estoy seguro de que estoy usando la velocidad de transmisión correcta en ambos extremos.

    
pregunta Willem Ellis

1 respuesta

3

Si bien su cálculo de 104uS es correcto para 9600BPS, su bucle y las diversas operaciones que realiza agregarán un retraso adicional. Hay algunas maneras en las que podría ajustar la sincronización:

  • Reste una constante de su demora de uS hasta que empiece a funcionar. Se Probablemente sea mejor determinar el número mínimo / máximo que funciona. con y elija el valor medio.

  • Haga algo similar usando un alcance para verificar el tiempo final si tiene uno disponible.

  • Observe la salida del ensamblador del compilador y determine cuántos cicla el ciclo que toma.

También veo que estás usando el reloj RC. Normalmente me gusta mantener mi tiempo en serie dentro del 2% para una operación confiable, así que también asegúrese de que la parte tenga tanta estabilidad cuando use el reloj RC para una operación confiable.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas