Botón de parada - Proton IDE

Hola a todos, soy nuevo en esto de los microcontroladores y en el lenguaje del Proton IDE.

Tengo un proyecto que es hacer un pendulo mediante dos barras LED, conectadas al puerto B y al puerto C respectivamente, pero con la condición de que pare cuando presione un pulsador e inicie el péndulo cuando presione otro pulsador. Ya hice que el pendulo iniciara cuando presione un botón, pero no logro hacer que pare. Adjunto mi código, quizás hay una manera más corta de hacerlo pero así lo hice yo:
Código:
Device 16F870
XTAL = 20
ALL_DIGITAL=true

TRISB = 0
PORTB = 0
TRISC = 0
PORTC = 0
TRISA = 1

Symbol BTN1 = PORTA.0
Symbol BTNStop = PORTA.1

Inicio:
If BTN1=1 Then
    PORTB.0 = 1
    DelayMS 200
    PORTB.0 = 0
    PORTB.1 = 1
    DelayMS 200
    PORTB.1 = 0
    PORTB.2 = 1
    DelayMS 200
    PORTB.2 = 0
    PORTB.3 = 1
    DelayMS 200
    PORTB.3 = 0
    PORTB.4 = 1
    DelayMS 200
    PORTB.4 = 0
    PORTB.5 = 1
    DelayMS 200
    PORTB.5 = 0
    PORTB.6 = 1
    DelayMS 200
    PORTB.6 = 0
    PORTB.7 = 1
    DelayMS 200
    PORTB.7 = 0
    PORTC.0 = 1
    DelayMS 200
    PORTC.0 = 0
    PORTC.1 = 1
    DelayMS 200
    PORTC.1 = 0
    PORTC.2 = 1
    DelayMS 200
    PORTC.2 = 0
    PORTC.3 = 1
    DelayMS 200
    PORTC.3 = 0
    PORTC.4 = 1
    DelayMS 200
    PORTC.4 = 0
    PORTC.5 = 1
    DelayMS 200
    PORTC.5 = 0
    PORTC.6 = 1
    DelayMS 200
    PORTC.6 = 0
    PORTC.7 = 1
    DelayMS 200
    PORTC.7 = 0
    PORTC.6 = 1
    DelayMS 500
    PORTC.6 = 0
    PORTC.5 = 1
    DelayMS 200
    PORTC.5 = 0
    PORTC.4 = 1
    DelayMS 200
    PORTC.4 = 0
    PORTC.3 = 1
    DelayMS 200
    PORTC.3 = 0
    PORTC.2 = 1
    DelayMS 200
    PORTC.2 = 0
    PORTC.1 = 1
    DelayMS 200
    PORTC.1 = 0
    PORTC.0 = 1
    DelayMS 200
    PORTC.0 = 0
    PORTB.7 = 1
    DelayMS 200
    PORTB.7 = 0
    PORTB.6 = 1
    DelayMS 200
    PORTB.6 = 0
    PORTB.5 = 1
    DelayMS 200
    PORTB.5 = 0
    PORTB.4 = 1
    DelayMS 200
    PORTB.4 = 0
    PORTB.3 = 1
    DelayMS 200
    PORTB.3 = 0
    PORTB.2 = 1
    DelayMS 200
    PORTB.2 = 0
    PORTB.1 = 1
    DelayMS 200
    PORTB.1 = 0
    PORTB.0 = 1
    DelayMS 200
    PORTB.0 = 0
EndIf GoTo Inicio
 
Con tanto retardo el paro se dará hasta que se cumplan todos, y eso, dejando el pulsador de paro presionado.
Mejor cambia de puerto y usa la interrupción externa (RB4<>RB0) para los pulsadores, esperando que los retardos no las afecten.
 
Que tal así

Código:
Device 16F870
Xtal = 20
All_Digital=true

TRISB = 0
PORTB = 0
TRISC = 0
PORTC = 0
TRISA = 1

Symbol BTN1 = PORTA.0
Symbol BTNStop = PORTA.1


Dim i As Byte


Inicio:

If BTN1=1 Then
    PORTB.0 = 1
    GoSub Retardo'DelayMS 200
    PORTB.0 = 0
    PORTB.1 = 1
    GoSub Retardo'DelayMS 200
    PORTB.1 = 0
    PORTB.2 = 1
    GoSub Retardo'DelayMS 200
    PORTB.2 = 0
    PORTB.3 = 1
    GoSub Retardo'DelayMS 200
    PORTB.3 = 0
    PORTB.4 = 1
    GoSub Retardo'DelayMS 200
    PORTB.4 = 0
    PORTB.5 = 1
    GoSub Retardo'DelayMS 200
    PORTB.5 = 0
    PORTB.6 = 1
    GoSub Retardo'DelayMS 200
    PORTB.6 = 0
    PORTB.7 = 1
    GoSub Retardo'DelayMS 200
    PORTB.7 = 0
    PORTC.0 = 1
    GoSub Retardo'DelayMS 200
    PORTC.0 = 0
    PORTC.1 = 1
    GoSub Retardo'DelayMS 200
    PORTC.1 = 0
    PORTC.2 = 1
    GoSub Retardo'DelayMS 200
    PORTC.2 = 0
    PORTC.3 = 1
    GoSub Retardo'DelayMS 200
    PORTC.3 = 0
    PORTC.4 = 1
    GoSub Retardo'DelayMS 200
    PORTC.4 = 0
    PORTC.5 = 1
    GoSub Retardo'DelayMS 200
    PORTC.5 = 0
    PORTC.6 = 1
    GoSub Retardo'DelayMS 200
    PORTC.6 = 0
    PORTC.7 = 1
    GoSub Retardo'DelayMS 200
    PORTC.7 = 0
    PORTC.6 = 1
    GoSub Retardo'DelayMS 500
    PORTC.6 = 0
    PORTC.5 = 1
    GoSub Retardo'DelayMS 200
    PORTC.5 = 0
    PORTC.4 = 1
    GoSub Retardo'DelayMS 200
    PORTC.4 = 0
    PORTC.3 = 1
    GoSub Retardo'DelayMS 200
    PORTC.3 = 0
    PORTC.2 = 1
    GoSub Retardo'DelayMS 200
    PORTC.2 = 0
    PORTC.1 = 1
    GoSub Retardo'DelayMS 200
    PORTC.1 = 0
    PORTC.0 = 1
    GoSub Retardo'DelayMS 200
    PORTC.0 = 0
    PORTB.7 = 1
    GoSub Retardo'DelayMS 200
    PORTB.7 = 0
    PORTB.6 = 1
    GoSub Retardo'DelayMS 200
    PORTB.6 = 0
    PORTB.5 = 1
    GoSub Retardo'DelayMS 200
    PORTB.5 = 0
    PORTB.4 = 1
    GoSub Retardo'DelayMS 200
    PORTB.4 = 0
    PORTB.3 = 1
    GoSub Retardo'DelayMS 200
    PORTB.3 = 0
    PORTB.2 = 1
    GoSub Retardo'DelayMS 200
    PORTB.2 = 0
    PORTB.1 = 1
    GoSub Retardo' DelayMS 200
    PORTB.1 = 0
    PORTB.0 = 1
    GoSub Retardo 'DelayMS 200
    PORTB.0 = 0
EndIf GoTo Inicio

Retardo:
         For i = 1 To 10
         If  BTNStop = 0 Then
               PORTB = 0
               PORTC = 0
                GoTo Inicio
         EndIf
         DelayMS 20
         Next
         Return

End
 
Última edición:
Porque así verificas cada 20ms(20ms por 10 veces es igual al retardo de 200ms) si se pulso el botón de parada en cambio si pones un delayms de 200ms tienes que esperar todo ese tiempo para verificar cualquier acción.

Es una de las formas, la otra es usar una interrupción como ya de adelanto D@rkbytes la cual es mas precisa pero tal vez en este caso no es necesaria.

Yo le agregaría un delayms de 50ms o menos al final del endif general y antes de ir al inicio(goto inicio) en las decisiones generales para evitar posibles problemas de revotes en los pulsadores pero hay que probar.
 
¿Con un ciclo while se puede hacer que pare en el led en el que vaya y que cuando presione btnstop vuelva a iniciar donde quedo?

Con esta configuración lo hace pero hay que mantener el botón presionado para que pare y apaga todas los puertos.

Me explico mejor, quiero lograr que al presionar BTNStop se pause la secuencia en el LED por el que iba y al volver a presionar siga funcionando normalmente, como un boton play/pause.
 
Como tenes estructurado el programa, no lo veo posible.

Puedes sacar el reseteo de los puertos dentro del retardo pero quedaría congelada la secuencia y al arrancar comenzaría por la primer acción después del inicio.

Piensa tú, como lo puedes lograr a ver que piensas.

Ayudita ... estudia la sentencia Case y como implementarla para que haga lo que quieres u otra.

Cuando uno programa es como cuando va a hacer un edificio, no podes agregar cosas así por que sí siempre por eso es importante saber que se desea hacer.
 
Atrás
Arriba