Skip to content

Instantly share code, notes, and snippets.

@chukitow
Last active August 29, 2015 13:57
Show Gist options
  • Select an option

  • Save chukitow/9520505 to your computer and use it in GitHub Desktop.

Select an option

Save chukitow/9520505 to your computer and use it in GitHub Desktop.
#include <18f4520.h>
#device adc = 10
#fuses XT, PUT, NODEBUG , NOBROWNOUT , NOPROTECT , NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, bits = 8 , parity = N ,xmit=PIN_C6,rcv=PIN_C7)
int16 resolucion1 = 10; //Variable para la resolucion, inicial 10
int16 resolucion2 = 10;
int contadorEnviar = 1; //Contador auxiliar para enviar informacion cada segundo
int VOLTAGE = 5; //Voltage a usar
char data[50]; //Buffer donde se guardara la trama
int index = 0; //Indica indice de la trama;
float offset1 = 0; //Offset para la temperatura 1
float offset2 = 0; //offset para la temperatura 2
char buffer; //variable donde se guarda el buffer del serial
int tiempo = 10; // tiempo / 10 = el tiempo que tarda en enviar la informacion
float calculateResolution(int); //calcular la resolucion a binario
void analizarTrama(); // analiza toda la trama y ejecuta los procesos
int getUnidad(char); // rescibe una unidad en char y la devuelve como entero
float getDecimal(char); // recibe una unidad en char y la regresa en decimal
void limpiarTrama(); //Limpia la trama que esta en el buffer
float calculateSign(char,float); //determina el signo de la trama para el offset
#int_rda
void rda_isr(void)
{
//Hay datos pendientes ??
if(kbhit())
{
//Si es el backspace borramos la trama
int asciiKEY;
buffer= getc();
asciiKEY = buffer;
if(asciiKEY == 8)
{
if(index>0)
{
data[index] = ' ';
index--;
}
}
else
{
if(index>50)index=0;
data[index] = buffer;
index++;
}
}
}
void main(void)
{
//Temperaturas
double temperatura1 = 0;
double temperatura2 = 0;
double medicion = 0; //valor leido por el adc
enable_interrupts(global);
enable_interrupts(int_rda);
setup_adc (adc_clock_internal);
setup_adc_ports( ALL_ANALOG );
while(true)
{
analizarTrama(); // analizamos la trama
if(contadorEnviar == tiempo)
{
//Leemos el sensor 1 y lo mostramos;
set_adc_channel(0);
medicion = read_adc();
if(resolucion1 == 10)
{
temperatura1 = (float)(medicion * calculateResolution(resolucion1));
}
if(resolucion1 == 9)
{
temperatura1 = (float)(medicion * calculateResolution(resolucion1));
temperatura1 /=2;
}
else if(resolucion1 == 8)
{
temperatura1 = (float)(medicion * calculateResolution(resolucion1));
temperatura1 /=4;
}
printf("La temperatura del sensor 1 es de %2.2f \r", temperatura1 + offset1);
//Leemos el sensor 2 y lo mostramos ;
set_adc_channel(1);
medicion = read_adc();
if(resolucion2 == 10)
{
temperatura2 = (float)(medicion * calculateResolution(resolucion2));
}
if(resolucion2 == 9)
{
temperatura2 = (float)(medicion * (calculateResolution(resolucion2)));
temperatura2 /=2;
}
else if(resolucion2 == 8)
{
temperatura2 = (float)(medicion * (calculateResolution(resolucion2)));
temperatura2 /=4;
}
printf("La temperatura del sensor 2 es de %2.2f \r", temperatura2 + offset2);
contadorEnviar = 0;
}
delay_ms(100);
contadorEnviar++ ;
}
}
float calculateResolution(int resolucion)
{
double binary = 0;
double calculated = 0;
switch(resolucion)
{
case 8:
binary = 256;
break;
case 9:
binary = 512;
break;
case 10:
binary = 1024;
break;
}
calculated = (float)((VOLTAGE / binary) * 100);
return calculated;
}
void analizarTrama()
{
/* Analizamos si la trama esta completa */
int i;
//Analizar si esta completa
boolean inicioTrama = false;
boolean finalTrama = false;
for( i=0; i<=index;i++)
{
if(data[i] == '<')
{
inicioTrama = true;
}
else if(data[i] == '>')
{
finalTrama = true;
}
}
/*LA TRAMA ESTA COMPLETA*/
if(inicioTrama == true && finalTrama == true)
{
printf("Trama recibida \r ");
switch(data[1])
{
//OFFSET
case 'o':
//SENSOR
if(data[2] =='1' || data[2] == '2')
{
//SIGNO
if(data[3] == '+' || data[3] == '-')
{
//PUNTO DECIMAL
if(data[5] == '.')
{
//Unidad
if(data[4] == '0' || data[4] == '1' || data[4] == '2')
{
//Decimal
if(data[6] == '0' || data[6] == '1' || data[6] == '2' || data[6] == '3' || data[6] == '4' || data[6] == '5' || data[6] == '6' || data[6] == '7' || data[6] == '8' || data[6] == '9')
{
/* Calculo y seteo del offset */
int unidad;
float decimal;
float semioffset;
unidad = getUnidad(data[4]);
decimal = getDecimal(data[6]);
semioffset = (float)(unidad + decimal );
if(semioffset > 2)
{
printf("Offset invalido , ");
}
else
{
if(data[2] == '1')
{
offset1 = calculateSign(data[3] , semioffset);
printf("Offset activdo para el sensor 1 con un valor de %2.2f \r ", offset1 );
}
else if(data[2] == '2')
{
offset2 = calculateSign(data[3] , semioffset);
printf("Offset activdo para el sensor 2 con un valor de %2.2f \r ", offset2 );
}
}
}
}
}
}
}
break;
//Resolucion
case 'r':
if(data[2] == '1')
{
//Numero de bits
if(data[3] == '8')
{
resolucion1 = 8;
printf("Resolucion del sensor 1 cambiada a 8 bits \r");
}
else if(data[3] == '9')
{
resolucion1 = 9;
printf("Resolucion del sensor 1 cambiada a 9 bits \r");
}
else if(data[3] == 'a' || data[3] == 'A' )
{
resolucion1 = 10;
printf("Resolucion del sensor 1 cambiada a 10 bits \r");
}
else
{
printf("VALOR NO SOPORTADO \r ");
}
}
else if(data[2] == '2')
{
//Numero de bits
if(data[3] == '8')
{
resolucion2 = 8;
printf("Resolucion del sensor 2 cambiada a 8 bits \r");
}
else if(data[3] == '9')
{
resolucion2 = 9;
printf("Resolucion del sensor 2 cambiada a 9 bits \r");
}
else if(data[3] == 'a' || data[3] == 'A' )
{
resolucion2 = 10;
printf("Resolucion del sensor 2 cambiada a 10 bits \r");
}
else
{
printf("VALOR NO SOPORTADO \r ");
}
}
break;
case 'f':
printf("Version del firmware 1.0 version beta \r ");
break;
case 't':
if( data[2] == '1' || data[2] == '2' || data[2] == '3' || data[2] == '4' || data[2] == '5' || data[2] == '6' || data[2] == '7' || data[2] == '8' || data[2] == '9' || data[2] == 'a' )
{
tiempo = getUnidad(data[2]) * 10;
printf("Se cambio el tiempo de envio de datos exitosamente a %d segundos \r " , tiempo / 10);
contadorEnviar = 0;
}
break;
}
limpiarTrama();
printf("Buffer de la trama limpiado , ingrese otro comando \r ");
}
}
int getUnidad(char decimal)
{
int number = 0;
switch(decimal)
{
case '1':
number =1;
break;
case '2':
number = 2;
break;
case '3':
number = 3;
break;
case '4':
number = 4;
break;
case '5':
number = 5;
break;
case '6':
number = 6;
break;
case '7':
number = 7;
break;
case '8':
number = 8;
break;
case '9':
number = 9;
break;
case 'a':
number = 10;
break;
}
return number;
}
float getDecimal(char decimal)
{
float number = 0;
float residuo;
switch(decimal)
{
case '1':
number =1;
break;
case '2':
number = 2;
break;
case '3':
number = 3;
break;
case '4':
number = 4;
break;
case '5':
number = 5;
break;
case '6':
number = 6;
break;
case '7':
number = 7;
break;
case '8':
number = 8;
break;
case '9':
number = 9;
break;
}
printf("Numero entero antes de convertirse en decimal %1.2f " , number);
residuo = (float)(number / 10);
return residuo;
}
void limpiarTrama()
{
int i;
for(i=0; i<=index; i++)
{
data[i] = ' ';
}
}
float calculateSign(char sign , float semmioffset)
{
float num;
switch(sign)
{
case '-':
num = (float)((semmioffset - semmioffset) - semmioffset);
break;
case '+':
num = semmioffset;
break;
}
return num;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment