/*
* 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 <stdlib.h>
#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;
}
}
}
}
}