Autor Tema: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador  (Leído 6467 veces)

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

Desconectado danipic19

  • PIC10
  • *
  • Mensajes: 15
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #15 en: 14 de Enero de 2010, 16:22:23 »
Punto 2 resuelto!!!

Ahora falta el punto 3 que en teoria es el más fàcil, pero la pregunta es:

Si el programa se ejecutará, por ejemplo, cada 2 segundos, cuánto tarda en ejecutarse el código? Es decir, que el programa no se ejecuta hasta que salta la interrupción, pero cuánto tarda en ejecutarse el código después de la instrucción? Supongo que será del orden de microsegundos o algún milisegundo, no?
« Última modificación: 14 de Enero de 2010, 19:35:15 por danipic19 »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #16 en: 14 de Enero de 2010, 21:46:38 »
En el foro hay un articulo sobre el modulo analógico (Usa el buscador) para que lo leas detalladamente, así te darás cuenta que 10us no es correcto, por ejemplo y entenderás que estas haciendo. También es necesario que le des una leída en general al datasheet del PIC para tener una idea global, como para identificar un fuse XT o HS, ect.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #17 en: 14 de Enero de 2010, 23:14:38 »
He aqui el modulo conversor A/D de los 16F87X/PIC18F2455/2550/4455/4550, no tiene pierde.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado danipic19

  • PIC10
  • *
  • Mensajes: 15
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #18 en: 15 de Enero de 2010, 07:05:38 »
Suky,

He buscado muchas veces en el buscador y no lo había encontrado, está muy bien explicado.

Por qué pones ""setup_adc(ADC_OFF);"" al finalizar la lectura? En mi programa debo usar 3 ADCs y leer contínuamente, por lo que no tengo que poner "setup_adc(ADC_OFF);", no? Y la lectura le tengo que poner dentro del "while(1){", no?

Ahora mismo tengo el ultimo código que he colgado y funcionan correctamente.

Mi problema ahora es la interrupción. Lo de que la he programado a 10ms es correcto, ya que:

T(timer0)=4*(1/Fosc)*PREESCALER*(256-PRECARGA)
Donde 256=valor máximo que se puede representar con los 8 bits del timer0.
Entonces:
0,010=4*(1/20e6)*256*(256-61)
Así que
PREESCALER=256
PRECARGA=61
Y la interrupción la obtengo cada 10ms (COMPROBADO CON OSCILOSCOPIO).

El problema que tengo es que cuando pongo el contador como dice jhozate el tiempo que quiero no es correcto:

#int_timer0
void timer0_isr()
{
i++;
if(i==2) // verificas si ya pasaron dos interrupciones de 50mS
  {
  ....aqui lo q quieres hacer
  }
set_timer(cargar_del_timer);

}

Si pongo un contador que llegue hasta 200, en teoría 200*0.010s = 2 segundos, y calculado en plan chapucero este tiempo con un cronómetro (calculando la media) obtengo un tiempo de 2,468 aproximadamente. Me sobran 0.468 segundos que no sé si es el tiempo que tarda el PIC en hacer la comparación del contador, pero creo que esto es una bestialidad!

A continuación pongo el código del programa para la interrupción cada 2 segundos, y lo único que debe hacer es cambiar el estado del puerto B cuando el contador llega a 200. Qué hago mal?

#include <16f877.h>

#fuses NOPROTECT,HS,NOCPD,NOLVP,NOWDT,PUT //Configuracion de timers, reloj, proteccion de datos...


#use fast_io (A) //Input y output sin reprogramar los pines, como lo haria el #use standard_io
#use fast_io (B)
#use delay(clock=20000000) //Reloj de 4MHz
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)

byte puerto_b;
int comptador;

#int_rtcc //rutina que até a interrupció

void timer0_interrupcion()
{
comptador++;

if(comptador==200)
{
   puerto_b=~puerto_b;
   output_b(puerto_b);
   set_RTCC(61);
   comptador=0;
}
}

void main()
{
set_tris_b(0x00);
puerto_b=0x00;
output_b(puerto_b);

setup_counters (RTCC_INTERNAL, RTCC_DIV_256); //programació timer0
set_RTCC(61);
enable_interrupts(INT_RTCC); // Habilita interrupcion timer0.
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.
comptador=0;

while(1)
{
}
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #19 en: 15 de Enero de 2010, 08:53:44 »
En el ejemplo dice que se toma un valor y se apaga el conversor, como tu necesitas tomar continuamente no debes apagarlo. Y si, las conversiones deben ir dentro del  while para que se cumpla lo que necesitas, una captura continua...

Respecto a que haces mal con la temporización, pues la actualización del timer, no debe ser solo cuando es 200 sino siempre y para una mayor precisión debe ser la primer tarea al ingresar a la interrupción.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado danipic19

  • PIC10
  • *
  • Mensajes: 15
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #20 en: 15 de Enero de 2010, 11:36:03 »
Ya me funciona la interrupción perfectamente gracias al último comentario de Suky, bueno, gracias a todos los comentarios!

Gracias Suky y jhozate por la ayuda que me habéis ofrecido. Si os pudiera ofrecer algo a cambio lo haría sin duda.

Ahora sólo me queda crear el código de todo el conjunto, y probarlo en el sistema de dpósitos de agua real.

Adjunto el código para la generación de una interrupción cada 2 segundos por si alguien lo necesita. El programa lo único que hace es cambiar el estado del port_b cada 2 segundos. Si quieres más o menos segundos solo hay que cambiar la variable contador, teniendo en cuenta que como máximo se puedo poner "contador=255" ya que contador es una variable int. Si se necesita más tiempo supongo que con cambiar int por byte o añadir otro contador es suficiente.

PD: no os fijéis mucho en los comentarios del código.

Gracias a todos por la ayuda!!!


#include <16f877.h>

#fuses NOPROTECT,HS,NOCPD,NOLVP,NOWDT,PUT //Configuracion de timers, reloj, proteccion de datos...


#use fast_io (A) //Input y output sin reprogramar los pines, como lo haria el #use standard_io
#use fast_io (B)
#use delay(clock=20000000) //Reloj de 4MHz
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)

int8 puerto_b;
int comptador;

#int_rtcc //rutina que até a interrupció

void timer0_interrupcion()
{
set_RTCC(61);
comptador++;

if(comptador==200)
{
   puerto_b=~puerto_b;
   output_b(puerto_b);
   comptador=0x00;
}
}

void main()
{
set_tris_b(0x00);
puerto_b=0x00;
output_b(puerto_b);

setup_counters (RTCC_INTERNAL, RTCC_DIV_256); //programació timer0
set_RTCC(61);
enable_interrupts(INT_RTCC); // Habilita interrupcion timer0.
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.
comptador=0x00;

while(1)
{
}
}

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #21 en: 15 de Enero de 2010, 12:00:30 »
 :-/ q bueno q lo hayas resuelto, q pasó con lo del control?..ojala q puedas presentar el proyecto en el foro.
Saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado danipic19

  • PIC10
  • *
  • Mensajes: 15
Re: Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #22 en: 18 de Enero de 2010, 20:00:53 »
jhozate, de momento no me funciona todo el conjunto del programa.

Déjame que esta semana realice pruebas con el sistema completo y a ver si consigo que funcione.

En cuanto tenga algo colgará todo el programa.

Gracias por todo a todos los que me habéis ayudado.

Un saludo!

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Sobre entradas analogicas
« Respuesta #23 en: 11 de Marzo de 2016, 10:20:33 »
El compilador me acmite
 SETUP_ADC_PORTS(ra0_analog);//valido
setup_adc_ports(AN0_AN1_AN3);

pero porque no me acmite solo esto?
setup_adc_ports(aN3);



Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #24 en: 11 de Marzo de 2016, 10:36:05 »
Solo necesito una entrada analogica y me da mucho trabajo cambiar a AN0
ra0 y ra1 ya estan muy ocupadas como salidas digitales

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #25 en: 11 de Marzo de 2016, 13:40:17 »
Citar
pero porque no me aDmite solo esto?
setup_adc_ports(aN3);

La respuesta a esa pregunta esta en el datasheet del micro, Y es lo PRIMERO que deberias ver. No es simplemente "probar" en el compilador.
Lamentablemente la unica opcion es esa para los canales del ADC, no hay otra forma de configurarlo, se comienza desde A0 en adelante. es decir AN0,AN1 o AN0,AN1,AN2 ... etc en ese micro.
(Pagina 112)

Veo 3 soluciones:

- Tratar de conseguir otra fuente de un valor aleatorio para darle a la semilla, Supongamos amplificar el ruido y leer repetidamente una señal digital ¿?
- Cambiar los pines que tenes como digitales y dejar solo A0 para ese canal analogico
- Como imagino que tenes 89578914908190 microcontroladores conectados entre uno y otros (sarcasmo). Podrias usar el ADC de otro u otroS PICs para que te envien los datos a ese y asi obtener la semilla.

Citar
Solo necesito una entrada analogica y me da mucho trabajo cambiar a AN0
ra0 y ra1 ya estan muy ocupadas como salidas digitales

A no ser que tengas realizadas las plaquetas lo cual por el estado del proyecto no deberias tener las plaquetas en su forma final, es simplemente cambiar 2 cablecitos o cortar 2 caminos y soldar dos cables.
En el programa simplemente usar el Reemplazar (usualmente en el menu Edit, y casi siempre el segundo al lado de archivo) y reemplaza todos los PIN_A0 por PIN_A3, y con eso finalizaste cambiando todos tus pines.
« Última modificación: 11 de Marzo de 2016, 13:46:40 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #26 en: 12 de Marzo de 2016, 07:40:23 »
Pues valla lata empezar con A0 es empezar de 0 muchas cosas
enviar los datos desde el micro nº 100 (sin exagerar tanto) Eso si que No, otra comunicacion serie no estas son las que mas realentizan todo el proceso.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #27 en: 12 de Marzo de 2016, 13:45:11 »
Pues valla lata empezar con A0 es empezar de 0 muchas cosas
enviar los datos desde el micro nº 100 (sin exagerar tanto) Eso si que No, otra comunicacion serie no estas son las que mas realentizan todo el proceso.


Es una counicacion que lo haces 1 sola ves cuando encendes la maquina, y nunca mas. No se que ves como para que te lo ralentize. Tendras que esperar 1ms mas cuando comienza. Seguro que tenes delays que demoran mucho mas de lo que va a durar esa comunicacion, encima 1 sola ves.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda Programación ADCs del PIC16F877-20/P + interrupción + integrador
« Respuesta #28 en: 23 de Marzo de 2016, 07:46:56 »
Si seria valido pasarselo como las opciones iniciales
Código: [Seleccionar]
1 sola ves Pero los 3 Master tienen las A0 - A3 Ocupadas. De todas tengo un sub-proyecto aparte y veo que funciona, concluido.


 

anything