Autor Tema: Mi contador actual 16f877, lcd, rs232. (será útil a alguien ?? )  (Leído 3742 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aghor

  • PIC10
  • *
  • Mensajes: 19
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.

Código: [Seleccionar]
#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...
 :mrgreen:

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Mi contador actual 16f877, lcd, rs232. (será útil a alguien ?? )
« Respuesta #1 en: 23 de Agosto de 2006, 02:27:47 »
Enhorabuena por conseguirlo y gracias por compartirlo, aghor.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mi contador actual 16f877, lcd, rs232. (será útil a alguien ?? )
« Respuesta #2 en: 23 de Agosto de 2006, 05:40:35 »
Mis felicitaciones amigo aghor y gracias por compartir.

Y si, me reconozco en esa RTCC y no se si en el ADC tambien ... ja ja ja  :D  :D  :D

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania


 

anything