Autor Tema: usar timer como retardo????  (Leído 5047 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: usar timer como retardo????
« Respuesta #15 en: 16 de Noviembre de 2005, 23:02:00 »
Ah, el valor que hay que poner es N, en este caso... 16.

Ahora que ya tienes ese dato, haz una programa básico que interrumpa al PIC cada 3.84ms.

Por ahora olvida el que tienes en mente, tienes que echar a andar un timer independientemente. invasor

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: usar timer como retardo????
« Respuesta #16 en: 18 de Noviembre de 2005, 13:29:00 »
hola, aqui esta el programita con preescaler de 16 y valor de carga de 0 da 4ms, pero el led en PIN_A0 NO ME PRENDE, PORQUE SERA.

#include <16CR84.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
#nolist
#byte port_A=05
#byte port_b=06
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4)
#use fixed_io(B_OUTPUTS=PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int x=0;

#int_RTCC
RTCC_tiempo()
{
   x++;
   set_rtcc(0);
}

void main() {

   setup_counters(RTCC_INTERNAL,RTCC_DIV_16);//((256-0)*4*16)/4000000=0.004096
   enable_interrupts(INT_RTCC);
   enable_interrupts(global);
   set_rtcc(0);
   while(true)
   {
      if(x==250)
      {
         output_high(pin_a0);
      }
      if(x==500)
      {
         output_low(pin_a0);
         x=0;
      }
   }
}

SALUDOS...

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: usar timer como retardo????
« Respuesta #17 en: 18 de Noviembre de 2005, 17:56:00 »
hola, aqui esta el programita con preescaler de 256 y valor de carga de 128 da una inaterrupcion cada 32ms, y ahora si el led se ve parpadear.

#include <16CR84.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
#nolist
#byte port_A=05
#byte port_b=06
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4)
#use fixed_io(B_OUTPUTS=PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int x=0;

#int_RTCC
RTCC_tiempo()
{
x++;
set_rtcc(128);
}

void main() {

setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(global);
set_rtcc(128);
while(true)
{
if(x==20)
{
output_high(pin_a0);
}
if(x==40)
{
output_low(pin_a0);
x=0;
}
}
}

SALUDOS...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: usar timer como retardo????
« Respuesta #18 en: 18 de Noviembre de 2005, 21:30:00 »
En el primer programa que pusiste no parpadeaba porque declaraste x como valor int, es decir, de 8bit.

Sólo retiene números del 0 al 255. Le estabas pidiendo un 500 imposible.

Ahora que ya sabes manejar timers e interrupciones puedes seguir con tu programa de los botones.

Pon a un lado tu programa del timer y empieza una con int ext. Hazlo básico, que al presionar un botón en RB0 (Low to High) se interrumpa el PIC, y en la subrutina de interrupción prenda un led. Cuando desaprietes RB0 (high to Low), que se apague el led.

Está fácil. Súbelo y lo revisamos.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: usar timer como retardo????
« Respuesta #19 en: 19 de Noviembre de 2005, 08:04:00 »
Para hacerla de 16bit ponle

int16 x;

o de 32

int32 x;

o de 1

int1 x;

El programa que pones no lleva int ext, no sé de dónde lo sacaste loco Si le pones comentarios tal vez le entienda.

Te paso el manual de CCS en español, está interesante. En la página que abre, dale FREE para descargarlo.

http://rapidshare.de/files/5556929/CCS_C_sp.pdf.html


Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: usar timer como retardo????
« Respuesta #20 en: 19 de Noviembre de 2005, 11:36:00 »
hola, aqui el programa comentado, de esta forma me funciona sin problemas.

#include <16CR84.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
#nolist
#byte port_A=05
#byte port_b=06
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4)
#use fixed_io(B_OUTPUTS=PIN_B0,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
int a=0,dptoAtiempo=0,dptoAstatus=0;
//variable a para que cuente las interrupciones
//dptoAtiempo para que inicie el conteo de interrupciones con la variable a
//dptoAstatus para saver cuando ya transcurrio el tiempo que queria.

#int_RTCC
RTCC_tiempo()
{
if(dptoAtiempo!=0) a++;
set_rtcc(0);
}

void main() {

setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
enable_interrupts(global);
enable_interrupts(INT_RTCC);
set_rtcc(0);
port_a=0;
port_b=0;
while(true)
{
if(input(pin_b1)==1 && dptoAstatus==0) dptoAtiempo=1; //inicio el conteo de interrupciones siempre que no aya hercho este proceso antes, en este caso 77 interrupciones equivalen a 10 seg.

if(a>=77 && input(pin_b1)==1 && dptoAstatus==0) //verifica que variable a sea igual o superios a 77 y que el pin_b1 este en 1, para saver que ya paso el tiempo que yo queria (10seg)
{
dptoAstatus=1; //paso dptoAstatus a 1 para que no vuelva a entrar en este if()
dptoAtiempo=0; //paro el conteo de interrupciones
a=0; //vuelvo el contador de interrupciones a 0
}

if(a>=77 && input(pin_b1)==1 && dptoAstatus==1) //cuando sueltan el boton en pin_b2 se activa el contador de interrupciones nuevamente y este if espera a que llegue a 77 o mas para entrar, para prender el led en pin_a0.
{
output_high(pin_a0);
dptoAtiempo=0; //para el conteo de interrupciones
a=0; //vuelvo el contador de interrupciones a 0
}

if(input(pin_b1)==0) //si el boton en pin_b1 n o esta precionado se anula todo lo anterior
{
dptoAstatus=0;
dptoAtiempo=0;
output_low(pin_a0);
}

//aqui verifico los estados de los pines b2, b3 y el valor de dptoAstatus para saver que lla conto los primeros 10seg.
if((input(pin_b2)==0 && input(pin_b3)==1) && dptoAstatus==1) dptoAtiempo=1;
if((input(pin_b2)==1 && input(pin_b3)==0) && dptoAstatus==1) output_high(pin_a0);
if((input(pin_b2)==0 && input(pin_b3)==0) && dptoAstatus==1) output_high(pin_a0);
}
}


no se si se entendio lo que quise hacer, pero funciona superbien.

ahora me gustaria saver como mejorar el codigo para la eficiencia y que no haga cosas extrañas o para que el codigo use menos enpacio.


saludos...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: usar timer como retardo????
« Respuesta #21 en: 19 de Noviembre de 2005, 13:28:00 »
Qué bueno que ya funciona.

Sobre eficientar el código, sigo pensando en la interrupción externa.

Si el botón va a ser presionado por una persona, el programa está bien; pero si va a ser una señal generada por un micro, y esa señal cambia de alto a bajo o al revés de forma inmediata, tu PIC no va a detectar el cambio, ya que mientras está haciendo otra cosa, el botón puede cambiar de estado. Por eso insisto en la int ext, para que el PIC siempre esté al pendiente. Eso es lo que yo le corregiría al programa.

Sobre tus variables... si dptoAtiempo y dptoAstatus siempre son 0 ó 1, mejor cecláralas como int1, para ahorrar memoria RAM.

Divertido

Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: usar timer como retardo????
« Respuesta #22 en: 19 de Noviembre de 2005, 13:51:00 »
hola, con respecto a la int_ext no la uso por que este grupo de 3 botones se repite 3 veces osea tendria que usar 3 interrupciones externas pero el 16f84 solo tiene una. por eso lo ago de esta manera y si el boton que desata el contados lo activa una persona, ya cambia por int1 dptoAtiempo,dptoAstatus;...





ahora me gustaria saber como se puede trabajar con rs485, ¿se transmite igual que rs232 o ay que crear el protocolo? ¿se usa un max485 para hacer la convercion o lo hace uno por software? y

puedo en vez de rs485 usar I2C
¿I2C EL ESCLAVO PUEDE ENVIAR DATOS AL MAESTRO SIN QUE EL MAESTRO LOS LEEA Y LOS PIDA AL ESCLAVO? ¿CUAL ES LA MAYOR DISTANCIA QUE SE PUEDEN SEPARAR 2 PLACAS COMUNICADAS POR I2C?

ESTAS SON UNAS PREGUNTAS SOBRE I2C QUE NO E PODIDO RESPONDER CON LOS DEMAS POST SOBRE ESTE TEMA.

SALUDOS...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: usar timer como retardo????
« Respuesta #23 en: 19 de Noviembre de 2005, 18:38:00 »
Pues hasta aquí te puedo ayudar, no sé mucho sobre RS485, sólo que es una forma de transmitir información a 100m más o menos. NO es un protocolo, sólo es circuitería para lograr comunicaciones a larga distancia. El protocolo tú lo implementas.

De I2C he programado memorias y un ds1307, pero no he programado pic con pic. Si quieres haz un nuevo tema en el foro con tus nuevas dudas.

Idea