Antes de citar tu post, queria decirte que si tu pic anda, pero no como tu esperas, gralmente suele ser un problema de "software" , no de hardware o del programador que utilices.
Escrito originalmente por RxTx
Buenas tardes a todos.
Soy nuevo en esto de programar pics y estoy teniendo un problema con el programa que estoy haciendo.
Para empezar los delay de 5 segundos que estoy usando me lo hace pero no durante 5 segundos sino unos 20 o asi y si les pongo un retardo menor no me hace nada de nada, ¿por que puede ser?
Ya veremos cuando analicemos mejor el código, seguramente es algun bug en la rutina de delay del compilador ccs o en tu código.
Cita:
¿Cuanto tarda en hacer la conversion A/D el pic?
Pues, depende del dispositivo y del clock que uses, pero a 20Mhz, puede tardar 1.6 a 2 useg. (aunque debes tener en cuenta el sampling time cuando pasas de canal el conversor.
Cita:
Otra cuestión, como veis en el código uso las entradas analogicas A0 y A1 y el resto A2...A5 las configuro como salidas digitales, ¿se puede hacer esto o habría algun problema?
No, no debiera haber problema con esto.
Cita:
Codigo:
#include <16F876A.h>
#device adc=10
#fuses XT,NOPROTECT,NOPUT,NOWDT,NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=8000000)
Aca hay una incongruencia, si utilizas un XTAL de 8Mhz, debes setear el oscilador como HS.
Cita:
Codigo:
void analog(int fun, float &pri, float &sec)
{
long valor;
set_adc_channel (0);
valor = read_adc();
pri= valor*(5.0/1024.0);
if(fun=1){
pri= valor*(5.0/1024.0);
set_adc_channel (1);
valor = read_adc();
sec= valor*(5.0/1024.0);
}
}
las rutinas de multiplicacion de coma flotante le llevan al microcontrolador muuuuuchos ciclos para llevarse a cabo... debes plantearte si realmente necesitas utilizar variables float. Yo creo que para lo que haces no son necesarias. Tranquilamente podrias comparar con 512 si quisieras, en vez de hacerlo con 2.5
Otro tema, fijate el
if (fun=1), realmente quieres hacer una asignacion a fun en 1? o estas chequeando? si estas chequeando en C se usa ==
Cita:
Codigo:
void main( void )
{
float aux1;
float aux2;
int aux;
set_tris_a(0x03);
set_tris_b(0xFC);
setup_adc_ports(RA0_ANALOG);
setup_adc (ADC_CLOCK_INTERNAL);
aux=1;
aux1=0;
aux2=0;
while(1){
delay_ms(5000);
analog(aux,aux2,aux1);
if(aux2>=2.5){
output_high(PIN_B0);
}
if(aux1>=2.5){
output_high(PIN_B1);
}
delay_ms(5000);
output_low(PIN_B0);
output_low(PIN_B1);
}
}
Fijate, tu hablas de utilizar el CH0 y CH1 pero solo seteas el canal analogo 0!
Otro tema, fijate si no me equivoco, la funcion delay_ms, recibe argumentos de 0 a 255, y tu le estas mandando 5000! no se cual valor tome el compilador pero no hará lo que tu deseas con seguridad, entonces seguramente está oscilando muy velozmente y a ti te parecec que está fijo.
Espero haberte ayudado.