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+ }
0 commit comments