/* * p7.c * * * Created by Israel Zuiga, et al. on 19/04/10. * Copyright 2010 Universidad de Colima. All rights reserved. * * *offset *1 a consideration or amount that diminishes or balances the effect of a contrary one : an offset against taxable profits. *2 the amount or distance by which something is out of line : these wheels have an offset of four inches. * */ #include <16F877a.H> #device ADC=10 #include #fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N) int opc; char str[10]; int ban,ban2=0,bancs=0; //Version de Firmaware: v. 0.1 #int_rda void rda_isr() { while(kbhit()){//espera a la llegada de los 8 bits delay_us(10); if(kbhit()){ if (bancs==0){/*off set*/ opc=getc();/*recibe comando*/ if ((opc>96) && (opc < 107) ) opc=opc - 32; ban=1; } else{ gets(str);//obtener cadena ban2=1; } } } } void seleccion() { printf("\n.::Selecciona el modo de operacion::."); printf("\n\n Modo ejecucion: [a] Modo configuracion: [b] "); } void modoc() { printf(".:Menu de Conf.:."); printf("\n [c] Offset"); printf("\n [d] Cadencia"); printf("\n [e] resolucion"); printf("\n [f] firmware"); printf("\n [g] regresar al inicio"); } //Inicia la parte principal del programa void main() { //Conversion de ADC float decimal; int16 valor=0;//Resultado de ADC int cadencia=1;//Lapso de tiempo para tomar una muestra int aux=0; float offset=0;//Valor a considerar para generar un balance en medicion int resolucion = 0; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(RA0_analog); set_adc_channel(0); //Lineas para interrupcion RDA RS232 enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); //LLamada a menu principal seleccion(); //Inicializacion de variables opc=0; ban=0; while (TRUE) { if (ban==1) { ban=0; switch (opc) { //Modo Ejecucion case 65:{ printf("\n Entrando al Modo Ejecucion. Salir con [r]"); printf("Temperatura: "); ban=1; aux=cadencia-1; while (ban==1){ delay_ms(1000); aux+=1; if (aux==cadencia){ valor=read_adc(); valor=(valor>>resolucion); decimal=(float)valor/2.048; decimal=decimal + offset; if ((decimal <10) || (decimal > -10)) printf("\b\b\b\b\b\b\b"); else printf("\b\b\b\b\b\b"); printf("%fc",decimal); aux=0; } if (opc==82){ ban=0; printf("\nEl medidor de temperatura ha parado\n"); seleccion(); } } break; } //Modo Configuracion case 66: { modoc(); break; } //Offset case 67: { printf("\n Offset"); printf("\n Offset debe ser entre 2 y -2. Indicando su signo"); printf("\n P.ejemplo: +1.3, -1.5"); printf("\n Escribe un valor para el Offset:"); while (bancs==1) { if (ban2==1) { offset=atof(str); ban2 = 0; bancs = 0; modoc(); } } break; } //Cadencia case 68: { printf("\n Cadencia"); printf("\n 10 seg. = [0]"); printf("\n 9 seg. = [9]"); printf("\n 8 seg. = [8]"); printf("\n,,,"); printf("\n 1 seg. = [1]"); ban=1; while (ban==1){ if ((opc>47) && (opc<58)){ cadencia=opc-47; ban=0; modoc(); } } break; } //Resolucion case 69: { printf("\n Resolucion"); printf("\n 8bits [x] \n 9bits [y] \n 10bits [z]"); ban=1; while (ban==1){ if (opc !=69){ switch (opc){ case 88:{ resolucion=2; ban=0; modoc(); break; } case 89:{ resolucion=1; ban=0; modoc(); break; } case 90:{ resolucion=0; ban=0; modoc(); break; } default:{ printf("\n Nel \n"); ban=0; modoc(); break; } } } } break; } //Firmwarez case 70: { printf("\n Este uC tiene la version .12345 Release Candidate"); printf("\n En 5 segundos regresaras al menu"); delay_ms(5000); modoc(); break; } //Regresar al inicio case 71: { seleccion(); break; } //comandos sin funcion default:{ seleccion(); break; } } } } }