#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000)
#include "HDM64GS12_scanbang.c"
#include "graphics.c"
#include "math.h"
#include "24256.c"
#include <string.h>
/// para conteo de uptime
#define CLOCKS_PER_SECOND 1000 ///contar cada tantos milisegundos (uptime)
#include <stdlib.h>
// fin de conteo uptime
///para la eeprom interna del pic
#include "stdlib.h"
#include "limits.h"
typedef int8 INTEE;
///fin eeprom interna del pic
//////para medir frecuencia
#priority CCP1, TIMER1
#define BytePtr(var, offset) (char *)((char*)&var + offset)
#byte PIR1 = 0x0C
#bit TMR1IF = PIR1.0
int8 gc_timer1_extension = 0;
int8 gc_capture_flag = FALSE;
int32 g32_ccp_delta;
///////fin para medir frecuencia
int m, p, l;
int16 t = 0; //para el uptime variable de comparacion
unsigned int16 minutos5 = 0; //para el uptime variable de valor en fraciones de 5 minutos
int32 current_ccp_delta; //para la frecuencia
float Values, frequency; //para el adc y frecuencia
char Texto[30];
short int dbutton4, dbutton5, dbutton6, dbutton7, start_hours;
////prototipos
float read_analog(int a);
int menu(int p);
float read_frequency(void);
void write_eeprom16(int address1, int address2, int16 value);
int16 read_eeprom16(int address1, int address2);
void iniciar_eeprom(int e);
///////fin de los prototipos
void welcome(void){
delay_ms(50);
Texto = "Empresa";
glcd_text57(0, 0, Texto, 2, ON);
Texto = "ELECTRONIC";
glcd_text57(0, 20, Texto, 2, ON);
}
void Pantalla_0(){
if (p == 1 || p == 2 || p == 3) {
glcd_fillScreen(OFF);
m = menu(0);
}
extern float Values;
extern float read_analog(int a);
extern char Texto[];
Texto = "----TEMPERATURAS----";
glcd_text57(0, 0, Texto, 1, ON);
Texto = "Externa:";
glcd_text57(0, 10, Texto, 1, ON);
Texto = "Interna:";
glcd_text57(0, 20, Texto, 1, ON);
Texto = "Motor";
glcd_text57(0, 30, Texto, 1, ON);
Texto = "Alternador:";
glcd_text57(0, 40, Texto, 1, ON);
Values = read_analog(0) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 17, 127, 10, YES, OFF);
if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
Values = read_analog(1) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 27, 127, 20, YES, OFF);
if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
Values = read_analog(2) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 37, 127, 30, YES, OFF);
if (l == 4){glcd_text57(92, 30, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 30, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 30, Texto, 1, ON);}
Values = read_analog(3) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 47, 127, 40, YES, OFF);
if (l == 4){glcd_text57(92, 40, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 40, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 40, Texto, 1, ON);}
p = 0;
}
void Pantalla_1(){
if (p == 0 || p == 2 || p == 3) {
glcd_fillScreen(OFF);
m = menu(1);
}
extern float Values;
extern float read_analog(int a);
extern char Texto[];
extern float read_frequency(void);
Texto = "----ESTADO GRUPO----";
glcd_text57(0, 0, Texto, 1, ON);
Texto = "VCA:";
glcd_text57(0, 10, Texto, 1, ON);
Texto = "Frecuencia:";
glcd_text57(0, 20, Texto, 1, ON);
Texto = "Monoxido:";
glcd_text57(0, 30, Texto, 1, ON);
Texto = "Horas uso:";
glcd_text57(0, 40, Texto, 1, ON);
Values = read_analog(4) * (260.0 / 1024.0);
glcd_rect(80, 17, 127, 10, YES, OFF);
if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
///adicional para saber si empezar a contar despues veo donde lo meto
if (Values > 100) {start_hours = 1;} else {start_hours = 0;}
// Values = read_analog(5) * (5.0 * 100.0 / 1024.0);
Values = read_frequency();
glcd_rect(80, 27, 127, 20, YES, OFF);
if (l == 5){glcd_text57(92, 20, Texto, 1, ON);}
if (l == 6){glcd_text57(86, 20, Texto, 1, ON);}
if (l == 7){glcd_text57(80, 20, Texto, 1, ON);}
Values = read_analog(5) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 37, 127, 30, YES, OFF);
if (l == 6){glcd_text57(92, 30, Texto, 1, ON);}
if (l == 7){glcd_text57(86, 30, Texto, 1, ON);}
if (l == 8){glcd_text57(80, 30, Texto, 1, ON);}
//Values = minutos5;// read_analog(7) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 47, 127, 40, YES, OFF);
if (l == 5){glcd_text57(92, 40, Texto, 1, ON);}
if (l == 6){glcd_text57(86, 40, Texto, 1, ON);}
if (l == 7){glcd_text57(80, 40, Texto, 1, ON);}
p = 1;
}
void Pantalla_2(){
if (p == 1 || p == 0 || p == 3) {
glcd_fillScreen(OFF);
m = menu(2);
}
extern float Values;
extern float read_analog(int a);
extern char Texto[];
Texto = "-------MONITOR-------";
glcd_text57(0, 0, Texto, 1, ON);
Texto = "VCA Linea:";
glcd_text57(0, 10, Texto, 1, ON);
Texto = "Bateria:";
glcd_text57(0, 20, Texto, 1, ON);
Values = read_analog(6) * (260.0 / 1024.0);
glcd_rect(80, 17, 127, 10, YES, OFF);
if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
Values = read_analog(7) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 27, 127, 20, YES, OFF);
if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
p = 2;
}
void Pantalla_3(){
if (p == 1 || p == 0 || p == 2) {
glcd_fillScreen(OFF);
m = menu(3);
}
extern float Values;
extern float read_analog(int a);
extern char Texto[];
Texto = "----CONFIGURACION----";
glcd_text57(0, 0, Texto, 1, ON);
Texto = "Temp.R. Motor:";
glcd_text57(0, 10, Texto, 1, ON);
Texto = "Temp.R. Alt.:";
glcd_text57(0, 20, Texto, 1, ON);
glcd_rect(80, 17, 127, 10, YES, OFF);
if (l == 4){glcd_text57(92, 10, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 10, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 10, Texto, 1, ON);}
Values = read_analog(7) * (5.0 * 100.0 / 1024.0);
glcd_rect(80, 27, 127, 20, YES, OFF);
if (l == 4){glcd_text57(92, 20, Texto, 1, ON);}
if (l == 5){glcd_text57(86, 20, Texto, 1, ON);}
if (l == 6){glcd_text57(80, 20, Texto, 1, ON);}
p = 3;
}
int menu(int p){
//extern char texto[];
if (p == 0){
Texto = "TMP | GRP | MON | -- ";
glcd_rect(0, 54, 127, 63, YES, ON);
glcd_text57(1, 55, Texto, 1, OFF);
Texto = "TMP";
glcd_rect(1, 55, 26, 62, YES, OFF);
glcd_text57(1, 55, Texto, 1, ON);
return(0);
}
if (p == 1){
Texto = "TMP | GRP | MON | -- ";
glcd_rect(0, 54, 127, 63, YES, ON);
glcd_text57(1, 55, Texto, 1, OFF);
Texto = " GRP ";
glcd_rect(28, 55, 62, 62, YES, OFF);
glcd_text57(1, 55, Texto, 1, ON);
return(1);
}
if (p == 2){
Texto = "TMP | GRP | MON | -- ";
glcd_rect(0, 54, 127, 63, YES, ON);
glcd_text57(1, 55, Texto, 1, OFF);
Texto = " MON";
glcd_rect(64, 55, 98, 62, YES, OFF);
glcd_text57(1, 55, Texto, 1, ON);
return(2);
}
if (p == 3){
Texto = "UP | DN | SET | EX ";
glcd_rect(0, 54, 127, 63, YES, ON);
glcd_text57(1, 55, Texto, 1, OFF);
return(3);
}
}
float read_analog(int a) ///ingresar switch
{
float ADC_Value;
if (a == 0){
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
}
if (a == 1){
output_high(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
}
if (a == 2){
output_low(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
}
if (a == 3){
output_high(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
}
if (a == 4){
output_low(PIN_A1);
output_low(PIN_A2);
output_high(PIN_A3);
}
if (a == 5){
output_high(PIN_A1);
output_low(PIN_A2);
output_high(PIN_A3);
}
if (a == 6){
output_low(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
}
if (a == 7){
output_high(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
}
delay_ms(100);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
ADC_Value=read_adc(); //Capturamos señal analógica que entra por el canal previamente seleccionado (RA0)
return(ADC_Value);
}
void iniciar_eeprom(int e){ // funcion para limpiar la eeprom si es la primera vez que se graba el pic
#rom 0x2100={1,2,3,4} //eeprom graba en la posicion 0123 los valores 1234
if (read_eeprom(4) != 1 || e == 1){
write_eeprom(4,1);
write_eeprom(5,0);
write_eeprom(6,0);
}
}
void write_eeprom16(int address1, int address2, int16 value) //escribe sobre la eeprom ints de 16 bits
{
int8 lowerhalf = 0;
int8 upperhalf = 0;
lowerhalf = make8(value,0);
write_eeprom(address1,lowerhalf);
upperhalf = make8(value,1);
write_eeprom(address2,upperhalf);
}
int16 read_eeprom16(int address1, int address2) //lee sobre la eeprom ints de 16 bits
{
int16 finalvalue = 0;
int8 lowerhalf = 0;
int8 upperhalf = 0;
upperhalf = read_eeprom(address2);
lowerhalf = read_eeprom(address1);
finalvalue = make16(upperhalf,lowerhalf);
return finalvalue;
}
//funcion para medir frecuencia:
float read_frequency(){
if(gc_capture_flag == TRUE)
{
//disable_interrupts(GLOBAL);
current_ccp_delta = g32_ccp_delta;;
enable_interrupts(GLOBAL);
frequency = (5000000L / (float)current_ccp_delta);
return(frequency);
gc_capture_flag = FALSE;
}
else
{
return(0.0);
}
delay_ms(500);
}
//////////////Codigo obtenido de ccs forums, para medir frecuencia
#int_timer1
void timer1_isr(void)
{
gc_timer1_extension++;
}
//------------------------------------------------------
////codigo para contar segundos o segun se defina en clocks_per_second obtenido de ccs
#int_timer2
void updateClock()
{
#if CLOCKS_PER_SECOND >= 0x10000
static int32 t;
#elif CLOCKS_PER_SECOND >= 0x100
static int16 t;
#else
static int8 t;
#endif
t++;
if(t >= CLOCKS_PER_SECOND)
{
t = 0;
if (start_hours){minutos5++;}
}
}
//////////// fin de codigo ccs
#int_ccp1
void ccp1_isr(void)
{
char timer_ext_copy;
int32 current_ccp;
static int32 old_ccp = 0;
gc_capture_flag = TRUE;
current_ccp = (int32)CCP_1;
// Get local copy of the timer ext.
timer_ext_copy = gc_timer1_extension;
if(TMR1IF)
{
if(*BytePtr(current_ccp, 1) < 2) // Was CCP captured after Timer1 wrapped?
timer_ext_copy++; // If so, inc the copy of the timer ext.
// Since we know a timer interrupt is pending, let's just
// handle it here and now. That saves a little load off
// the processor.
gc_timer1_extension++; // Increment the real timer extension
TMR1IF = 0; // Then clear the Timer1 interrupt
}
// Insert the timer extension into the proper place in the 32-bit
// CCP value.
// ie., Insert it into location "EE" as follows: 0x00EEnnnn
// (nnnn = the CCP).
*BytePtr(current_ccp, 2) = timer_ext_copy;
g32_ccp_delta = (current_ccp > old_ccp) ? current_ccp - old_ccp : current_ccp + (0x1000000 - old_ccp);
// Save the current ccp value for next time.
old_ccp = current_ccp;
}
///////////fin de codigo ccs para medir frecuencia. Otras cosas se incluyen en MAIN
#int_rb
void test_detect_rb_change() {
set_tris_b(0xF0);
if (input(PIN_B4)) {dbutton4=1;}
if (input(PIN_B5)) {dbutton5=1;}
if (input(PIN_B6)) {dbutton6=1;}
if (input(PIN_B7)) {dbutton7=1;}
if (!input(PIN_B7)) {dbutton7=0;}
}
void clear_delta() {
dbutton4=0;
dbutton5=0;
dbutton6=0;
dbutton7=0;
}
void main(void)
{
clear_delta();
iniciar_eeprom(0);
setup_timer_2(T2_DIV_BY_4,250,5);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
glcd_init(ON); // iniciamos la lcd
glcd_fillScreen(OFF); //LIMPIAMOS LA PANTALLA
delay_ms(200);
welcome();
delay_ms(2000);
glcd_fillScreen(OFF); //LIMPIAMOS LA PANTALLA
setup_adc_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
// setup_timer_1(T1_DISABLED);
//setup_timer_2(T2_DISABLED,0,1);
// setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
////////////codigo para medir frecuencia, depurar de ccs forums
set_timer1(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE);
// Enable interrupts.
clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
clear_interrupt(INT_CCP1);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
/////////////fin para medir frecuencia de ccs
minutos5 = read_eeprom16(5,6); //asigna al intervalo de 5 minutos el ultimo valor que se guardo en la eeprom
set_tris_a(0xEF);
m = menu(0);
while (TRUE)
{
if(dbutton4) {
if (!dbutton7){
if (m != 3){
m = menu(0); dbutton4=0;
}
}
}
if(dbutton5) {
if (m != 3){
m = menu(1); dbutton5=0;
}
}
if(dbutton6) {
if (m != 3){
m = menu(2); dbutton6=0;
}
}
if(dbutton7) {
if (m == 3){m = menu(0);}
if (dbutton4){
m = menu(3);
dbutton4=0;
dbutton7=0;
}
}
delay_ms(500);
if (m == 0){
Pantalla_0();
}
if (m == 1){
Pantalla_1();
}
if (m == 2){
Pantalla_2();
}
if (m == 3){
Pantalla_3();
}
if ((minutos5 - t ) == 5){ /// este if debe estar dentro del rango de refresco de el while superior. debido a que tiene que coincidir con el minuto x (ver diferencia minutos5-m) [graba cada 5 minutos]
write_eeprom16(5,6,minutos5);
delay_ms(1000);
if (read_eeprom16(5,6) != minutos5){
iniciar_eeprom(1);
write_eeprom16(5,6,minutos5);
}
t = minutos5;
}
}
}