/////////////////////////////////////// global.h #ifndef GLOBAL_H_ #define F_CPU 1000000UL #define serial_elementosPosibles 200 #define GLOBAL_H_
#endif /* GLOBAL_H_ */ /////////////////////////////////////////// main.h #ifndef MAIN_H_ #include "global.h" #include "serial.h" #include
#include #include #define MAIN_H_ //////////////////////////////////////////// serial.h #ifndef SERIAL_H_ #include "global.h" #include #define USART_BAUDRATE 9600UL #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) //calcul a lo que hay que subirle a UBRRH y a //UBRRL unsigned char serial_buffer_lectura(vo serial_buffer_lectura(void); id); extern volatile unsigned char serial_cantidadElementosR; extern volatile unsigned char* serial_ultimoDatoEscritoR; extern volatile unsigned char* serial_ultimoDatoLeidoR; extern volatile unsigned char serial_bufferDatosR[];
#define SERIAL_H_
#endif /* SERIAL_H_ */ ////////////////////////////////////////////////////// serial.c #include "serial.h" unsigned char serial_buffer_lectura(void){ if (serial_cantidadElementosR > 0){ unsigned char buffer_caracterLeido = *serial_ultimoDatoLeidoR; / /leo el dato al que se esta apuntando (siguiente dato por leer) serial_ultimoDatoLeidoR++;//Incremento la posicion del apuntador if (serial_ultimoDatoLeidoR == &serial_bufferDatosR[serial_eleme ntosPosibles]) //si comienzo a apuntar a un elemento fuera del buffer serial_ultimoDatoLeidoR = &serial_bufferDatosR[0]; //vuelvo al p rincipio del buffer serial_cantidadElementosR--; //quite un elemento del buffer de l ectura return buffer_caracterLeido; } else{ return 0; } } ////////////////////////////////////////////////////////// labcontrol.h #include "Includes/main.h" unsigned char serial_dummy; //hace flush al buffer de entrada del micro si el bu ffer donde almaceno los datos esta lleno (en lugar de sobreescribir valores). uint8_t byte_recibido; volatile unsigned char serial_bufferDatosR[serial_elementosPosibles];//buffer do nde se almacenan los datos provenientes de serial. volatile unsigned char *serial_ultimoDatoEscritoR = &serial_bufferDatosR[0]; //A puntador al ultimo dato escrito en el buffer.
volatile unsigned char *serial_ultimoDatoLeidoR = &serial_bufferDatosR[0]; //Apu ntador al ultimo dato leido del buffer. volatile unsigned char serial_cantidadElementosR = 0; //Cantidad de datos guarda dos en el buffer. int main(void){ /***************************************************Inicia Configuracion Seri al*************************************************************/ UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; //Asynchronous, no parity, 1-stop bit, transmision de 8 bits. UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); //habilito recepcion datos e interrupcion por RX UCSRB |= (1 << RXEN) | (1 << RXCIE); /***************************************************Termina Configuracion Ser ial*************************************************************/ //Bits 0 y 1 del puerto B como salida DDRB |= (1 << 0) | (1 << 1); //bits 0 a 5 del puerto C como salida DDRC |= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
//interrupciones globales activadas sei(); //Configurar modo sleep MCUCR |= (1 << SE);
while(1){ //Checa si hay datos en el buffer. if(serial_cantidadElementosR > 0){ //Si hay datos en el buffer pasar los datos al puerto B byte_recibido = serial_buffer_lectura(); //Paso dos bits menos significativos del valor recibido a pue
rto B PORTB = byte_recibido & 0b00000011; //Paso 6 bits mas significativos del valor recibido a puerto C PORTC = (byte_recibido >> 2);
} //Si no hay datos en el buffer. else{
//Micro entra en modo sleep. asm("sleep"::);
} } } //funcion que llena el buffer de datos de entrada (serial) ISR(USART_RXC_vect){ if (serial_cantidadElementosR != serial_elementosPosibles){ //checo si e l buffer no esta lleno *serial_ultimoDatoEscritoR = UDR; //guardo el ultimo valor trans mitido hacia el micro por serial dentro //del buffer serial_cantidadElementosR++; //incremento la cantidad de element os guardados que no han sido leidos serial_ultimoDatoEscritoR++; //me muevo la siguiente direccion d e memoria if (serial_ultimoDatoEscritoR == &serial_bufferDatosR[serial_ele mentosPosibles]) //si me estoy saliendo //del buffer serial_ultimoDatoEscritoR = &serial_bufferDatosR[0]; al principio } else{ serial_dummy = UDR; //se pierde el dato } }
//vuelvo