Está en la página 1de 5

Comunicación serial asincrónica-USART

PROFESOR
Fiestas Ugas, Antonio Esteban

CURSO
Microcontroladores

ALUMNOS:
Castillo Zavaleta, Santiago Evaristo
Fernández Campos, Piero Frank
Rivas Huamanñahui, Misael Mateo
Villamizar Morales, Patrick Michael

Lima – Perú

2022-02
1. Problema
El presente reto consistía que a partir de la letra que se mande por el monitor serial se
prenda el color correspondiente de la letra mandada.

2. Código solución

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
void serial_config(){
UCSR0A&=0xFC; //tiene las banderas
UCSR0C|=0x06;
UCSR0B|=0x18;
UCSR0B&=0xFA;
UBRR0=103;//velocidad del microcontrolador
DDRD=0x02;
DDRD&=0b11111110;
DDRD|=0b00000010;
}
void send_char( char dato){
while(!(UCSR0A&0x20));
UDR0=dato;
}
void send_frase( char *str){
while(*str){
send_char(*str++);
}
}
char read_char(void){
char dato;
if(UCSR0A&0x80){
return UDR0;
}
else {
return 0;
}

}
int main(void)
{
serial_config();
DDRB=0xFF;
while (1)
{
char dato=read_char();
if (dato == 'r')
{
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000001;
_delay_ms(500);
}
if(dato== 'g'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000010;
_delay_ms(500);
}
if(dato=='b'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000100;
_delay_ms(500);
}
if(dato=='m'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000101;
_delay_ms(500);
}
if(dato=='c'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000110 ;
_delay_ms(500);
}
if(dato=='y'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000011;
_delay_ms(500);
}
if(dato=='w'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000111;
_delay_ms(500);
}
}
}

3. Explicación del código

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
void serial_config(){
UCSR0A&=0xFC; //tiene las banderas
UCSR0C|=0x06;
UCSR0B|=0x18;
UCSR0B&=0xFA;
UBRR0=103;//velocidad del microcontrolador
DDRD=0x02;
DDRD&=0b11111110;
DDRD|=0b00000010;

En las primeras líneas determinamos la frecuencia del CPU del microcontrolador,


además configuramos los registros de la comunicación serial, estos registros los
configuramos con los valores predispuesto de la datashet, el primer registro que es el
UCSR0A es el que tiene las banderas de la comunicación serial.
void send_char( char dato){
while(!(UCSR0A&0x20));
UDR0=dato;
}
En estas líneas armamos una función que revisa un carácter tipo char y lo guarde en una
variable en este caso se realizó a partir del registro UCSR0A.
void send_frase( char *str){
while(*str){
send_char(*str++);
}

En estas líneas se construye una función que ayuda a leer una cadena de caracteres que se
denomina una variable str ,pues esto ayuda a mostrar un frase en el monitor serial.
int main(void)
{
serial_config();
DDRB=0xFF;
while (1)
{
char dato=read_char();
if (dato == 'r')
{
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000001;
_delay_ms(500);
}
if(dato== 'g'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000010;
_delay_ms(500);
}
if(dato=='b'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000100;
_delay_ms(500);
}
if(dato=='m'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000101;
_delay_ms(500);
}
if(dato=='c'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000110 ;
_delay_ms(500);
}
if(dato=='y'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000011;
_delay_ms(500);
}
if(dato=='w'){
PORTB&=0x00;
_delay_ms(500);
PORTB|=0b00000111;
_delay_ms(500);
}
}
}

Estas líneas se pueden observar que en la función principal llamamos la función de la


comunicación serial que se denomina “serial_config” y configuramos el puerto D como
un puerto de puras salidas. Luego, definimos dentro del while(1) una variable dato tipo
char que contine la función “send_char”, luego de ello, con un condicional if
preguntamos si el dato ingresado es igual a una letra que en este caso puede ser
r,g,b,m,c,y o w que son las iniciales de los colores RGB. Luego, que se compruebe que
letra esta ingresando por el monitor serial se apaga todo el puerto y luego se prende la
entrada correspondiente al color, como trabajamos con un led RGB, hay colores que
debemos mandar una señal de un uno en dos salidas al mismo tiempo para formar el
color desea y en un caso especial como es el color blanco (w) debemos prender 3
salidas para formaro.

4. Comentario de lo aprendido
- En esta sección hemos aprendido sobre como configurar el microcontrolador para
trabajar con comunicación serial.
- Se aprendió que existe puertos de salida especializadas para la comunicación serial
que son los pine RX y TX.
- Se aprendió como hacer que el microcontrolador reciba y a la vez transmita un
carácter y una cadena de caracteres (frase).

5. Conclusiones
- La comunicación serial permite la transmisión- recepción bit a bit de un byte
completo, este método de comunicación puede alcanzar mayores distancias.
- Se puede mandar caracteres a partir de un monitor serial y se puede hacer un
acción con el Arduino como prender un led.
- Existe configuraciones determinadas para los registros para el uso de la
comunicación serial.

También podría gustarte