necesito el programa c para un temporizador de 5 minutos [cerrado]

-3

Estoy construyendo un proyecto para un baño de ciclismo en el que el motor sube y baja. el interruptor micrlimit detecta y amp; posición hacia abajo. una vez que se activa el interruptor, el motor se apaga y el temporizador arranca. después de 5 minutos, el motor arranca en sentido inverso y se mueve hasta que se dispara, el interruptor continúa indefinidamente. Yo había escrito un programa como el siguiente

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>


int main(void){
    DDRD=0x00;// for input port-UP & DOWN Micro Switch
    DDRC=0xff;// for output port- UP & DOWN Motor
    while(1){
        if(PIND==0xff)// checking the status of PIN PD5 & PD6, if both is '1', turns ON the down Motor
            _delay_ms(100); // for debouncing of switch
        PORTC=0x40;// turns ON down motor

        if(PIND==0xbf)// checking the status of PIN PD6 (Dn sw), if it is '0', turns off the down Motor
        {
            _delay_ms(100); // for debouncing of switch
            PORTC=0x00;   // Turning off the down Motor
            int32_t second;
            for (second=0; second <5LL*60;++second)
            {
                if (second > 5) 
                {
                    PORTC=0X80; // turn ON UP motor
                } else 
                { PORTC = 0x00;}
            }
            { 
                if(PIND==0xdf);// checking the status of PIN PD5 (UP SW), if it is '0' turns off the UP motor, 
                _delay_ms(100); // For debouncing of switch
                PORTC=0x00;// Turning off the UP Motor
                int32_t second;
                for (second=0; second <5LL*60;++second)
                {
                    if (second > 5) 
                    {
                        PORTC=0X40; // turn ON DOWN motor
                    } else
                    { PORTC = 0x00;}
                }

            }

            { 
                if(PIND==0x9f);// checking the status of PIN PD5 & 6 if both 0 then stop motor
                _delay_ms(100); // for debounicng of switch
                PORTC=0x00; // trun off up/down motor


            }
        }
    }
}

los pls aconsejan que esto funcionará

    
pregunta Dorai Swamy

1 respuesta

2

Tu código no recibe el premio de estilo. Puede compilarse, pero no funcionará como se esperaba.

Primero necesitas definir lo que quieres hacer. Cree un diagrama de flujo .

Luego, observa cómo creas una máquina de estado en C. Porque parece un trabajo perfecto para una máquina de estado.
Cree una pequeña aplicación ficticia, tal vez, en la PC.

También querrá buscar la forma de comparar, para entradas establecidas.
if(PIND==0xdf); no es el camino. Prueba if(PIND & (1<<PIN) .

Entonces habrás aprendido mucho y quizás puedas ejecutar esto en el objetivo.

O, obtienes un Siemens LOGO (PLC) y lo programas con una variante IEC 61131-3.
Le proporcionará los componentes básicos para construir esto de manera confiable y rápida. Al pequeño costo del hardware.

Para responder a su título, para crear un tiempo de espera de este tipo en una plataforma integrada, se usa un temporizador de software. Una forma de hacerlo es con un tick del sistema.

uint32_t stim1 = 0; // unsigned 32 bit software timer 1

const unsigned int interval = 20; // Interval of hardware timer in milliseconds

// Timer 1 Compare interrupt, constant interval, 20 ms for example.
ISR (TIMER1_COMPA_vect)
{    
    // Saturating increment software timer1
    if(stim1 < (0xFFFFFFFF-interval))
      stim1 += interval;
}

int main(void){
  init_tim1();

  while(1){
    if(stim1 > 1000){      // wait 1 second
      PORTB ^= (1 << 0);   // toggle led
      stim1 = 0;           // reset software timer
    }
  }
}
    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas