Autor Tema: abrir puerta en codigo ccs para 16f628a no funciona ,proteus  (Leído 2112 veces)

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

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« en: 17 de Noviembre de 2013, 20:26:58 »
lo que quiero que haga es que me haga girar un motor con las salidas IN3 y IN4 que abre una puerta,estando en posicion inicial el inicio de carrera INICIOC en alto y obviamente el FINALC en bajo . cuando la entrada DESTINOOK este en alto quiero que se abra esa puerta por un tiempo (15s), luego se cierre si la entrada SOBRECARGA esta en bajo.Es mi segunda programacion en ccs mmm alguien me echa una mano ? es para la cabina de mi ascensor  :-/.


#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B6,PIN_B5,PIN_B4 )
#define DESTINOOK PIN_B0
#define INICIOC PIN_B1
#define FINALC PIN_B2
#define SOBRECARGA PIN_B3
#define IN3 PIN_B4
#define IN4 PIN_B5
#define RELOJ PIN_B6

void main()
{

output_low(RELOJ);
output_low(IN3);
output_low(IN4);
while(input(DESTINOOK))
{
while(FINALC,0)
{
output_high(IN4);
output_low(IN3);
};
output_low(IN4);
output_low(IN3);
delay_ms(15000);
if(SOBRECARGA,0)
{
while(INICIOC,0)
{
output_low(IN4);
output_high(IN3);
};
output_high(RELOJ);
delay_ms(1100);
}
}

}


el RELOJ es un pulso en alto que quiero que de al terminar el cierre de la puerta que es el que le dice a mi ascensor que acabo el recojo de pasajeros.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #1 en: 17 de Noviembre de 2013, 23:46:21 »
Hola

creo que desde el inicio algo va mal,  :?, no veo el fuse del oscilador, para tu caso seria XT y talves falten algunos

lo tienes armado o estas simulando???

Nunca se deja de aprender

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #2 en: 18 de Noviembre de 2013, 01:22:29 »
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B6,PIN_B5,PIN_B4 )
#define DESTINOOK   PIN_B0
#define INICIOC   PIN_B1
#define FINALC   PIN_B2
#define SOBRECARGA   PIN_B3
#define IN3   PIN_B4
#define IN4   PIN_B5
#define RELOJ   PIN_B6

void main()
{

   output_low(RELOJ);
   output_low(IN3);
   output_low(IN4);
   if(input_state(DESTINOOK)==1)
   {
    while(input_state(FINALC)==0)
    {
    output_high(IN4);
    output_low(IN3);
    }
    output_low(IN4);
    output_low(IN3);
    delay_ms(15000);
    if(input_state(SOBRECARGA)==0)
    {
     while(input_state(INICIOC)==0)
     {
      output_low(IN4);
      output_high(IN3);
     }
     output_low(IN4);
     output_low(IN3);
     output_high(RELOJ);
     delay_ms(1100);
     output_low(RELOJ);
    }
   }
}

asi me quedo men y gracias por responder, mi duda ahora es que antes de darle play al proteus el PEDIDOOK tiene que estar en alto,porque sino no funciona nada...osea para que me funcione de nuevo tengo que darle parar al simulador y volver a darle play (INICIOC esta en alto en condicion inicial porque el inicio de carrera esta presionado por la puerta) IN3 y IN4 son para el driver l293D
y lo del cristal no lo tengo claro... se que el 16f628a tiene uno interno de 4mhz  en el proteus lo simulo y normal pero al momento de implementarlo le pono o no ...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #3 en: 18 de Noviembre de 2013, 08:51:33 »
  En proteus puedes utilizar llaves simples o creo que también hay unos componentes llamados logicstate para generar los "1" y "0" correspondientes a tus entradas.

  Em Proteus no es necesario colocar el cristal ya que se basa en la frecuencia de trabajo que tu definas, pero en físico si lo configuras con cristal debes colocarlo. Sí no necesitas demasiada precisión bien te puede servir el oscilador interno.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #4 en: 19 de Noviembre de 2013, 07:03:16 »
gracias por responder me,todo esta bien si sabia usar lo del logicstate y logicprobe del proteus,, pero el problema ahora es que DESTINOOKtiene que estar en alto antes de empezar la simulacion , de lo contrario no funciona nada aunque lo ponga a 1 mi logica no funciona.aparte de eso solo se simula una vez ,osea mi rograma solo funciona si le doy play con el destinok activado.. ayudaaaa

probe con if y while

if(input_state(DESTINOOK)==1)
{
.....
}

y sigue igual solo funciona una vez siesque empezo la entrada pin destinook en 1 (con logicstate del proteus)   :(
« Última modificación: 19 de Noviembre de 2013, 07:08:18 por zororyuzaki »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #5 en: 19 de Noviembre de 2013, 09:30:37 »
  ¿Qué es DESTINOOK? ¿Un pulsador, una llave, un sensor, viene de otro circuito?

  Para que funcione infinitas veces debes colocar tu programa dentro de un bucle infinito...

Código: C
  1. void main(void)
  2. {
  3.   while(TRUE)
  4.   {
  5.     ....
  6.     ...
  7.     ...
  8.     ...
  9.   }
  10. }

  Tal vez si plantearas tu problema de otra forma sería más fácil ayudarte.

  Por ejemplo...

  Necesito abrir y cerrar una puerta. La apertura tiene que durar un tiempo mínimo de 15s.
Para determinar el estado de la puerta tengo dos finales de carrera, ABIERTA y CERRADA. Cada uno de los fines de carrera generan un estado alto (1) cuando la puerta está abierta o cerrada respectivamente.
También tengo un sensor de sobrecarga (SOBRECARGA) que sólo permitirá cerrar la puerta cuando su estado sea bajo (0).

  Si en tu programa DESTINOOK indica que el ascensor está quieto, que es únicamente cuando se pueden abrir las puertas entonces el programa podría ser algo así....

Código: C
  1. void main(void)
  2. {
  3.   while (TRUE)
  4.   {
  5.     si DESTINOOK == 1
  6.     {
  7.       while (ABIERTA == 0)
  8.       {
  9.         comandos para abrir puerta
  10.       }
  11.       Frenar motor
  12.       Esperar 15 s
  13.       while (SOBRECARGA == 1);
  14.       while (CERRADA == 0)
  15.       {
  16.         comandos para cerrar puerta
  17.       }
  18.       Frenar motor
  19.     }  
  20.   }
  21. }

  Para la simulación ten en cuenta que tú deberás ir cambiando los logicstate para simular el funcionamiento de los fines de carrera.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Re: abrir puerta en codigo ccs para 16f628a no funciona ,proteus
« Respuesta #6 en: 20 de Noviembre de 2013, 00:09:37 »
men no sabes cuanto te agradezco era eso del while(true) ahora si me funciona !!!   ((:-)) :)

dejo el codigo por si le sirve a alguien XD

#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP  
#fuses NOMCLR               //Sin conectar la resistencia al pin MCLR
#fuses INTRC_IO

#use delay(internal=4000000)
#use FIXED_IO( B_outputs=PIN_B6,PIN_B5,PIN_B4 )

#define DESTINOOK   PIN_B0
#define INICIOC   PIN_B1
#define FINALC   PIN_B2
#define SOBRECARGA   PIN_B3
#define IN3   PIN_B4
#define IN4   PIN_B5
#define RELOJ   PIN_B6

void main(void)    
{
 while(TRUE)       //bucle infinito
  {
   output_low(RELOJ);                    //NO SE REALIZO LA ACCION DE ABRIR Y CERRAR LA PUERTA!!!
   output_low(IN3);                      //driver de motor L293D en parada
   output_low(IN4);
   while( input_state(DESTINOOK)==1)        //mientras que la cabina del ascensor este en su destino
   {
    while( input_state(FINALC)==0)       //mientras no se pulso el final de carrera de la puerta
    {
    output_high(IN4);              //abrir puerta ( 1 0 ) con el driver
    output_low(IN3);
    }
    output_low(IN4);           //ya se pulso el final de carrera, se hace una parada
    output_low(IN3);
    delay_ms(15000);         //por 15 segundos para que suban los pasajeros o bajen...
    if(input_state(SOBRECARGA)==0)     //si los pasajeros no se excedieron en el peso
    {
     while(input_state(INICIOC)==0)      //mientras no se pulso el inicio de carrera de la puerta
     {
      output_low(IN4);         //cerrar puerta (0 1) con el driver
      output_high(IN3);
     }
     output_low(IN4);      //ya se pulso el inicio de carrera, se hace una parada
     output_low(IN3);
     output_high(RELOJ);     //SE REALIZO LA ACCION DE ABRIR  CERRAR LA PUERTA !!!, se manda un pulso que confirma eso
     delay_ms(1500);          
     output_low(RELOJ);        
     delay_ms(1000);
    }
    else            //sino
    {
    output_low(RELOJ);      //mantener en cero, tanto el pulso de confirma
    output_low(IN3);      //como el motor (que se mantenga en parada 0 0 ,puerta cerrada )
    output_low(IN4);
    }
   }
 }
}

UNAC-FIEE XD
« Última modificación: 20 de Noviembre de 2013, 00:17:30 por zororyuzaki »