Pantalla binaria con LEDs

1

Probé un ejemplo de código para mostrar la salida en serie en una serie de LED.

#define F_CPU 1000000UL
#define BAUD 9600UL

#include <avr/io.h>
#include <util/delay.h>
#include <USART.h>
#include <pinDefines.h>


int main(void) {
    char serialCharacter;
    LED_DDR = 0xff;
    initUSART();
    printString("Connection Successful\r\n");

    while (1) {
        serialCharacter = receiveByte();
        transmitByte(serialCharacter);
        PORTB = serialCharacter;
    }
    return 0;
}

El código para la conexión en serie:

#ifndef BAUD
#define BAUD  9600
#endif

#define   USART_HAS_DATA   bit_is_set(UCSR0A, RXC0)
#define   USART_READY      bit_is_set(UCSR0A, UDRE0)

#include <avr/io.h>
#include <util/setbaud.h>

void initUSART(void) {

    #define BAUDRATE ((F_CPU) / (BAUD * 8UL)-1) // Set Baud Rate Value for UBRR

    // Set register
    UBRR0H = (BAUDRATE >> 8);
    UBRR0L = BAUDRATE;
    UCSR0A |= (1 << U2X0);  
    // Enable USART transmitter and receiver
    UCSR0B = (1 << TXEN0) | (1 << RXEN0);
    // Set 8 data bits and 1 stop bit
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}

void transmitByte(uint8_t data) {
    // Wait for empty transmit buffer
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = data;
}

uint8_t receiveByte(void) {
    // Wait for incoming data
    loop_until_bit_is_set(UCSR0A, RXC0);
    return UDR0;
}

void printString(const char myString[]) {
    uint8_t i = 0;
    while (myString[i]) {
        transmitByte(myString[i]);
        i++;
    }
}

La conexión funciona bien y los datos que ingresé se mostrarán en un terminal serial como se esperaba. Aunque la pantalla en la matriz de LED es impar. No importa lo que ingrese, obtengo la salida en los LED de 00001010 (8 LED que representan cada uno un bit) en el PORTB del ATMEGA328p.

Siempre se encienden los 2 LEDs iguales. Cuando presiono una tecla para ser transmitida, recibo un breve parpadeo de los LED y luego vuelvo a encender los Bit 2 y 4. ¿Cómo puedo solucionar esto?

    
pregunta sesc360

1 respuesta

4

Podría configurarse su programa de terminal de PC para enviar automáticamente un salto de línea ASCII después de cada carácter. Eso explicaría por qué el carácter final que recibe tu MCU es 0Ah. Compruebe que el programa del terminal esté configurado en un modo simple.

    
respondido por el TonyM

Lea otras preguntas en las etiquetas