Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Attiny25][C] Sprawdzenie programu

kuba369 29 Paź 2013 23:23 1086 8
  • #1 29 Paź 2013 23:23
    kuba369
    Poziom 9  

    Witam
    Prosiłbym o sprawdzenie programu na attiny.

    Po odpaleniu pali się tylko dioda, nie reaguje na przycisk.

    jak ma działać:

    - procesor działa w pustej pętli.

    opcja 1:

    - po naciśnięciu przycisku wchodzi w stage1 (włącza przekaźnik) i zapala diodę.
    - jeżeli ten przycisk jest trzymany powyżej 2 sek (nie puszczony od pierwszego naciśnięcia) to przechodzi do stage2 (włącza na 2s drugi przekaźnik).
    - po ponownym naciśnięciu wyłącza wszystko i wraca do głównej pętli.

    opcja 2:

    - po krótkim naciśnięciu (i puszczeniu) wchodzi w stage1 i zapala diodę.
    - po ponownym krótkim naciśnięciu wchodzi w stage2.
    - po trzecim krótkim naciśnięciu wyłącza i wraca do głównej pętli.

    jest jeszcze jedno

    - gdy jest w stage1 i przytrzyma się przycisk przez 2 sek. - wyłącza wszystko i wraca do głównej pętli.


    Przekaźniki oraz diody podpięte wg programu. Przycisk podpięty do INT0 (PB2) i do +5V.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 8
  • #2 30 Paź 2013 10:20
    BlueDraco
    Specjalista - Mikrokontrolery

    I pomyśleć, że zrobienie tego w przerwaniu timera bez przerwania przycisku zajęłoby < 20 linii...

    0
  • #3 30 Paź 2013 19:22
    kuba369
    Poziom 9  

    Ok ale jak by wtedy procesor pozostawał w uśpieniu? z każdym wywołaniem przerwania sprawdzał by wtedy stan przycisku - przynajmniej tak to rozumiem.

    Mógłby ktoś powiedzieć czy dobrze jest ustawione wywołanie przerwania INT0? Czy jest zboczem narastającym i czy odpowiednio pod to podłączyłem przycisk.

    0
  • Pomocny post
    #4 30 Paź 2013 21:11
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zacznijmy od tego, że:

    kuba369 napisał:
    Przycisk podpięty do INT0 (PB2) i do +5V.

    Jaki według Ciebie jest poziom na wejściu INT0, gdy przycisk nie jest naciśnięty?

    Zmienna status także powinna być volatile.


    Drobiazg:

    cli() i sei() w przerwaniu są zbędne, ponieważ:

    Datasheet napisał:
    The I-bit is cleared by hardware after an interrupt has occurred, and is set by the RETI instruction to enable subsequent interrupts.



    Zdecyduj się na wykorzystywanie makr bit_is_set(), _BV() lub przesunięć bitowych (1<<coś). Mieszanie tych metod utrudnia rozumienie kodu. Ja sugeruję stosowanie tylko przesunięć bitowych.

    0
  • #5 30 Paź 2013 22:53
    kuba369
    Poziom 9  

    Ok widzę wisi on w powietrzu. Czyli rozumiem że bezpieczniej i chyba łatwiej by było przycisk do masy, int0 na zbocze opadające i ustawić rezystor podciągający do vcc? Chyba że można wymusić stan niski na wejściu.
    Trochę pomieszałem.

    0
  • #6 30 Paź 2013 23:16
    dondu
    Moderator Mikrokontrolery Projektowanie

    kuba369 napisał:
    Ok widzę wisi on w powietrzu. Czyli rozumiem że bezpieczniej i chyba łatwiej by było przycisk do masy, int0 na zbocze opadające i ustawić rezystor podciągający do vcc?

    O właśnie :)
    No chyba, że chcesz wykorzystać tryb snu Power Down, wtedy musisz ustawić przerwanie od stanu niskiego.

    Ale oczywiście uwaga BlueDraco jest istotna co opisał tutaj: http://mikrokontrolery.blogspot.com/2011/02/o-drganiach-stykow-bez-bajek-przykad.html
    Przykład na AVR możesz wziąć stąd: http://mikrokontrolery.blogspot.com/2011/03/Obwiednia-ADSR-by-Maciej-Lukaszewicz.html

    0
  • #7 02 Lis 2013 20:32
    kuba369
    Poziom 9  

    Ok walczę dalej. Przepisałem trochę kod. Przerwanie od int0 działa i chyba tylko tyle. Coś chyba nie tak z timer. Niby zrobiłem wg. przykładu powyżej ale działać mnie to nie chce.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 03 Lis 2013 11:37
    BlueDraco
    Specjalista - Mikrokontrolery

    Zrób to w przerwaniu timera, bez zbędnego i szkodliwego przerwania przycisku - zajmie to jakieś 15 linii kodu.

    0
  • #9 03 Lis 2013 22:46
    kuba369
    Poziom 9  

    Jest to zasilane z baterii więc będę planował użyć sleepmode. A coś musi z niego uC wyrwać.

    W kodzie powyżej większość jest w przerwaniu timera, aczkolwiek nie działa. W przerwaniu int0 jest tylko konfig timera.

    0