Probé un ejemplo de código para mostrar la salida en serie en una matriz 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 ingreso se mostrarán en un terminal serial como se esperaba. Aunque la pantalla en la matriz de LED es extraña. Independientemente de lo que ingrese, obtengo la salida en LEDS de 00001010 (8 LED cada uno representa un bit) en PORTB de ATMEGA328p.
Siempre se encienden los mismos 2 LED. Cuando presiono una tecla para que se transmita, los LED parpadean brevemente y luego vuelven a encenderse los bits 2 y 4. ¿Cómo puedo solucionar esto?
¿Podría configurarse el programa de su terminal de PC para enviar automáticamente un avance de línea ASCII después de cada carácter? Eso explicaría por qué el carácter final que recibe su MCU es 0Ah. Verifique que el programa de la terminal esté configurado en un modo simple.
Rdo
sesc360
PORTB = 0b00011100
se encienden los LED correctossesc360
sesc360
¿
para la letra A. No importa qué tecla presione, los LED 0-6 parpadean al presionar la tecla Enter y luego los LED 1 y 3 se encienden constantemente. Pasa con todas las teclas.