Autor Tema: Lectura de pulso  (Leído 2108 veces)

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

Desconectado kapekos

  • PIC10
  • *
  • Mensajes: 9
Lectura de pulso
« en: 07 de Septiembre de 2005, 14:17:00 »
Hola soy totalmente nuevo en este foro y tambien en la programacion de pics en C...bueno si tambien en la programacion en C..mi pregunta se debe a lo siguiente deseo hacer que un pic me lea un pulso y me encienda un led Ok ya lo logre ..lo que no se es como apagarlo mediante otro pulso o el pulso del mismo pulsador que use para encenderlo.
Uso el piclite en MPLAB 7.20 le srecomiendo pleaseLlorando

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Lectura de pulso
« Respuesta #1 en: 08 de Septiembre de 2005, 01:43:00 »
Bienvenido.

Es muy sencillo, debes hacer que el pulsador actue por flanco, tanto en la activación del LED como en la desactivación.

Deberas detectar: ¿p=1? -> LED=1 -> ¿p=0? -> ¿p=1? -> LED=0 -> ¿p=0?

Después de cada detectión del estado de p hay que meter un retardo antirebotes, delay_ms(20) por ejemplo, para evitar desplazamientos de secuencia.

Si no te sale, pón lo que hayas hecho.

Un saludo

Desconectado kapekos

  • PIC10
  • *
  • Mensajes: 9
RE: Lectura de pulso
« Respuesta #2 en: 08 de Septiembre de 2005, 11:09:00 »
Bien ya hice la lectura del pulso de una manera muy sencilla gracias de todas maneras por tu colaboracion ...sin embargo me surge una nueva inquietud acerca de un programa que deseo hacer........relacionado con otro tema.

Cuando deseo sacar señales cuadradas paralelas(me refiero a que todas funcionen a la vez) por cada pin del puerto B ...es decir RB0=0.5useg.,RB1=5mseg,
RB2=50mseg,y RB3=500mseg...no se me ocurre como separarlas dentro de un bucle infinito para que se me ejecuten....este es el programa tentativo segun yo(el orden que se me ocurre)... que le falta?El funcionamiento con este programa no es el esperado ya que el unico que me cumple con los ciclos es el de 500mseg.


#include<pic.h>
#include"delay.h"

void main (void)
{
   char i=0;
   char ON=0x1;
   char OFF=0;
   TRISA=0xFF;
   TRISB=0;

   for(;Giño
   {
      RB0=ON;
      DelayUs(500);
      RB0=OFF;
      DelayUs(500);
      RB1=ON;
      DelayMs(5);
      RB1=OFF;
      DelayMs(5);
      RB2=ON;
      DelayMs(50);
      RB2=OFF;
      DelayMs(50);
      RB3=ON;
      DelayMs(500);
      RB3=OFF;
      DelayMs(500);
   }
}

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Lectura de pulso
« Respuesta #3 en: 08 de Septiembre de 2005, 11:21:00 »
Ke tal!!!haber por encima el codigo esta bien y claro que solo te funcione el de 500ms ya que el siguiente estas acumulando tiempos, es decir, la primera señal cuando haya transcurrido 1000ms habra ejercido un ciclo, la segunda de 5ms ya viene con un retraso de 500ms del on y 500ms del off un total de 1000ms de retraso de la anterior y asi sucesivamente, lo que tienes es señales cuadradas de duracion diferentes pero retrasadas en el tiempo(el tiempo de retraso es igual al tiempo de la anterior señal), para que todas las señales no esten retrasadas deberas usar "algo" que cuente independientemente del programa principal, ese "algo" que cuente puede ser los timer"s o conectar alguna interrupcion externa cada cierto tiempo, sino estaran retrasadas las señales....Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Lectura de pulso
« Respuesta #4 en: 08 de Septiembre de 2005, 11:22:00 »
Se me ocurre que podrías hacerlo de la siguiente manera.
Necesitas un bucle con la menor temporización posible, en tu caso 500us, o mejor aún una interrupción del timer que salte cada 500us, aunque esto podrías hacerlo en una segunda fase.

Una vez en el bucle (o la interrupción) cambias el estado de RB0, o sea, lo inviertes e incrementas un contador.
Posteriormente chequeas si el contador es múltiplo de 10, en cuyo caso cambias de estado RB1.
Chequeas si el contador es múltiplo de 100, en cuyo caso cambias de estado RB2.
Chequeas si el contador ha llegado a 1000, en cuyo caso cambias de estado RB3 y reinicias el contador poniéndolo a 0.

Y vuelta a empezar.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Lectura de pulso
« Respuesta #5 en: 08 de Septiembre de 2005, 12:37:00 »
Los de CCS son unos máquinas:

Codigo:
/////////////////////////////////////////////////////////////////////////
////                         EX_PATG_2.C                               ////
////                                                                 ////
////  This program will output multiple square waves from the pins   ////
////  of port b.  The waves can be differnt frequencies, and can be  ////
////  seen by hooking up a scope to any of the pins.                 ////
////                                                                 ////
////  Configure the CCS prototype card as follows:                   ////
////     Connect any of pins 47 through 53 to a scope.               ////
////     See additional connections below.                           ////
////                                                                 ////
////  This example will work with the PCM and PCH compilers.  The    ////
////  following conditional compilation lines are used to include a  ////
////  valid device for each compiler.  Change the device and clock   ////
////  for your hardware if needed.                                   ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif

#define NUM_OUTPUTS  8

//NOTE:  periods MUST be multiples of 400
//Periods are in microseconds

/*
#define  PERIOD_0 400            //2,5KHz      ¡OK, PROTEUS!
#define  PERIOD_1 800            //1,25KHz
#define  PERIOD_2 1600            //625Hz
#define  PERIOD_3 2000            //500Hz
#define  PERIOD_4 20000            //50Hz
#define  PERIOD_5 64000            //15,625Hz
#define  PERIOD_6 2000000         //0,5KHz
*/

#define  PERIOD_0 400            //2,5KHz      ¡OK, PROTEUS!
#define  PERIOD_1 400            //2,5KHz
#define  PERIOD_2 800            //1,25KHz
#define  PERIOD_3 1600            //625Hz
#define  PERIOD_4 8000            //125Hz
#define  PERIOD_5 40000            //25Hz
#define  PERIOD_6 1000000         //1Hz
#define  PERIOD_7 1600            //2,5KHz

const long wave_period[NUM_OUTPUTS] = {
            PERIOD_0/400, PERIOD_1/400, PERIOD_2/400, PERIOD_3/400,
            PERIOD_4/400, PERIOD_5/400, PERIOD_6/400, PERIOD_7/400};

long counter[NUM_OUTPUTS] = {0,0,0,0,0,0,0,0};

int port_b_image;


// This interrupt is used to output the waveforms.  The interrupt
// is automatically called ever 200us.
#INT_TIMER1
void wave_timer() {
   int i;

   //set_timer1(0xFC4F);                      // 0xFC4F=64591 sets timer to interrupt in 200us
   set_timer1(64570);                   //Así salen 200us justos (sacados con el MPLAB)
   output_b(port_b_image);                   // outputs the waveform

   for(i=0; i<NUM_OUTPUTS; i++)              // sets up next output for each pin
   {
      if((++counter) == wave_period)   // if counter is expired
      {
         counter = 0;                     // reset counter
         if(bit_test(port_b_image,i))        // and set pin as needed
            bit_clear(port_b_image,i);
         else
            bit_set(port_b_image,i);
      }
   }
}


void main()   {

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   // setup interrupts
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   port_b_image=0;                           // initialize variable
   output_b(port_b_image);

   set_timer1(65535);

   while(TRUE);                              // loop forever
}



Un saludo

Desconectado kapekos

  • PIC10
  • *
  • Mensajes: 9
RE: Lectura de pulso
« Respuesta #6 en: 08 de Septiembre de 2005, 13:54:00 »
Haber les cuento no tengo muy claro el manejo de las interrupciones porque como les comente soy nuevo en el cuento de los micros y tambien de la programacion...sin embargo me di a la tarea de hacer este programa para ver si me funcionaba pero nop....no se que le falta o que esta mal...la verdad ya me cansé de revisarlo tantas veces......aqui lo dejo please help me

#include<pic.h>
#include"delay.h"

void main (void)
{
   char i=0;
   char j=0;
   char k=0;
   char l=0;
   char ON=0x1;
   char OFF=0;
   TRISA=0xFF;
   TRISB=0;

   for(;Giño
   {
inicio:   if(RB0==ON)
      {   
         DelayMs(500);
         RB0=OFF;
      }
      else
      {
         RB0=ON;
         DelayUs(500);
         i=i+1;
      }
      if(i==10)
      {   
         if(RB1==ON)
         {
            DelayMs(5);
            RB1=OFF;
            i=0;
         }
         else
         {   
            DelayMs(5);
            RB1=ON;
            i=0;
            j=j+1;
         }
      }
      else
      {
         goto inicio;
      }
      if(j==10)
      {
         if(RB2==ON)
         {
            DelayMs(50);
            RB2=OFF;
            j=0;
         }
         else
         {
            DelayMs(50);
            RB2=ON;
            j=0;
            k=k+1;
         }
      }
      else
      {
         goto inicio;
      }
      if(k==10)
      {
         if(RA3==ON)
         {
            DelayMs(500);
            RB0=OFF;
            k=0;
         }
         else
         {
            DelayMs(500);
            RB3=ON;
            k=0;
            l=l+1;
         }
      }
      else
      {
         goto inicio;
      }
      if(l==10)
      {
         k=0;
         goto inicio;
      }
      else
      {
         goto inicio;
      }
   }
}            

Desconectado kapekos

  • PIC10
  • *
  • Mensajes: 9
RE: Lectura de pulso
« Respuesta #7 en: 09 de Septiembre de 2005, 11:31:00 »
Esta fue la solucion que le di en el picclite....para poder hacer la lectura del pulso lo unico que le falta es el delay para corregir los rebotes pero ya deben saber como se corrigen.

#include<pic.h>
#include"delay.h"

void main (void)
{
   char ON=0x1;
   char OFF=0x0;
   TRISA = 0b11111111;
   TRISB = 0b00000000;
Inicio:
   if(RA4==OFF)
   {
     goto VerificaLed;
   }
    else
   {
     goto Inicio;
   }
VerificaLed:

   if(RB0==ON)
   {
      // DelayMs(20);
     RB0=OFF;   
   }
   else
   {
      RB0=ON;
   }
}

Con este programa se enciende y se apaga el mismo led con el mismo pulso y nos permite multiples variaciones y aplicaciones.