TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PabloFiscella en 13 de Mayo de 2004, 11:27:00
-
Hola a todos:
Estoy haciendo un polimetro multiplexado con leds que testean 5 sondas y funciona perfecto con las primeras 4 pero no con la ultima.
Probe el programa para que solo funcione con AD0 luego con la 1, pero cuando pruebo la entrada A4 me marca cualquier cosa.
Tiene idea si es algo diferente para la entrada A4.
Les muestro el codigo y si lo necesitan les mando el diseño en el proteus.
La variable pos en en procedimento Conversion_Ad() es la que selecciona la sonda.
Saludos y gracias.
Pablo
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
byte const sensor[] = {0b00011110,0b00011101,0b00011011,0b00010111,0b00001111};
byte const ledB[] = {0b00000000,0b00000000,0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0b00111111,0b01111111,0b11111111};
float value=0;
float cant=0;
int pos=0, int_count=0;
#int_rtcc // This function is called every time
clock_isr() { // the RTCC (timer0) overflows (255->0).
if(int_count++==10) { // per milisecond.
int_count=0;
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
output_c(sensor[pos]);
if(cant <= 0.5){
output_bit( PIN_D0, 0);
output_bit( PIN_D1, 0);
output_b(ledB[0]);
}else if((cant > 0.5) && (cant <= 1)){
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 0);
output_b(ledB[0]);
} else if((cant > 1) && (cant <= 1.5)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[1]);
} else if((cant > 1.5) && (cant <= 2)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[2]);
} else if((cant > 2) && (cant <= 2.5)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[3]);
} else if((cant > 2.5) && (cant <= 3)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[4]);
} else if((cant > 3) && (cant <= 3.5)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[5]);
} else if((cant > 3.5) && (cant <= 4)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[6]);
} else if((cant > 4) && (cant <= 4.5)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[7]);
} else if((cant > 4.5) && (cant <= 5)) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[8]);
} else if(cant > 5) {
output_bit( PIN_D0, 1);
output_bit( PIN_D1, 1);
output_b(ledB[9]);
}
}
}
#INT_AD
Conversion_Ad()
{
set_adc_channel(pos);
cant = (read_adc(ADC_READ_ONLY) * 0.0048828125)*5;
delay_ms(100);
pos = 4; // NUMERO DE SONDA
read_adc(ADC_START_ONLY);
}
void main(void) {
int valor;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports( ALL_ANALOG );
enable_interrupts(global);
enable_interrupts(INT_AD);
read_adc(ADC_START_ONLY);
set_adc_channel(0);
set_timer0(56);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_tris_a(0xFF);
set_tris_b(0b00000000);
set_tris_c(0b10000000);
set_tris_d(0b00000000);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
while(true) {
}
}
-
Que PIC es el que utilizas??
No esta en el codigo...
-
Si se me paso esa linea
Es el 16F874 que tiene 8 entradas Analogicas
-
Podrías explicar como funciona " un polimetro multiplexado con leds que testean 5 sondas ".
Sería conveniente que dejases el fuente y el dibujo con PROTEUS para que se pueda simular y se intente ver que pasa con A4.
-
Pero en el programa siempre interrogas el puerto 4 solo??
Porque no subes la simulacion al foro??
-
Como cuelgo los archivos para que los veas?
Esto sensa 5 voltages que provienen de un motor. Tiene 5 sondas que estan conectadas desde A0 a A4.
Como puden ser voltages de hasta 15v puse un divisor por resistencias que seguramente esta mal pero por ahora funciona.
Estos divisores dividen el voltage de entrada 5 veces.
Por medio de codigo vuelvo a multiplicarlo antes de mostrar el resultado.
Cada sonda esta representada por una fila de 10Leds cada una.
la variable sonda hace que se encienda una sonda por ves mandando masa solo a una a la ves.
Eso lo hace por el puerto C0 a c4
y los 10 leds se encienden con el puerto D0 y D1 los dos primeros y los otros 8 con el puerto b
Espero que me hallan entendido.
Saludos.
Pablo
-
El codigo ahora esta en 4 porque es con el que tenia problemas.
Pero el codigo original va cambiando del 0 a 4 y vuelve a empezar.
-
Ponlos aquí: http://miarroba.com/foros/ver.php?foroid=256746
-
Lo puse donde me indicaste.
Ahora acabo de probar el pueto A5 y el programa funciona perfecto.
Definitivamente es el A4, no entiendo nada.
Gracias.
Pablo
-
No estoy puesto en el tema pero en el diagrama de pines de la hoja de características RA4 no parece constar como entrada analógica,correspondiendo AN4 al pin RA5.Corríjanme si me equivoco.
Saludos
-
Hola, no RA4 no es una entrada analogica, es I/O digita de colector abierto y la entrada del TMR0, la entrada digital AN4 esta en el pin RA5, ese el el problema, RTFM.
saludos
Ariel
-
Pués sí viendo el dibujo ya es otra cosa (la memoria es mala consejera), fíjate que en el PIN 6 tienes dibujado RA4/T0CKI y no aparece ningún AN4. El AN4 está en el PIN 7
-
Error visual. Tienen razon. Muchas gracias a todos.
Saludos
Pablo