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:
Muchas gracias a todos otra vez
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
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
Adjuntos
Última edición por un moderador: