logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Jak zrobić żeby LED zapalała się na 1sek i gasła na 5sek

Kangurek1 15 Gru 2008 05:58 1694 4
REKLAMA
  • #1 5860927
    Kangurek1
    Poziom 13  
    Witam, najpierw napiszę opis działania a następnie napisze mój problem.

    Program, który piszę, jest prototypem do programu, który ,,ulepszy" moją szafkę. Gdy szafka będzie zamknięta, będzie wciśnięty przycisk PD0, i będzie włączona klimatyzacja (Port PB0). Wiatraczek ma zapalać się co 40 minut i działać 5 minut i tak w kółko. Gdy szafka zostanie otwarta, przycisk PD0 zostanie zwolniony i oświeci się oświetlenie, składające się z 1 LED i kolominatora(nie wiem czy to się tak nazywa ale to coś co skupia światło, tak jak to jest w latace). Jeśli ponownie zamknę szafkę oświetlenie będzie świecić jeszcze przez 30 sekund i wszystko zaczyna się od nowa. W prototypie klimatyzacje zastępuje dioda LED podłączona do PB0 a oświetlenie dioda LED podłączona do PB1

    Mój problem polega na czasowym włączaniu i wyłączaniu klimatyzacji. Do końca tego programu brakuje mi tylko tego fragmentu.

    Przedstawiam mój kod programu, i proszę o modyfikacje w razie błędów, oraz dopisanie tej brakującej części:

    /* "led.c" - program do ulepszenia szawki */
    /* układ ATmega 1MHz */
    /* PB0,PB1 - diody LED; PD0 - przycisk */
    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>               
    
    int main(void)
    {
        DDRB  |= _BV(0)|_BV(1);
        PORTB |= _BV(0);
        PORTB &= ~_BV(0);
        DDRD  &= ~_BV(0);
        PORTD |=  _BV(0);
    
    
       while(1)
      {
        if(!(PIND & 0x01))
        {
    /* Jeśli przycisk PD0 zostanie wciśnięty włącz port PB0 */
            PORTB = 0x01;
    /*Czekaj 5 sec. i włącz na 1 sec.*/
    
        }
        else
        {
    /*Gdy przycisk PD0 zostanie zwolniony,wyłącz port PB0 a załącz port PB1 po upływie 30 sec. */
            PORTB = 0x02;
            for(unsigned int i=0; i<3000; i++) _delay_ms(10);
    
        }
    
      }
    
    } 


    Przeniosłem z "Programowanie początkujący"
    [Dr.Vee]
  • REKLAMA
  • #2 5860974
    biker_xc
    Poziom 13  
    Witam,
    moje pytanko jest trochę z innej beczki: zamierzasz stosować klimatyzator czyli sprężarkę z chłodnicą czy po prostu wiatraczek?
    Pytam bo jeżeli to ma być klimatyzator to powinieneś wziąć pod uwagę czas między wyłączeniem a włączeniem, który powinien wynośić conajmniej kilka minut, czyli jeśli otworzysz szafkę i zamkniesz 2 minuty później, klimatyzator nie powinien się załaczać od razu.
    Pozdro
  • REKLAMA
  • #3 5861098
    Dr.Vee
    VIP Zasłużony dla elektroda
    Najprawdopodobniej tak napisany program nie będzie działał zgodnie z Twoimi oczekiwaniami. Na przykład układ nie wykryje otwarcia drzwi w trakcie, gdy włączona jest klimatyzacja. Albo - zamknięcie, otwarcie i ponowne zamknięcie drzwi w ciągu 30 sekund nie wydłuży czasu zapalenia diody.

    Najprościej do takiego problemu podejść tworząc model zachowania układu oparty na automacie.

    Wejściami takiego automatu byłyby:
    * stan przycisku
    * upływ zaprogramowanego czasu

    Wyjściami:
    * stan diody LED
    * stan klimatyzacji/wiatraczka
    * sygnał włączenia odmierzania konkretnej ilości czasu
    * anulowanie poprzedniego odmierzania

    Efektem ubocznym opisu za pomocą automatu będzie gruntowne przemyślenie operacji takiego systemu :) A więc mniej niespodzianek do poprawy później.

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #4 5862425
    Kangurek1
    Poziom 13  
    Dr.Vee napisał:
    . Albo - zamknięcie, otwarcie i ponowne zamknięcie drzwi w ciągu 30 sekund nie wydłuży czasu zapalenia diody.


    Nie chciałbym poprawiać kogos kto sie na tym zna ale testowalem czy zamkniecie i otwarcie drzwi w ciagu 30 sekund nie wpłynie jakoś na świecenie diody. LED cały czas się świeciła, chyba że po 30 sekundach trzymania przycisku go nie puściłem to przestała, starałem się jak najprościej to rozwiązać. A jak to bedzie działało ze zwykłym wiatraczkiem to nie wiem bo niestety nie mam tego fragmentu kodu. :(
  • #5 5865026
    Dr.Vee
    VIP Zasłużony dla elektroda
    Kangurek1 napisał:
    Nie chciałbym poprawiać kogos kto sie na tym zna ale testowalem czy zamkniecie i otwarcie drzwi w ciagu 30 sekund nie wpłynie jakoś na świecenie diody. LED cały czas się świeciła, chyba że po 30 sekundach trzymania przycisku go nie puściłem to przestała, starałem się jak najprościej to rozwiązać.

    Miałem na myśli to, że Twój program w trakcie czekania na upływ 30 sekund nie jest w stanie wykryć żadnej zmiany przycisku.

    Jak dla mnie wymaganie "dioda gaśnie po 30 sekundach od zamknięcia szafki" oznacza, że jeśli w ciągu tych 30 sekund szafkę otworzę i jeszcze raz zamknę, to czas powinien być odliczany od nowa (od ostatniego zamknięcia) - a u Ciebie tak nie jest.

    Oczywiście jeśli wszystko działa tak jak chcesz, to nie musisz nic zmieniać, w końcu to Twój program :)

    Pozdrawiam,
    Dr.Vee
REKLAMA