Autor Tema: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876  (Leído 3882 veces)

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #15 en: 09 de Junio de 2011, 03:41:06 »
es parecido a la interrupcion por timer0

pones stup_timer1()//aca configuras para que dure exactamente 1 segundo.(si quieres dime que oscilador usas y te ayudo con la configuracion)

y activas la interrupcion

enable_interrupts(int_timer1);

y creas la funcion

#int_timer1
void int_t1()
{

//aca puedes activar una bandera para que en cuanto regrese al main haga la actualizacion de datos, ya que lo ideal es no hacer muchas operaciones dentro de la interrupcion
}


una duda, usas un cristal interno o uno externo?
"Nada es imposible, no si puedes imaginarlo"

Desconectado alanitotkd

  • PIC10
  • *
  • Mensajes: 20
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #16 en: 09 de Junio de 2011, 03:43:02 »
es con un cristal de 4 Mhz eso es lo ke me pides ?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #17 en: 09 de Junio de 2011, 03:53:21 »
si, eso.

puedes configurarlo asi;

setup_timer1(t1_internal|t1_div_by_8);

con esto el timer se generara una interrupcion cada 524ms pero si le das un valor inicial al timer de 3036, entonces tendras una interrupcion cada 500 ms.


entonces cada interrupcion harias esto:


#int_timer1
void int_t1()
{
set_timer1(3036);//con esto incializa el timer para que te vuelva a generar la interrupcion en medio segundo.
//si quieres puedes dejarlo cada medio segundo, es decir, 2 muestras por segundo, o poner un contador, y que cada 2 interrupciones se active una bandera para actualizar los datos


}


espero te sirva.

"Nada es imposible, no si puedes imaginarlo"

Desconectado alanitotkd

  • PIC10
  • *
  • Mensajes: 20
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #18 en: 09 de Junio de 2011, 04:06:21 »
hola como doy lata con eso ... pero sii me estoy quemando los ojos para que salga... podrias ver mi codigo es que la salia PWM no sale como deberia...

haber si habilite bn el timer 1



#include "FINAL_UC1.h"
#include <LCD.c>
#byte portc = 0x07

//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07


#define MULT1 PIN_C1
#define MULT2 PIN_C3
//#use standard_io (C)

int16 time,lm35,retardo=250;
int8 data,unidad,decena;
//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;
int8 bcd();
void ds1307(void);
void multiplex(void);
int1 flag,flag2;

#int_timer0
void mux()
{
if(flag)//si vas a prender el display 1
{
     output_low(MULT2);  //apagas el display 2
     portc=decena*16; //sacas el valor para el display 1
    output_high(MULT1); //prendes el display 1
    flag=false;
}
else
{
    output_low(MULT1); // apagas el display 1
    portc=unidad*16;   //sacas el valor para el display 2
    output_high(MULT2); //prendes el display 2
    flag=true;
}
}



#int_timer1
void int_t1()
{
if(flag2)
flag2=false;
else
flag2 = true;
set_timer1(3036);//con esto incializa el timer para que te vuelva a generar la interrupcion en medio segundo.
//si quieres puedes dejarlo cada medio segundo, es decir, 2 muestras por segundo, o poner un contador, y que cada 2 interrupciones se active una bandera para actualizar los datos


}
void main()
{
   set_tris_c(0x00);
   SETUP_ADC_PORTS(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   
   setup_timer_1(t1_internal|t1_div_by_8);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_2(T2_DIV_BY_4,249,1);    // Timer2 a ikhz
   setup_ccp1(CCP_PWM);
   enable_interrupts(int_timer0);
   enable_interrupts(int_timer1);
   enable_interrupts(global);

   set_adc_channel(0);
   
   seconds= 0x00;
   minutes= 0x30;
   hours = 0x17; //modo 24 hrs
   day = 0x04; //1 es domingo
   date = 0x08;
   month = 0x06;
   year = 0x11;
   control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada
   
   delay_ms(retardo); //Usuario lee
   //Establece fecha y hora
   i2c_start(); //Inicia I2C
   i2c_write(0xd0); //Direcciona DS1307 write
   i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
   //Aquí establece fecha y hora respecto a la puesta arriba
   i2c_write(seconds);
   i2c_write(minutes);
   i2c_write(hours);
   i2c_write(day);
   i2c_write(date);
   i2c_write(month);
   i2c_write(year);
   i2c_write(control);
   i2c_stop(); //Ya puso la hora y fecha
   //El RTC ya está marcando el tiempo y fecha

//Rutina LCD
 lcd_init();
 lcd_putc("\f"); //Limpia LCD
 lcd_putc("Temp: \n");
 lcd_gotoxy(13,1);
 lcd_putc("oC");

   while(TRUE)
   {
   time = read_adc();
   time*=0.9775;
   printf("%Ld",time);
   lm35 = time/10.23;
   data = lm35;
   data=bcd();
   set_pwm1_duty(time);
   set_timer2(0);
   delay_ms(200);
   
   while(flag2)
   {
   delay_ms(retardo); //Usuario lee
   i2c_start(); //Inicia I2C
   i2c_write(0xd0); //Direcciona DS1307 write
   i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
   i2c_stop();

   i2c_start();
   i2c_write(0xd1); //Lee DS1307
   seconds = i2c_read();
   minutes = i2c_read();
   hours = i2c_read();
   day = i2c_read();
   date = i2c_read();
   month = i2c_read();
   year = i2c_read(0); 
   i2c_stop();
   }

   lcd_gotoxy(7,1);
   printf(lcd_putc,"%Lu",lm35); //xxx.x °C
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%2x-%2x-20%2x %2x:%2x:",date,month,year,hours,minutes); //xxx.x °C
   
   }

}


int bcd()

    unidad = data%10;
    decena = data/10;
}

Desconectado alanitotkd

  • PIC10
  • *
  • Mensajes: 20
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #19 en: 09 de Junio de 2011, 04:11:06 »
te adjunto unas capturas de mi simulacion para que lo veas ...

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USO DE ADC_PWM_LCD_I2C_RS232_DISPLAY'S 7 SEGMENTOS CON 16F876
« Respuesta #20 en: 09 de Junio de 2011, 04:15:52 »
dentro de la int del timer 1 haz esto:
int1 update=0
int cont=0
#int_timer1
void t1()
{
  cont++;
  set_timer1(3036);
  if(cont==2)// con esto se activara la bandera cada segundo, osea, cada 2 interrupciones
  {
   update=1;
   cont=0;
  }
}

y cuando regreses al main

while(true)
{
....

if(update)
{
   update=0;//desactivas la bandera
  //actualizas
}



}


despues de poner el valor al pwm pon esta instruccion:

set_timer2(0);// si no la pones a veces la simulacion no funciona bien, pero en hardware si

si con eso no queda tambien imprime el valor que metes al pwm y checa si esta variando, talvez sea tu ADC.


me voy a dormir, ya son las 2 am aca, mañana checo si te quedo
"Nada es imposible, no si puedes imaginarlo"


 

anything