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

[atmega8][C] - timer - zapalanie diody na 10s po przyciśnięciu przycisku.

morthell 08 Wrz 2013 17:07 3849 15
  • #1 12714223
    morthell
    Poziom 2  
    Witam.

    Niedawno zaopatrzyłem się w mikrokontroler atmega8, postanowiłem więc trochę się pobawić w rożne projekty.

    Próbuje zbudować program który jest podobny do systemu automatycznego oświetlenia w domu na czujkach PIR.

    Otóż, chcę aby przyciski wirtualizowały czujkę w taki sposób że naciśnięcie przyciska jest równo znaczne z wykryciem ruchu przez czujkę. Chcę aby program zapalał diodę led po przyciśnięciu przycisku na 10s. Jeśli jeszcze raz nacisnę przycisk odliczanie 10s powinno się resetować a dioda wciąż palić. Jednak jeśli jednak 10s minie to dioda ma zgasnąć. Zbudowałem program na timerze, jednak nie działa on tak jak powinien:

    1. Dioda gaśnie po określonym czasie, lecz po kolejnym takim samym czasie znów się zapala;
    2. Puszczenie przycisku powoduje że dioda pozostaje na stanie w jakim była przez wyłączeniem jej tj. jeśli się paliła to dalej się pali, jeśli zgasła to jest zgaszona.

    I tu jest moje pytanie, gdzie jest błąd w moim myśleniu?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Docelowo w programie chcę aby działały 3 diody stąd też tyle wejść i wyjść zdefiniowanych.

    Pozdrawiam.
  • Pomocny post
    #2 12714348
    ZbeeGin
    Poziom 39  
    morthell napisał:
    I tu jest moje pytanie, gdzie jest błąd w moim myśleniu?

    Nie masz żadnej zmiennej, która by stanowiła część niezbędnego w tym przypadku "programowego przerzutnika RS". Obecnie opierasz się tylko na stanie pinów wejściowych.

    Każdy przycisk powinien mieć swój licznik, pomniejszany w przerwaniu; oraz zmienną pamiętającą ostatni stan wejścia i wyjścia. Potem tylko dopiszesz odpowiednią logikę i gotowe.
  • Pomocny post
    #3 12714878
    BlueDraco
    Specjalista - Mikrokontrolery
    1. Zaprogramuj timer w tryb CTC, np. na częstotliwość 100 Hz.

    W przerwaniu timera:
    - sprawdź, czy przycisk naciśnięty; jeśli tak - zapal diodę i załaduj wartość 1000 do zmeinnej - "timera programowego".
    - jeśli zmienna timera ma wartość różną od zera, zdekrementuj ją, a jeśli zdekrementowała się do 0 - zgaś diodę.

    Razem daje to 5 linii kodu w przerwaniu timera. To wszystko.
  • #4 12716319
    morthell
    Poziom 2  
    Po zaprogramowaniu timera w tryb CTC oraz skorzystaniu z porad, dioda zapala się lecz nie gaśnie po określonym czasie. Nie jestem pewny co źle zrobiłem, wykorzystanie innej zmiennej sprawiało że dioda w ogóle się nie zapala.
    Prawdopodobnie źle zaprogramowałem timer, a jako że info na timer timera CTC z przerwaniem znalazłem tylko po angielsku więc bardzo prawdopodobne że tam coś pochrzaniłem :>

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
  • #5 12716393
    BlueDraco
    Specjalista - Mikrokontrolery
    Zrobiłeś coś zupełnie innego, niż napisałem.

    Miało być:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 12717849
    Konto nie istnieje
    Konto nie istnieje  
  • #7 12718227
    BlueDraco
    Specjalista - Mikrokontrolery
    Tu akurat żadnych niuansów nie ma - w C jest to zupełnie jednoznaczne, bo standard wymusza short-circuit.
  • #8 12719252
    excray
    Poziom 41  
    BlueDraco napisał:
    if (KEY_PRESSED)
    {
    ...
    }

    Ten warunek jak wynika z opisu powinien być na zbocze a nie na stan.
  • #10 12719520
    Konto nie istnieje
    Konto nie istnieje  
  • #12 12719612
    Konto nie istnieje
    Konto nie istnieje  
  • #13 12719978
    rs07
    Poziom 20  
    Witaj Albert.
    Według mnie Twój warunek to : " jeżeli cnt i cnt pomniejszone o 1 róna się zero" co nigdy nie może być spełnione.
    Moja wersja to : " jeżeli cnt lub cnt pomniejszone o 1 równa się zero"
  • #14 12720042
    Konto nie istnieje
    Konto nie istnieje  
  • #15 12720444
    BlueDraco
    Specjalista - Mikrokontrolery
    rs07:

    Warunek, który zaproponowałeś, daje się zapisać znacznie prościej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety, Twój kod nie działa poprawnie, a mój - działa. ;)

    W C zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jest równoważny zapisowi:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod, który pokazałem, realizuje funkcję "jeśli cnt nie jest zerem to zdekrementuj cnt i jeśli zdekrementowałeś do zera - wyłącz diodę".

    Ech... Jedna linijka kodu, trzy operatory, a ile wątpliwości i głosów w dyskusji... ;)
REKLAMA