Estoy aprendiendo Atmega328p USART periférico. Escribí un código simple para enviar y recibir datos de una computadora a través de un chip FTDI. En mi código, en realidad uso dos LED para indicar que estoy trabajando. El primer LED que está conectado PINB0 cambiará después de una transmisión BYTE. El segundo LED cambiará si se recibe correctamente 1 BYTE de la computadora. Ahora quemé el código. Y las cosas estaban sucediendo como deberían suceder. El 1er LED está alternando indicando la transmisión de datos. Y el 2do LED no está TOGGLING ya que no conecté el chip FTDI hasta ahora. Luego desenchufé mi usbasp y encendí el microcontrolador con un cargador de celtasa de constante 5v que medí con mi osciloscopio (con un capacitor de 1uf en el riel de alimentación). Ahora sucede algo interesante. El segundo LED está parpadeando de forma aleatoria, lo que indica que el microcontrolador está recibiendo BYTE a través de su pin RX. Pero no he conectado el controlador FTDI hasta ahora y el pin RX está sin conexión. ¿Qué está pasando aquí?
Aquí está mi código:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 1000000ul
volatile unsigned char ReceivedByte;
int main(void)
{
DDRB |=(1<<PINB0)|(1<<PINB1);
int reg_value=12;
UBRR0L= (unsigned char) reg_value;
UBRR0H= (unsigned char) (reg_value>>8);
UCSR0B |=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UCSR0C |=(1<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01); //2 stopbit,8data bit
sei();
while (1)
{
while(!(UCSR0A &(1<<UDRE0)) ) //polling
UDR0='a';
PORTB ^=(1<<PINB0);
_delay_ms(500);
}
}
ISR(USART_RX_vect)
{
ReceivedByte=UDR0;
PORTB ^=(1<<PINB1);
}