Autor Tema: Contador de pulsos en c para pic16f84.  (Leído 12387 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
Contador de pulsos en c para pic16f84.
« en: 13 de Febrero de 2013, 21:11:21 »
Buen dia, esperemos alguien pueda guiarme les voy a subir varios codigos se que tengo errores, pero ya se me emboto la cabeza de tanto pensar, se supone que tengo que hacer un contador el cual si esta en 0 logico no hace el conteo, y si esta en 1 empieza el conteo ya que detecta que tiene un voltaje de 5V y teniendo en cuenta que que en proteus se va a simular el micro conectado a un led y un push botton para poder simular lo del pulso.

Les agradeceria mucho si me pueden auxiliar, que se puede cambiar y mejorar que tengan buen dia. :)

#include<16f84.h>
#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)

void main()
{
  int i;
  output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
  while(TRUE)
  {
    if(input(PIN_A4))
    {
      output_high(PIN_B0);                     // Activo el relé.
      delay_ms(60000);                          // Retardo de un minuto...
      delay_ms(60000);                          // Retardo de un minuto...
      output_low(PIN_B0);                     // Desactivo el relé.
    }
  }
}

/////////////////////////////////////////////////////////////////////////////////

#include<16f84.h>
#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)

void main()
{
  int i;
  output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
  while(TRUE)
  {
    if(input(PIN_A4))
    {
      output_high(PIN_B0);                     // Activo el relé.
      for(i=;i>0;i--) delay_ms(60000);   // Retardo
      output_low(PIN_B0);                     // Desactivo el relé.
    }
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////

    #include<16f84.h>
    #fuses XT,NOLVP,NOWDT
    #use delay(clock=4000000)
    int flag;
    void main()
    {
     int i;
     flag = 0;                                          // Estado inicia de la bandera
     output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
     while(TRUE)
     {
       if(input(PIN_A4))
       {
         output_high(PIN_B0);                     // Activo el relé.
         for(i=;i>0;i--)
            while (flag=0)       //mientras flag no sea 1 hacer retardo.          
            {
              delay_ms(60000);   // Retardo de dos minutos...
            }
    output_low(PIN_B0);                     // Desactivo el relé.
       }
    flag = 0;                   //Inicializamos la bandera
     }
    }
« Última modificación: 13 de Febrero de 2013, 21:33:56 por tone04 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Contador de pulsos en c para pic16f84.
« Respuesta #1 en: 13 de Febrero de 2013, 22:33:56 »
  ¿Tienes que contar o generar pulsos?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
Re: Contador de pulsos en c para pic16f84.
« Respuesta #2 en: 14 de Febrero de 2013, 00:54:33 »
Pues generar pulsos al presionar el push botton.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Contador de pulsos en c para pic16f84.
« Respuesta #3 en: 14 de Febrero de 2013, 11:11:43 »
  Entonces creo que con el primer programa te iría bien, sólo hay que hacer una modificación porque así como está casi no hay tiempo de espera entre el estado bajo y alto. Debería quedar así (coloco sólo el código interior del if)....

Código: C
  1. output_high(PIN_B0);
  2. delay_ms(60000);
  3. output_low(PIN_B0);
  4. delay_ms(60000);

  Esto te daría un tiempo en alto de 1 segundo y un tiempo en bajo de 1 segundo.

  Ahora bien, deberías asegurarte el tipo de parámetro que le puedes pasar a la función delay. Es decir, si puede ser de hasta 16bits o sólo de 8 bits
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: Contador de pulsos en c para pic16f84.
« Respuesta #4 en: 14 de Febrero de 2013, 16:23:25 »
  Entonces creo que con el primer programa te iría bien, sólo hay que hacer una modificación porque así como está casi no hay tiempo de espera entre el estado bajo y alto. Debería quedar así (coloco sólo el código interior del if)....

Código: C
  1. output_high(PIN_B0);
  2. delay_ms(60000);
  3. output_low(PIN_B0);
  4. delay_ms(60000);

  Esto te daría un tiempo en alto de 1 segundo y un tiempo en bajo de 1 segundo.

  Ahora bien, deberías asegurarte el tipo de parámetro que le puedes pasar a la función delay. Es decir, si puede ser de hasta 16bits o sólo de 8 bits

Angel gris, creo que te equivocaste en la cuenta, eso seria un minuto, ¿no?.

Saludos.

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
Re: Contador de pulsos en c para pic16f84.
« Respuesta #5 en: 14 de Febrero de 2013, 20:55:18 »
Y a eso que le hago o cual codigo me recomiendan para poderle hacerle el cambio o la mejora para lo del cambio de bajo a alto o viceversa saludo tengan buen dia.

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
Re: Contador de pulsos en c para pic16f84.
« Respuesta #6 en: 14 de Febrero de 2013, 20:57:05 »
No entiendo lo de la parte de 8 o 16 bits.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Contador de pulsos en c para pic16f84.
« Respuesta #7 en: 14 de Febrero de 2013, 22:05:00 »
  Entonces creo que con el primer programa te iría bien, sólo hay que hacer una modificación porque así como está casi no hay tiempo de espera entre el estado bajo y alto. Debería quedar así (coloco sólo el código interior del if)....

Código: C
  1. output_high(PIN_B0);
  2. delay_ms(60000);
  3. output_low(PIN_B0);
  4. delay_ms(60000);

  Esto te daría un tiempo en alto de 1 segundo y un tiempo en bajo de 1 segundo.

  Ahora bien, deberías asegurarte el tipo de parámetro que le puedes pasar a la función delay. Es decir, si puede ser de hasta 16bits o sólo de 8 bits

Angel gris, creo que te equivocaste en la cuenta, eso seria un minuto, ¿no?.

Saludos.


  OPs  :oops: :oops:  pues tienes razón AcoranTf, gracias por la corrección.


  Tone04, cuando escribí que con el primer programa te iría bien, me refería al primer código que habías colocado.

  Con lo de 8 o 16 bits, me refiero al máximo valor posible que se le puede pasar como parámetro a la función delay_ms. Si el máximo es 255 es porque sólo acepta valores de hasta 8 bits, Sí se le puede pasar hasta 65535 es porque acepta valores de hasta 16 bits.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Contador de pulsos en c para pic16f84.
« Respuesta #8 en: 14 de Febrero de 2013, 22:19:25 »
 Ahora bien, deberías asegurarte el tipo de parámetro que le puedes pasar a la función delay. Es decir, si puede ser de hasta 16bits o sólo de 8 bits

Según el manual de CCS, a delay_ms se le pueden pasar variables 0-65535(int16) o constantes 0-65535.  En versiones anteriores (no se desde cual), el byte más alto de un int(16) era ignorado;  en las versiones recientes, este byte ya afecta el tiempo.

Tone04, a que frecuencia quieres generar los tonos? pulsos?  Es eso lo único que va a hacer el programa? Porque si el programa va a hacer otras operaciones mientras genera esas frecuencias tan bajas usando delay_ms, vas a tener muchos problemas y lo mejor será que utilices la interrupción de algún Timer.

Saludos!
« Última modificación: 15 de Febrero de 2013, 10:08:59 por bmb »

Desconectado tone04

  • PIC10
  • *
  • Mensajes: 9
Re: Contador de pulsos en c para pic16f84.
« Respuesta #9 en: 14 de Febrero de 2013, 22:46:55 »
Varias preguntas, buen dia saben que al compilar en mikroc y en compiler c no me dejan compilar los programas y me marca lo de la parte de #fuses(estos para que son porque ya me reboruje) ahi cuales debo poner o el software debo configurarlo subo otro programa no se si este bien o que me falle o si este sustituye a los otros AngelGris gracias y en cuanto a lo del delay_ms no hay problema no se cual sea recomendable digamos cada minuto, o cada 20 s no si pueden auxiliarme se los agradecere mucho saludos.
#include <16f84a.h>
#fuses intrc_io, nowdt, nomclr
#use delay (clock=4000000)
#byte portb=0x06
#byte trisb=0x86

#int_ext
prueba ()  {
portb = 0b00000010;
delay_ms (1000);
}
void main () {
trisb =0b00000001;
portb=0;
enable_interrupts (int_ext);
ext_int_edge (h_to_l);
enable_interrupts (global);
while (1) {
portb=0;
}
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Contador de pulsos en c para pic16f84.
« Respuesta #10 en: 14 de Febrero de 2013, 23:08:43 »
  Tone4, el último código que colocaste no genera pulsos, sino que está constantemente dejando todo el puerto B en 0 y cuando llega un pulso por RB0 (interrupción externa) pone a 1 el pin RB1 durante un segundo.

  Pero no entiendo con que compilador estás trabajando. Hasta donde sé, la función "enable_interrupt" es de CCS. Pero tú indicas que te da error al intentar compilar con MikroC
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Contador de pulsos en c para pic16f84.
« Respuesta #11 en: 15 de Febrero de 2013, 10:34:43 »
#include <16f84a.h>
#fuses intrc_io, nowdt, nomclr

Hola tone04, el último código que subiste, no te va a servir de mucho.  Sería bueno que tuvieras muy claro lo que quieres que el microcontrolador haga y transmitirlo aquí en el foro para que puedas recibir ayuda más concreta.  Para eso, además de estudiar los comandos básicos del lenguaje que quieres usar, debes leer muy bien la hoja de datos del PIC.  Por ejemplo los fuses intrc_io y nomclr, no son válidos para el PIC16F84A.

#int_ext
prueba ()  {
portb = 0b00000010;
delay_ms (1000);
}

En este  código para la interrupción de RB0, ese delay de 1 segundo también te puede causar efectos indeseados.  Léete muy bien sobre como funcionan las interrupciones.

Como te ha dicho AngelGris, las instrucciones de tu programa son para CCS y no para mikroc.

Saludos!