Go Down

Topic: Interrupción Serial (Read 399 times) previous topic - next topic

max_saeta

Mar 11, 2015, 05:06 am Last Edit: Mar 11, 2015, 05:08 am by max_saeta
Desde hace un rato he estado buscando una librería que me permita atender una interrupción al recibir un carácter vía serial, por los datasheet sabia que si existen estas interrupciones, pero bajo el core de Arduino no había podido realizara. Y esto se debía a que iniciaba y usaba todas las funciones de la librería Hardware Serial que se incluyen directamente en la compilación cuando inicias Serial.begin(velocidad); o cualquier otra llamada de las funciones de esta librería.

Luego de probar unas interrupciones por Timer2, decidí investigar un poco mas, resulta que todo esta allí pero se necesita hacer sin llamar funciones de Serial.

He comenzado a jugar un poco, y he corrido los siguientes códigos, los coloco para que me ayuden a mejorar y para los interesados.


Code: [Select]


#include <avr/io.h>
#include <avr/interrupt.h>

#define FOSC 16000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1


volatile  char c;
String cadena="";
bool esc = false;

void USART_Init( unsigned int ubrr){
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char) ubrr;
//Enable receiver and transmitter //*/
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UCSR0C = (3<<UCSZ00);

}

void setup(){
USART_Init(MYUBRR);
sei();   
}

void loop(){
cli();
if(c!='\0'){
c='\0';
for(int i = 0; i < cadena.length(); i++) UDR0 = cadena.charAt(i);
cadena = "";
}
sei();
}

ISR (USART_RX_vect)    { c = char(UDR0); cadena += c;}  // Saca una C por usart

/*


El sketch usa 2,320 bytes (7.2%) del espacio de almacenamiento. El máximo es 32,256 bytes.
Las variables globales usan 28 bytes (1.4%) de la memoria dinámica, dejando 2,020 bytes para variables locales. EL máximo es 2,048 bytes.
[Stino - Compilación terminada "663313" en 0.8s.]

*/


Este es el codigo sin usar la libreria HardwareSerial

Code: [Select]



String cadena = "";
void serialEvent(){
if(Serial.available()){
char myChar = Serial.read();
if(myChar == '\n'){
Serial.println(cadena);
cadena="";
}
else{
cadena+=myChar;
}
}
}

void setup()
{
Serial.begin(9600);
}

void loop(){

}


/*


El sketch usa 3,474 bytes (10.8%) del espacio de almacenamiento. El máximo es 32,256 bytes.
Las variables globales usan 200 bytes (9.8%) de la memoria dinámica, dejando 1,848 bytes para variables locales. EL máximo es 2,048 bytes.
[Stino - Compilación terminada "226076" en 0.7s.]

*/


Este codigo hace lo mismo que el de arriba pero con HardwareSerial. Solo son unas pocas lineas pero se ve la diferencia en el uso de memoria de programa y de memoria RAM.

Luego añadire lo que vaya realizando si estan interesados.

surbyte

Que te parecen estas Max

Arduino bufferd Serial

Usan una librería controlada por interrupciones que no he mirado pero que usa un buffer de 200bytes.
La busqué como respuesta a un hilo y tal vez sirva a tu propósito.

max_saeta

Gracias Surbyte

La revisare.

Go Up