TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: D3L05 en 18 de Marzo de 2008, 17:37:19
-
hola, antes que nada perdon si posteo en el foro incorrecto.
tengo la idea de realizar un proyecto que seria un termometro con un LM35 que al variar la temperatura sensada variaria el color de un led RGB, mi consulta es que pic me conviene usar, vi muchos post sobre este tema pero en su mayoria usan un display para mostrar los datos, yo como no lo voy a usar tengo la duda si necesito un pic q tenga ADC incorporado o si podria hacerlo con algun 16f84 o similar, la verdad que soy nuevo en el tema perdon si estoy preguntando cosas sin sentido, espero que alguien me saque la duda, muchas gracias!
-
Hola!
Dado que ese sensor es analogico, forzosamente vas a tener que digitalizarlo para poder mostrar el valor. O usas un PIC con ADC o bien un ADC externo (a mi me gusta mas la primer opcion).
Saludos!
PD: Podrias cambiar el titulo al post, poner algo mas acorde al tema, para que obtengas mas y mejores respuestas.
-
gracias por responder,
si no queda otra lo mejor seria usar por ejemplo un pic 16f877 no?
la idea es minimizar lo mas posible el tamaño del circuito y asi tambien el costo...
ya que estoy molesto un poco mas...aguien me podria orientar con el codigo en asm? el problema no es leer los datos del lm35 sino con esos datos pasarselos a cada pata del led para generar el color q quiero.
gracias de ante mano!!
-
Puedes utilizar un PIC16F88, es mas barato que el PIC16F84 y tiene ADC y I2C.
Un saludo
-
Si lo que queres es un tamaño reducido podes usar un 12F615, es de 8 pines, tiene ADC, SPI, I2C. Saludos.
-
Hola,
despues de mirar muuuuchos ejemplos del foro y otras paginas mas o menos voy encaminado, pero como es mi primer proyecto debe tener miles de errores (y no me debo dar cuenta de casi ninguno)
les adjunto la simulacion en proteus para ver si alguien me puede ayudar.
este es el prog:
#include <18F4520.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC //Internal RC Osc
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=8000000)
#byte PORTB=0xF81
#bit LedRojo = PORTB.0
#bit LedVerde = PORTB.1
#bit LedAzul = PORTB.2
#include "lcd.c"
int8 Rojo,Azul, Ticks;
#int_Timer0
void ActivaLed() {
Ticks++;
if (Ticks==0) {
LedAzul=1;
LedRojo=1;
};
if (Ticks==Rojo)
LedRojo=0;
if (Ticks==Azul)
LedAzul=0;
set_timer0(31);
}
void main() {
int analogico;
int dato_anterior;
lcd_init();
setup_port_a(AN0|VSS_VREF); //Seteamos el puerto analógico
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_adc_ports(AN0_ANALOG);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0( RTCC_8_BIT|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
//setup_timer_2(T2_DIV_BY_16, 127, 1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);
setup_low_volt_detect(FALSE);
setup_oscillator(OSC_8MHZ);
set_tris_b(0);
Rojo=0;
Azul=0;
Ticks=0;
enable_interrupts(INT_TIMER0);
enable_interrupts (GLOBAL);
lcd_gotoxy(1, 2);
lcd_putc("Temp:");
dato_anterior = 0;
analogico = read_adc();
Azul = 255 - analogico*2.5;
Rojo = analogico*2.5;
while (1) {
analogico = read_adc();
lcd_gotoxy(1, 1);
printf (lcd_putc,"R = %u, A = %u \n\r\n\r",Rojo,Azul);
lcd_gotoxy(6, 2);
lcd_putc(" ");
lcd_gotoxy(6, 2);
printf(lcd_putc," %d ºC", analogico); //Mostramos el valor de la temperatura en el LCD
if(analogico != dato_anterior){
Azul = 255 - analogico*2.5;
Rojo = analogico*2.5;
dato_anterior = analogico;
}
};
}
use el PIC18F4520 xq lo hice sobre un programa q baje de la pagina micropic, mi idea seria luego mudarlo a otro pic de menos tamaño.
La idea es q el pic toma la temperatura entregada por el LM35 (en una escala de 0 a 100 Cº) y la multiplica por 2.5 para obtener los valores para el color azul y el color rojo asi ir variando de azul a rojo a medida q sube la temperatura.
el primer problema q tengo en la simulacion es el dato q me muestra el LM35 y el dato q se lee el LM35 simulado en otra aplicacion anda bien en esta no se porque tiene un defasaje.
y otro problema es el flikeo q hacen los leds y el lcd, supongo q tendre algun problema con el clock del pic o con el timer en el prog, la verdad q no entiendo mucho, si alguien me podria dar una mano se lo agradeceria.
muchas gracias de ante mano!
German.
-
He solucionado varios de mis problemas, ahora estoy usando un PIC12F675
este es el prog:
#include <12F675.h>
#device adc=10 // Resolución 10 BITS
#fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=20000000) // Oscilador a 20 Mhz
#define LR pin_a4
#define LA pin_a5
float adc=0x00;
float grados=0;
float anterior=0;
int8 R,A,T;
#INT_AD
void AD_isr()
{
set_adc_channel(0);
delay_ms(1);
adc=Read_ADC(ADC_READ_ONLY);
delay_ms(1);
Read_ADC(ADC_START_ONLY); //inicia nueva conversion.
}
#int_Timer0
void ActivaLed() {
T++;
if (T==0) {
output_high(LA);
output_high(LR);
};
if (T==R)
output_low(LR);
if (T==A)
output_low(LA);
set_timer0(31);
}
void asigna(void){
if(grados != anterior){
R = grados*2.5;
A = 255-R;
anterior = grados;
}
}
void visualiza(void){
disable_interrupts(int_ad);
grados = (float) ((adc * 5000) / 1023 );
grados = grados /10;
asigna();
enable_interrupts(int_ad);
}
void main()
{
T=0;
R=0;
A=0;
set_tris_a( 0b11001111 ); // GP4, GP5 salidas
output_high( PIN_A5 );
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_ANALOG);
setup_timer_0( RTCC_8_BIT|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);
enable_interrupts(int_ad);
enable_interrupts(INT_TIMER0);
enable_interrupts(global);
Read_ADC(ADC_START_ONLY); // Inicia el CAD por int.
do {
visualiza();
} while (TRUE);
}
y adjunto la simulacion.
lo que noto q en la simulacion es muy lento el pestaneo de los leds no se si esto sera asi una vez montado en el pic, estoy usando un clock de 20Mhz, por favor si alguien me puede dar una mano, muchas gracias...