Hola amigos !!!
Si antes escribí solo para pedir ayuda o porque no entendia algo, hoy intento hacer mi humilde primer aporte ya que como yo, siempre hay alguien que necesita una manito.
Este modelo funciona, de hecho lo tengo funcionando, lo que no implica que esté libre de errores o detalles.
Agradeceria cualquier alcance o recomendacion para seguir aprendiendo.
Pego codigo y adjunto codigo y simulacion de proteus.
#include <16f877a.h> // Selecciona el PIC
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#fuses XT,NOWDT,NOLVP,NOPROTECT,NOPUT,NOBROWNOUT // Opciones de configuración
#use standard_io(c)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //manejo del RS232
#define use_portb_lcd TRUE //definir portb lcd
#include <lcd.c> //libreria manejo lcd
////////////////////////////////////////////////////////////////////////
#define led_contador PIN_D7
#define led_adc PIN_D5
////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES
int const RTCCxS=15; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.
int nRTCC=0; // Contador de interrupciones RTCC completas
int segundo=0; // Segundos del Reloj
long int minuto=0; // Minutos del Reloj
long int tiempo=0;
float adc_presion=0;
int presion=0;
long int i=0;
int msec=0;
char b=0b11001000;
//////////////////////////////////////////////////////////////////////
#int_RTCC // Interrupción por desbordamiento
RTCC_isr() { // del TIMER0 RTCC
if(++nRTCC==RTCCxS){
nRTCC=0x00;
++tiempo;
if(++segundo>59){
segundo=0;
++minuto;
}
}
}
////////////////////////////////////////////////////////////////////////
void lee_adc(void){ // Lectura del canal 1 -> AN1 LM35a
set_adc_channel(1);
output_low(led_adc);
adc_presion=read_adc();
presion = (int) ((adc_presion * 391) / 1000);
delay_ms(100);
output_high(led_adc);
}
/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void main(void) {
int ksegundo=0x00;
lcd_init(); //inicializa lcd
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); // TIMER0: Clock Interno y Preescaler
set_tris_a(0b001010);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(5);
enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC
enable_interrupts(global); // Habilito Interrupciones
lcd_gotoxy(1,1);
printf(lcd_putc," Buenos Dias :) ");
printf(lcd_putc,"\nContador v.3.2%c",b);
set_tris_c(0b10000000);
do{ // Bucle infinito
if(!input(PIN_D4)){ //¿se ha pulsado el boton?
delay_ms(400); //SI -> retardo para evitar los rebotes, calibrar para contacto
if(input(PIN_D4)){ //¿se ha soltado el boton?
if(segundo!=ksegundo){ // si cambia el segundo actualizo
ksegundo=segundo;}
i++;
lee_adc(); // Sensa presion!!
printf(lcd_putc,"\f"); //...para borrar pantalla e iniciar contador
printf(lcd_putc,"\nTemperatura:%u C",presion);
lcd_gotoxy(2,1);
printf(lcd_putc,"N:%lu",i);
lcd_gotoxy(9,1);
// Necesito mostrar las decimas de segundo, como nRTCC va de 0-14, puedo encontrar
// una relacion entre 0-9 y nRTCC. Lo que seria: 9:14=k, donde k es el factor para
// compensar esa diferencia. k=0,643 y luego definir una nueva variable,
// milisegundos=0,643*nRTCC
if (i==1){
msec=0 ;
segundo=0;
minuto=0;
printf(lcd_putc,"%lu:%u.%1us",minuto,segundo,msec); //muestra por pantalla el numero
output_low(led_contador);
Printf("\f%lu,%lu,%u.%u,%u",i,minuto,segundo,msec,presion); //imprime rs232
nRTCC=0;
}
else{
msec= (int) (0.643*nRTCC);
printf(lcd_putc,"%lu:%u.%1us",minuto,segundo,msec); //muestra por pantalla el numero
output_toggle(led_contador);
Printf("\f%lu,%lu,%u.%u,%u",i,minuto,segundo,msec,presion); //imprime rs232
minuto=0;
segundo=0;
nRTCC=0;
}
}
}
}While(TRUE);
}
La idea basica y final es la siguiente: Contar eventos, indicar el tiempo transcurrido entre cada evento ( del orden de segundos por lo que la presicion del reloj es menos exigente que para otra aplicacion, sobre cada evento sensar la presion, para ello pronto dispondré de un transductor de presion (obvio
pero por ahora uso un lm35. Luego comunico cada evento al puerto serie de un pc mediante enlace rs485-rs232. Y a graficar!!!!
Nota: Existen variables de mas, porque debo calcular duracion de la jornada de trabajo.
Agradecimientos a:
Ustedes notaran los trozos de codigo "prestados" de vuestros trabajos jejejejeje...