Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

17/11/2013 #1


Abrir puerta en codigo ccs para 16f628a no funciona , Proteus
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 .

Código PHP:
#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);
    }
   }
 

---------- Actualizado después de 23 minutos ----------

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.
17/11/2013 #2

Avatar de Gudino Roberto duberlin

Hola Amigo, cual es el problema?, ademas donde declaras PIN_B0...PIN_B3 como entradas?.
17/11/2013 #3


gracias por responder, mm cuando abriel ccs configure con el ayudante de ccs como entradas y el ccs puso esos define por defecto sera eso ? el problema es que cuando lo simulo con proteus no funciona nada no se activa ninguna de mis 3 salidas ese fixed_io no se encarga de eso ? nose soynovato con esto del ccs :c ,estoy que hago todo mi proyecto con compuertas ttl pero de pic solo quiero hacer este control de la puertita.
17/11/2013 #4

Avatar de ByAxel

Hola. Curioso y a la vez un grave error...
La línea while(FINALC,0) y similares estan mal aplicados (según CCS) y en general para lenguaje C. Nunca he visto una coma dentro de while y que al final de la llave esté (;). Simplemente no genera error pero curiosamente no genera código para los While y el If, por eso no pasa nada.

Lee la ayuda del CCS y busca temas relacionados a "input_state()", utiliza eso dentro de while quedando como "while(input_state(DESTINOOK))" o "if(input_state(SOBRECARGA)==0)" por ejemplo.
17/11/2013 #5


gracias men alfin me corrio el programa segunlas recomendaciones que me diste aunke me di cuenta que mi programa no esta bien asi quedo

Código PHP:
#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);
    }
   }

acabo de cambiarle el while por el if en PEDIDOOK, pero lo raro 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
19/11/2013 #6


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)
19/11/2013 #7

Avatar de ByAxel

Hola.
Recuerda, void main (void) no es bucle... al final de este se encuentra la instrucción "Sleep" por lo que si no se cumple DESTINOOK, va al final de main y detiene al PIC.

Generalmente el programa principal se ponde dentro de un bucle infinito (la lógica se repite una y otra vez), ya sea dentro de while(TRUE){} o for( ; ; ){}.
19/11/2013 #8


No entiendo bien lo que quieres, pero solo corre una vez por el if.
Tienes que poner un arreglo para que el programa este ciclando.
Envuelve el ciclo if en un while, algo así.

Código:
while(1){
 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);
    }
   }
} 

}
19/11/2013 #9


abrir y cerrar una puerta con temporizador
Agradezco a todos sus respuestas.
En efecto me faltaba el bucle infinito while.
Así quedó el código, espero le sirva a alguien
Código:
#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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.