Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

28/06/2013 #1

Avatar de jmth

Programa de "ascensor"
Hace un rato largo he visto alguien que preguntaba sobre montacargas y tal y se me ha ocurrido que podría intentarlo. Es mi primer intento con el 16f877, ya que lo básico lo tengo asumido y solo quería aumentar el volumen y complejidad...

El caso es que primero, me detectaba bien en qué piso estaba (y ahora incluiré una imagen del circuito simulado) y cambiaba "perfectamente" el display (a excepción de que me da la salida negada , de lo que ya me ocuparé), pero los botones de "llamada" no daban señales de vida y por lo tanto los indicadores de ascenso/descenso no lucían.

Una vez arreglado esto ultimo simplemente cambiando en la simulación la interrupción en RB0 como flanco descendente, ha ocurrido la inversa: llamada bien, indicadores bien, pero "sensores" y display, nada. Y ya he intentado de todo, no se me ocurre nada y sigue igual. Cabe decir que utilizo todas las interrupciones que ofrece el puerto B.

Y ahora en cuanto al diseño de la simulación: como botones de llamada (A la izquierda + botón) he utilizado una combinación de interruptores (que hay que manejar uno a uno) para que al pulsar el botón se produzca interrupción en RB0 y lea el puerto A. Como "sensores de posición" he utilizado los interruptores de la derecha en el resto de pines que también tienen interrupción del puerto B, añadiendo además otra línea para evitar rebotes y retornos... Los LEDs indican hacia arriba o hacia abajo y el display la situación actual.

Añado que he intentado también simular las interrupciones con flanco descendente y nada.

Y aquí el código:
Código:
#include <16f877.h>
#use delay(clock=4000)
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte trisa=getenv("SFR:TRISA")
#byte trisb=getenv("SFR:TRISB")
#byte trisc=getenv("SFR:TRISC")
#byte trisd=getenv("SFR:TRISD")
#fuses NOWDT

int piso, modo, actual=0;

#int_ext
void isr_b0(){
   if (modo==0){ //si está en marcha no cambia nada
   if (porta==0b000001){
      piso=0;}
   if(porta==0b000010){
      piso=1;}
   if(porta==0b000100){
      piso=2;}
   if(porta==0b001000){
      piso=3;}}
   if (actual==piso){
      modo=0;} //parado, no tiene sentido
   if(actual<piso){
      modo=1; //subiendo
      portc=0b00000001;}
   if(actual>piso){
      modo=2; //bajando
      portc=0b00000010;}
    }

#int_rb
void isr_rb(){ 
   if(portb==0b00010000){
      actual=0; //estás en el bajo
      portd=0;
      if(actual==piso){
         modo=0; //y si estás ahí no te muevas
         portc=0;}
      while(portb==0b00010000); //espera a que suelte el interruptor
   }
   if(portb==0b00100000){
      actual=1; //estás en el piso 1
      portd=1;
      if(actual==piso){
         modo=0;
         portc=0;}
      while(portb==0b00100000);
   }
   if(portb==0b01000000){
      actual=2;
      portd=2;
      if(actual==piso){
         modo=0;
         portc=0;}
      while(portb==0b01000000);
   }
   if(portb==0b10000000){
      actual=3;
      portd=3;
      if(actual==piso){
         modo=0;
         portc=0;}
      while(portb==0b10000000);
   }
   }

void main(){
   piso=0;
   modo=0;
   actual=0;
   portb=0;
   porta=0;
   portc=0;
   portd=0;
   trisa=0xff;
   trisb=0xff;
   trisc=0;
   trisd=0;
   while(1){
      enable_interrupts(int_ext);
   enable_interrupts(int_rb);
   ext_int_edge(l_to_h);
   enable_interrupts(global);
      if(modo==0) portc=0;
      if(modo==1) portc=1;
      if(modo==2) portc=2;}
}
Muchas gracias a todos otra vez
29/06/2013 #2


Hola jmth

Estuve probando el circuito que se mira en la imagen que adjuntaste.
Primero lo desarrollé en el ISIS de Proteus.
Al código que adjuntaste le agregue algunas notas. Esto es muy conveniente para que otras personas lo entiendan mejor. Faltan muchas notas en él.
Compile ese código y se lo asigné al PIC.


A tu diseño del circuito le hice algunas modificaciones como puedes verlo el la imagen que te adjunto.
Nota que todos los interruptores y el botón deben ser normalmente cerrador(NC).

Al Iniciar la simulación, el ascensor, está en el Piso #0 como se ve en el Display.
Si abres, en el grupo de Sensores De Llamada, el correspondiente al Piso #3 luego presionas el Botón, encenderá el LED Subiendo. El Botón debe quedar cerrado(NC).
Cierra, en el grupo de Sensores De Llamada, el correspondiente al Piso #3 y luego, en el grupo de Sensores De Posición, abre y cierra el correspondiente al Piso #3. el LED Subiendo se apagará y el Display Indicará 3 porque ahora el ascensor se localiza en el tercer piso.

Como que con tu programa la secuencia de movimiento de los interruptores y el botón es:
1- Todos cerrados. El ascensor está en el piso #0.
2- Se abre cualquier interruptor del grupo Sensores De Llamada. Dejándolo abierto.
3- Se presiona el botón. Dejándolo cerrado.
4- Se cierra el interruptor del grupo Sensores De Llamada. Que se había abierto.
5- se abre y se cierra en Sensores De Posición. Correspondiente al que movimos en el grupo de Sensores De Llamada.
6- El LED que había encendido se apaga pues el ascensor ya llegó a su destino. El Display indica el número de piso donde está ahora.

saludos
a sus ordenes
29/06/2013 #3

Avatar de jmth

Vaya, así es, muchas gracias, pero voy a tener que preguntar ¿A qué se debe tanta complejidad? No entiendo que sea necesario tener todo conectado de ésa forma, ya que antes con circuitos simples como el que tenia hecho funcionaba. Muchísimas gracias.
29/06/2013 #4


Hola jmth

Dices:
¿A qué se debe tanta complejidad?
No entiendo que sea necesario tener todo conectado de ésa forma,
ya que antes con circuitos simples como el que tenia hecho funcionaba.

Pues entonces regresa al proyecto cuando con circuitos simples como el que tenias hecho funcionaba.

saludos
a sus ordenes
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

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