Skip to content

Commit 3d68dcf

Browse files
committed
✔️[Fix] Add UART library
1 parent 0544ff8 commit 3d68dcf

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

Robot/UART.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
Biblioteca de funciones basicas de UART y manejo de interrupcion por recepcion de dato.
3+
*/
4+
5+
#include "main.h"
6+
#include "UART.h"
7+
8+
//Declara un parametro tipo stream de E/S:
9+
FILE uart_io = FDEV_SETUP_STREAM(mi_putchar, mi_getchar, _FDEV_SETUP_RW);
10+
11+
void configurarUART(uint32_t baudRate, uint8_t intRx, uint8_t intTx) {
12+
stdout = stdin = &uart_io; //El stream (FILE) uart_io es la E/S estandar, es decir para fputc y fgetc.
13+
//Parametros de la comunicacion:
14+
UBRR0 = F_CPU/16/baudRate-1; //Configuracion baudrate
15+
UCSR0A &=~ (1<<U2X0); //Velocidad simple (1 para doble)
16+
UCSR0B |= (1<<RXEN0); //Habilita recepcion
17+
UCSR0B |= (1<<TXEN0); //Habilita transmision
18+
UCSR0C |= (1<<USBS0); //1 bit de STOP
19+
UCSR0C |= (3<<UCSZ00); //8 bits de dato
20+
if(intRx) {
21+
UCSR0A &=~ (1<<RXC0); //Apaga flag de interrupcion por Recepcion Completa
22+
UCSR0B |= (1<<RXCIE0); //Habilita interrupcion RX
23+
}
24+
if(intTx) {
25+
UCSR0A &=~ (1<<TXC0); //Apaga flag de interrupcion por Transmision Completa
26+
UCSR0B |= (1<<TXCIE0); //Habilita interrupcion TX
27+
}
28+
}
29+
30+
int mi_putchar(char c, FILE *stream) {
31+
while(!(UCSR0A & (1<<UDRE0)) ); //Espera mientras buffer de transmision este ocupado
32+
UDR0 = c; //UDR0 recibe el nuevo dato c a transmitir.
33+
return 0;
34+
}
35+
int mi_getchar(FILE *stream) {
36+
while ( !(UCSR0A & (1<<RXC0)) ); //Espera mientras la recepcion no esta completa.
37+
return UDR0; //Cuando se completa, se lee UDR0.
38+
}
39+
40+
//-----------------------------------------------------------------------------------------//
41+
// Rutina de Servicio de Interrupcion: //
42+
//-----------------------------------------------------------------------------------------//
43+
/* Rutina de Servicio de Interrupcion por recepcion de datos en UART
44+
Espera mensajes del tipo [:][comando][\r] y lo guarda en buffer comando[]
45+
limpiando delimitadores y agregando NULL al final del mismo para poder usar atoi*/
46+
ISR(USART_RX_vect) { //Rutina de servicio de Interrupcion por Rx:
47+
char dato;
48+
switch(Estado) {
49+
case E_desactivado:
50+
#ifdef HabilitarPrintf
51+
if (bandera) printf("\nEl Estado se encuentra Desactivado\n\n");
52+
#endif
53+
bandera=0;
54+
dato = fgetc(); //No se usa el char dato, solamente es para limpiar el flag RXC0 de
55+
//dato recibido, antes de salir de la ISR.
56+
break;
57+
case E_activado:
58+
bandera=1;
59+
dato = fgetc();
60+
//printf("echo: %c\r\n",dato);
61+
switch(dato) {
62+
case ':': //Delimitador de inicio
63+
indcom=0; //Inicializa indice de buffer de recepcion
64+
flagcom = 1; //Comando en curso
65+
break;
66+
case 8: //Basckspace
67+
if(indcom>0) indcom--;
68+
break;
69+
case '\r': //Delimitador de final (Retorno de Carro)
70+
if(flagcom==1) { //Si hay comando en curso
71+
comando[indcom] = 0; //Coloca NULL luego de ultimo caracter recibido
72+
interpretarComando(); //Interpreta comando recibido
73+
flagcom = 0; //Fin de comando en curso
74+
}
75+
break;
76+
default: //Todo lo que este entre delimitadores
77+
if(indcom<30) //Guarda en elemento del buffer e incrementa indcom:
78+
comando[indcom++] = dato;
79+
}
80+
break;
81+
}
82+
UCSR0A &=~ (1<<RXC0); //Apaga el flag de interrupcion por RX
83+
}

Robot/UART.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef UART_H_
2+
#define UART_H_
3+
4+
void configurarUART(uint32_t baudRate, uint8_t intRX, uint8_t intTX);
5+
int mi_putchar(char c, FILE *stream);
6+
int mi_getchar(FILE *stream);
7+
#define fgetc() mi_getchar(&uart_io) //Redefine la primitiva de entrada como funcion recibir por UART
8+
#define fputc(x) mi_putchar(x,&uart_io) //Redefine la primitiva de salida como funcion transmitir por UART
9+
10+
uint8_t bandera; //Flag para evitar imprimir un mismo mensaje sin haber cambiado de estado.
11+
uint8_t indcom; //Indice de buffer de recepcion
12+
uint8_t flagcom; //Flag "comando en curso"
13+
#define comSize 30 //Tamaño buffer de recepcion
14+
char comando[comSize]; //Buffer de recepcion
15+
16+
17+
18+
19+
#endif /* UART_H_ */

0 commit comments

Comments
 (0)