Autor Tema: Proyecto estacionamiento de dos niveles  (Leído 2668 veces)

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

Desconectado Sebaf

  • PIC10
  • *
  • Mensajes: 1
Proyecto estacionamiento de dos niveles
« en: 21 de Noviembre de 2018, 16:34:58 »
Buen día,

Es mi primer post, no conocía sobre la pagina pero estuve leyendo y la verdad que muy bueno.

Les comento mi situación, en clase dimos un proyecto como ejemplo y me quedan varias dudas, copio el enunciado:

Entrada de garaje para dos niveles de estacionamiento a los cuales se accede por un portón principal y una rampa que selecciona el nivel deseado.                   
Contaremos en la entrada gral con 3 pulsadores que determinaran respectivamente el acceso al nivel superior, al nivel inferior, y de cierre al salir de cualquiera de los niveles. En los 2 niveles de estacionamiento tendremos 2 pulsadores, uno para abrir y acceder a la salida y el otro para cerrar el portón al ingresar a los mismos. Los 3 botones pàra cerrar el porton y la rampa actúan en paralelo Cada uno de los 3 lugares contara con un semáforo que tendrá una luz roja y una luz verde. La luz roja de los 3 sitios estará encendida permanentemente salvo en el momento de la habilitación con la luz verde de circulación solicitada. Contaremos con una sirena que estará encendida durante el proceso de entrada o salida. Activa con una señal cuadrada de 1Khz Al oprimir cualquiera de los pulsadores, de entrada o salida, primero se encenderá una sirena, luego se abrirá el portón gral y ubicara la rampa, una vez culminado esto se encenderá la luz verde correspondiente , la cual se apagara a los 30 segundos. Al oprimir cualquiera de los pulsadores de cierre se cerrara el portón principal, la rampa se movera hasta la posición de reposo y una vez culminado el cierre se apagara la sirena. La rampa en posiscion de reposo comunica el nivel alto con la salida, cuando es elevada permite acceder al nivel inferior.  Su motor es manejado por dos señales, una de abrir y la otra de cerrar. Si estan ambas ausentes o presentes el motor no se movera. El motor del portón se comandara con 2 señales, una de abrir y otra de cerrar. Ni el porton ni la rampa cuentan con sensores de final de carrera. Se activaran durante 1 minuto hacia un lado u otro para realizar sus movimientos.

Aqui esta el programa:

//PRUEBA DE INICIO
/*Fck    = 4MHz/4 = 1MHz
   Periodo de tiempo = 1uS
   Periodo pre escal = 1 x 2 = 32uS           PRESCALADOR=1:2
   Desordes          = 2 x (256-6) = 500uS  TMR0=6
                     = 0.5mS
PS2   PS1   PS0   
0   0   0   1:2*   
0   0   1   1:4   
0   1   0   1:8   
0   1   1   1:16
1   0   0   1:32
1   0   1   1:64
1   1   0   1:128
1   1   1   1:256

*///////////////////////////////////////////////////////////////////
#include <htc.h>
#include <pic16f628a.h

__CONFIG(FOSC_INTOSCIO & WDTE_OFF & CP_OFF & CPD_OFF & BOREN_ON & PWRTE_ON & LVP_OFF & MCLRE_OFF );

   //**//VARIABLES
    bit mbzz=0;
    bit aux1=0;
    bit aux2=0;
    bit aux3=0;
    bit mc =0;
    bit mn1=0;
    bit mn2=0;
   
    //**//TIEMPOS 1=0.5ms -- 2000=1s -- 60000=30s --  120000=60s
    long min=60000;
    long seg=20000; 
    long tr=0;//variable tiempo rampa
    long tluz=0;//variable tiempo luz
   
       
    //**//SALIDAS
    #define apg RA0
    #define cpg RA1
    #define sr  RA2
    #define br  RA3
    #define ln1 RB1
    #define ln2 RA6
    #define bzz RA7
   
    //**//ENTRADAS
    #define n1   RB4
    #define n2   RB5
    #define c    RB6
    #define pare RB7
       
       
   void AccesoSalirNivel_1() {     if(aux1==1){mbzz=1;apg=1;sr=1;aux1=0;} //NO ME CARGA LAS SALIDAS
                                 if(tr==0&&sr==1){apg=0;sr=0;ln1=1;tr=min;}
                                 if(tluz<=0){ln1=0;tluz=seg;mn1=0;}}   
   
   void AccesoSalirNivel_2() {      if(aux2==1){mbzz=1;apg=1;br=1;aux2=0;}
                                 if(tr==0&&br==1){apg=0;br=0;ln2=1;tr=min;}
                                 if(tluz<=0){ln2=0;tluz=seg;mn2=0;}}                     
     
   void Cerrar() {      if(aux3==1){mbzz=1;cpg=1;br=1;aux3=0;}
                        if(tr==0&&br==1){bzz=0;cpg=0;br=0;mbzz=0;tr=min;mc=0;}}
         
   
    void main()
    {   
       PS2=0;PS1=0;PS0=0;    //PRE ESCALADOR 000=2
       PSA=0;               //fuente del preescalador ciclos de reloj
       T0CS=0;             //pre escalador cuenta ciclos de ck (4MHz)
       
       RBIE=1;
       RBIF=0;
             
       T0IE=1;      //habilito interrupcion TIMER0
       PEIE=1;      //habilito interrupcion periodica
       GIE=1;       //habilito interrupcion global
       TMR0=6;      //N° de incrementos (256-TMRO)
     
     

       //seteo salidas y entradas
       TRISA&=0B00100000;
       TRISB&=0B01110000;
       
       CMCON = 07; //DESACTIVO COMPARADORES
       //pongo todo a cero
       PORTB=0;
       PORTA=0;
       
       
         tr=min;//lo cargo con un minuto
         tluz=seg;//lo cargo con 30seg
           //mc=1;//poccicion de reoso
          
 while(1){
   
//Acceso a nivel_1

if(mn1==1){
            AccesoSalirNivel_1();
            }//fin if mn1==1

//Acceso a nivel_2
if(mn2==1){
            AccesoSalirNivel_2();
            }//fin if mn2==1
           
//cerrar
if(mc==1){
         Cerrar();
            }
           
}//fin while
}//fin main
     
     
     
     
     
//INTERRUPCION TMRO chequeo desborde cada 500us
//INTERRUPCION RB chequeo boton presionado
 void interrupt isr (){
                                                           
                      if(RBIE && RBIF){   
                        
                                     //pare de emergencia
                                     //if(pare==1){ mc=0; mn1=0; mn2=0; mbzz=0; tr=min; tluz=seg; sr=0; br=0; apg=0; cpg=0; bzz=0; aux1=0; aux2=0; aux3=0; }
                                     
                                     //cerrar
                                     //if((c &&(!pare))==1)
                              if(c==1){            if((c &&(!mn1))==1){
                                                       if((c &&(!mn2))==1){
                                                     if((c &&(!mc))==1){mc=1;aux3=1;}}}}
                                       //Acceso o salir nivel1
                                      //if((n1 &&(!pare))==1){
                                     if(n1==1){             if((n1 &&(!mn1))==1){
                                                            if((n1 &&(!mn2))==1){
                                                            if((n1 &&(!mc))==1){mn1=1;aux1=1;}}}}
                                         //Acceso o salir nivel2
                                      //if((n2 &&(!pare))==1){ 
                                     if(n2==1){            if((n2 &&(!mn1))==1){
                                                           if((n2 &&(!mn2))==1){
                                                           if((n2 &&(!mc))==1){mn2=1;aux2=1;}}}}
                                                           
                                                           RBIF=0;
                                                        }//FIN RBIF
                                            
                                            
                      if(T0IE && T0IF){
                                     
                                     
                                       if(mbzz==1){if(bzz==0)bzz=1; else bzz=0;} //bocina
                                     
                                      if(mn1&&sr){if(tr>=0){tr--;}} if(mn1&&ln1){if(tluz>=0){tluz--;}}//**//TIEMPOS ACCESO NIVE 1
                                      if(mn2&&br){if(tr>=0){tr--;}} if(mn2&&ln2){if(tluz>=0){tluz--;}}//**//TIEMPOS ACCESO NIVE 2
                                      if(mc&&br){if(tr>=0){tr--;}} //**//TIEMPOS CERRAR
                                                             
                                      T0IF=0;
                                               }//fin if desbordes             
                                                   }//fin interrupt




EN ROJO COPIE LO QUE NO ENTIENDO QUE ES??
&& ESTE SIMBOLO QUE SIGNIFICA?
LUEGO POR OTRA PARTE ME ESTA COSTANDO IDENTIFICAR LAS ENTRASDAS CON LO QUE DICE EL PROGRAMA, LAS ENTRADAS CREO QUE LAS TENGO CLARAS, N1 acceso nivel 1, N2 acceso nivel, c Salida, pare Boton de emergenciam, pero luego las variables no estoy entendiendo a que parte del programa se refiere cada una.

Pido disculpas por mi ignorancia en el tema y quizas estoy haciendo preguntas muy tontas pero agradezco la ayuda.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Proyecto estacionamiento de dos niveles
« Respuesta #1 en: 21 de Noviembre de 2018, 19:33:17 »
Voy respondiendo por parte porque me queda poco tiempo para salir..

Citar
EN ROJO COPIE LO QUE NO ENTIENDO QUE ES??

Lo que tenes en rojo es el calculo de cuanto debe cargar el Timer 0 para que produzca una interrupcion ( por desborde, es decir el paso de 0xFF a 0x00) cada 500ms

La entrada al circuito del Timer es de Fosc / 4, teniendo un cristal de 4Mhz eso es una entrada de una señal de reloj 1 Mhz, o mejor dicho que el Timer va a incrementarse cada 1 / 1Mhz = 1us

El preescaler es otro divisor de frecuencia mas, y en este caso usa un preescaler de 2 (hay un error ahi), en el caso del periodo por ser la inversa de la frecuencia este se multiplica, por eso luego del preescaler el timer 0 incrementaria cada 2us.

Finalmente el Timer cuenta hasta 255 ( 0xFF ) y cuando cuenta el 256 se pasa (por ser unicamente de 8 bits ) y vuelve a 0x00, aqui es donde ocurre la interrupcion. Entonces esta persona calculo que cargandole al Timer el valor de 6 cada ves que se desborda este lo haria cada 250 cuentas, pero cada cuenta o incremento dura 2us. Por lo tanto 250 * 2us = 500us. Es decir una interrupcion cada 500us ( 0.5ms ).

A esa interrupcion la utiliza de base de tiempo... Si supongamos necesitas 10 ms de tiempo, solo necesitas contar 10 ms / 0.5ms = 20 interrupciones. Al contar las 20 interrupciones sabes que pasaron ya 10ms. Asi con cualquier otro tiempo.

Citar
&& ESTE SIMBOLO QUE SIGNIFICA?

Ese simbolo es una AND logica...

https://es.wikipedia.org/wiki/Puerta_AND

Ejemplo:

if(tr==0&&sr==1)

Primero se analiza si tr es 0, y de alli tenes una salida Verdadero (1) o Falso (0), Luego se analiza sr si es igual a 1, y de alli tambien sale un valor Verdadero o Falso.. Finalmente queda la AND.. Que responde a la tabla que podes ver en la pagina de Wikipedia que te pase... El unico caso que salga verdadero es que ambas condiciones sean verdaderas. Si AMBAS se cumplen, va a entrar al IF.


 

anything