Last active
August 29, 2015 13:57
-
-
Save chukitow/9520505 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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