Autor Tema: Duda con temporización de interrupciones  (Leído 2381 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Duda con temporización de interrupciones
« en: 17 de Agosto de 2004, 11:51:00 »
Hola

Cuando yo manejo la temporización sin el uso de bucles sucede que tengo que estar reseteando el PIC muy seguido para poder observar la señal pero si no uso bucles la señal puede permanecer visible por mas tiempo despues de resetear el PIC.
A qué se podrá deber que esto me esté sucediendo, de antemano muchas gracias por despejar mi duda.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Duda con temporización de interrupciones
« Respuesta #1 en: 17 de Agosto de 2004, 11:59:00 »
Hola, la verdad es que no he entendido muy bien tu problema

Por que reseteas el PIC? puedes poner algo de codigo para que podamos hecharle un vistazo?

Seguro que lo sacamos
- T0ni0 -
30RCF112

Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: Duda con temporización de interrupciones
« Respuesta #2 en: 17 de Agosto de 2004, 12:17:00 »

Si, yo tampoco entiendo lo que planteas. Tómate un poco más de tiempo y explica un poco más en detalle para ve si podemos ayudarte.

Saludos,

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Duda con temporización de interrupciones
« Respuesta #3 en: 17 de Agosto de 2004, 12:44:00 »
Hola

Pues esto es lo que hago para llamar a una función cada 2 ms, por lo que cada pasada por el bucle la pongo en 1 ms.
Codigo:

#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#define INICIO 2
byte conteo_alto;

#INT_RTCC
pulso()
{
if(--conteo_alto==0)
   {
      output_high(PIN_B7);
      delay_us(1000);
      output_low(PIN_B7);
      conteo_alto=INICIO;
   }
set_rtcc(178);
}

main()
   {
      set_tris_b(0x00);
      conteo_alto=INICIO;
      set_rtcc(178);
      setup_counters(RTCC_INTERNAL,RTCC_DIV_64);
      enable_interrupts(INT_RTCC);
      enable_interrupts(GLOBAL);
      while(TRUE);
   }


Supuestamente y segun yo pues el programa tiene que estar corriendo siempre pero resulta que cuando lo alimento tengo que resetear el PIC para que comience y se ejecuta pero como dos o tres veces y lo tengo que volver a resetear. Es por esto que tengo mi duda acerca del porqué está pasando esto. Gracias

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Duda con temporización de interrupciones
« Respuesta #4 en: 17 de Agosto de 2004, 13:41:00 »
Haber lo he probado con un 16F876, aunque eso es lo de menos, primero he quitado la instrucción del tris por que me activaba todo el puerto, he puesto la salida a RB1 ( tu tenías RB7), he cambiado el retardo por milisegundos para verlo en un LED y he añadido un retardo antes de activar el LED.

Todo funcionando correctamente, aquí va:


#include <16f876.h>

#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use delay(clock=20000000)

#define INICIO 2

byte conteo_alto;



#INT_RTCC

pulso()

{

if(--conteo_alto==0)

   {
      delay_ms(1000);      //retardo adicional
     
      output_high(PIN_B1);

      delay_ms(1000);      // estan en milisegundos

      output_low(PIN_B1);

      conteo_alto=INICIO;

   }

set_rtcc(178);

}



main()

   {

//      set_tris_b(0x00);

      conteo_alto=INICIO;

      set_rtcc(178);

      setup_counters(RTCC_INTERNAL,RTCC_DIV_64);

      enable_interrupts(INT_RTCC);

      enable_interrupts(GLOBAL);

      while(TRUE);

   }


Tal como está el codigo el LED va ha estar 178 ciclos apagada más que encendida con un cristal de 20MHz es aprox 2"2 usegundos


Si quieres hacer una aplicación con estos valores (antes tenias un retardo de 1000 usegundos ) Tal vez nos tendrías que explicar más concretamente que pretendes hacer, puedo intuir que una base de tiempo de 500Hz o parecido?

Animate a compartir entre todos lo solucionaremos
- T0ni0 -
30RCF112

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Duda con temporización de interrupciones
« Respuesta #5 en: 17 de Agosto de 2004, 18:43:00 »
Exactamente eso es lo que quiero, tener una base de 500 Hz. Así que no me importa el que no lo pueda ver mediante un led por lo que estoy usando un osciloscopio. Y pues por eso es que uso el retardo de 1000 us, para finalmente observar una señal cuadrada casi perfecta.  Muchas gracias por la ayuda.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Duda con temporización de interrupciones
« Respuesta #6 en: 18 de Agosto de 2004, 03:57:00 »
 Bueno pues conseguido, si lo quieres en el main ( sin interrupción ) es como sigue:

 delay_us(1000);

output_high(PIN_B1);

delay_us(1000);

output_low(PIN_B1);



Pero si lo quieres por interrupción, que creo es tu caso para poder hacer otras cosas mientras tienes la base de tiempo aki va el codigo:

#include <16f876.h>

#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use delay(clock=20000000)
#define INICIO 2
#define PUL 93

byte conteo_alto;


#INT_RTCC

pulso()

{
   if ((input(PIN_B1)))  output_low(PIN_B1);
   else output_high(PIN_B1);
set_rtcc(PUL);

}



main()

   {

//      set_tris_b(0x00);

      conteo_alto=INICIO;

      set_rtcc(PUL);

      setup_counters(RTCC_INTERNAL,RTCC_DIV_32);

      enable_interrupts(INT_RTCC);

      enable_interrupts(GLOBAL);

      while(TRUE);

   }

  Para ajustar el valor se tiene que modificar PUL, no utilizo ni Conteo_alto ni INICIO ok? y recuerda que he cambiado el prescaler a 32 para hacer el ajuste mas preciso, la salida es RB1 y el PIC un 16F876.

Por cierto alguien sabe como mejorar?:

   if ((input(PIN_B1)))  output_low(PIN_B1);
   else output_high(PIN_B1);

He probado como el C ansi "~"  para invertir el valor de la salida pero no me ha salido  
- T0ni0 -
30RCF112

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Duda con temporización de interrupciones
« Respuesta #7 en: 18 de Agosto de 2004, 11:56:00 »
No me he leido todos los mensajes del tema, solo contesto a la última pregunta efectuada por T0ni0.

Yo lo haría así: output_bit(PIN_B1, !input(PIN_B1))

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Duda con temporización de interrupciones
« Respuesta #8 en: 18 de Agosto de 2004, 13:17:00 »
   Pues si Fantastico mejor así Muy agradecido Poco a poco vamos aprendiendo
- T0ni0 -
30RCF112

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Duda con temporización de interrupciones
« Respuesta #9 en: 18 de Agosto de 2004, 18:06:00 »
Gracias a todos por su ayuda y sus consejos, ahora se que tengo que estudiar un poco más. Por cierto, controlar frecuencia con las interrupciones, lo que pasa es que necesito hacer un controlado para un motor a pasos pero variando la frecuencia. Bueno, pues muchas gracias a todos. Ahora voy entendiendo esto de las interrupciones.


 

anything