#include <kd_sfrs.h>
#define NUM_MODOS 4 //Cuantos modos queremos ?
// Variables globales
int modo; // Modo actual
extern unsigned int timer2_seg; // Segundos
extern signed int tem_disp;
extern unsigned int hum_disp;
extern unsigned int vel_disp;
extern unsigned int dir_disp;
extern unsigned int vel_inst;
unsigned int vel_sum; // Sumatorio de velocidades, para hacer la media
unsigned int dir_sum; // Sumatoria de ángulos de dirección del viento
void main()
{
int temp, temp1, temp2; // Temporales
// inits
// Botón
asm {di;}
wsr=0;
int_mask=int_mask|0x80; // activamos la interrupcion (EXTINT)
int_mask1=int_mask1&0xDF; // Desactivamos INT13 (EXT_PIN=0)
wsr=0;
ioc1=ioc1 & 0xFD; //EXT_INT=0 para elegir p2.2
asm {ei;}
// Otros
inits_lcd();
inits_timer2();
inits_ad();
inits_hsi();
modo=0;
vel_sum=0;
dir_sum=0;
//main loop
// Este bucle se ejecuta cada segundo para tomar las muestras necesarias,
// hacer medias, y mostrarlas en pantalla.
while(1)
{
switch (modo)
{
// Temperatura. A/D, sin media
case 0:
temp=conversio_ad(1);
// convertir de [0-255] a [-20 - 50]
temp=((temp*70)/255)-20;
tem_disp=temp;
mostrar_tem();
visual_tem();
break;
// Humedad. A/D, sin media
case 1:
temp=conversio_ad(2);
// convertir de [0-255] a [0-100 %]
temp=(temp*100)/255;
hum_disp=temp;
mostrar_hum();
visual_hum();
break;
// Velocidad viento. HSI, con nombres, con media
case 2:
// Ya tenemos vel_disp actualizada, ya que se hace en cada
// iteración del bucle (cada segundo)
mostrar_vel();
break;
// Dirección viento. A/D, con nombres, con media
case 3:
// Ya tenemos dir_disp actualizada, ya que se hace en cada
// iteración del bucle (cada segundo)
mostrar_dir();
break;
// Modo incorrecto
default:
show_msg_lcd("Unimplemented mode code",2,1);
break;
}
// La velocidad (HSI) y dirección (A/D) del viento requieren media, y por tanto
// hay que mantenerla siempre actualizada, independientemente del modo en el que
// estemos.
temp=conversio_ad(3); // dirección del viento
// convertir de [0-255] a [0-360 grados]
// *(360/255). Para evitar desbordamientos,
temp=(temp*72)/51;
vel_sum+=vel_inst; // Acumular
dir_sum+=temp; // Acumular
if (timer2_seg%10==0) // Si han pasado 10 segundos
{
vel_disp=vel_sum/10; // Actualizar el valor mostrado
dir_disp=dir_sum/10;
vel_sum=0;
dir_sum=0;
}
// Mostrar reloj, común para todos los modos
show_char_lcd(':',11,2);
show_char_lcd(':',14,2);
temp=timer2_seg%60; //segundos
show_value_lcd(temp,2,'0',16,2);
temp=timer2_seg/60; //minutos
temp%=60;
show_value_lcd(temp,2,'0',13,2);
temp=timer2_seg/60;
temp/=60;//horas
temp%=24;//hora: de 0 a 23
show_value_lcd(temp,2,'0',10,2);
// Esperar hasta que haya pasado un segundo o cambiemos de modo.
// Como tomamos muestras cada segundo, no habrá nada nuevo
// que mostrar en pantalla hasta la siguiente muestra.
temp1=timer2_seg; temp2=modo;
while( temp1==timer2_seg && temp2==modo);
// Si se ha cambiado de modo, borrar la pantalla
if (temp2!=modo) CLRSCR_LCD();
// Fin del bucle principal
}
}
//RSI's
void RSIExtInt()
{
asm{di;}
modo=(modo+1)%NUM_MODOS;
asm{ei;}
}