Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATtiny13a][C] - Przerwania - przycisk, timer i wdt

Zby. 26 Oct 2016 00:17 1104 6
  • #1
    Zby.
    Level 8  
    :arrow: robię mały projekt: jeden słupek potrójnej sygnalizacji świetlnej, z przyciskiem, który będzie służył do zmiany długości cyklu świateł (jeden z pięciu predefiniowanych).

    :arrow: na chwilę obecną mam działające światełka, dodałem przerwanie przycisku (będąc świadomym jego prymitywności/braku poprawności działania), teraz chciałem dodać timer który pozwoli na obsługę przycisku (eliminacja drgań), rozwiązanie wzorowane na:
    http://mikrokontrolery.blogspot.com/2011/03/epp-eliminacja-drgan-stykow-omicronns.html

    :!: utknąłem - światełka nie działają, przycisk również nie. :!:

    :arrow: poniżej kod i schemat



    :?: co robię nie tak, jak to poprawić? - nie mogę znaleźć podobnego rozwiązania (timer-wdt-przerwanie zewnętrzne), choć jestem przekonany, że ktoś to już wcześniej robił!

    Wszelki inne konstruktywne uwagi na temat kodu również mile widziane.

    :arrow: odpada eliminacja drgań styków na zewnątrz układu, za pomocą RC, gdyż całość poza ledami i rezystorami zostanie końcowo umieszczona w klocku lego 2x4, więc nie mam miejsca :)

    [ATtiny13a][C] - Przerwania - przycisk, timer i wdt

    Code: c
    Log in, to see the code
  • #2
    excray
    Level 40  
    Kolego ten procesor ma 64 bajty pamięci RAM, którą jeszcze współdzieli ze stosem. A Ty zarezerwowałeś tylko na wstępie 63 bajty pod zmienne. Na dodatek pod zmienne bajtowe zarezerwowałeś inty. O zmiennych w procedurach nie wspomnę. Po drugie, skąd Ci przyszło do głowy, że Timer 0 będzie działać w głębokim uśpieniu?
    Jeszcze tak na marginesie. Czy nie przyszło Ci do głowy, że jak będziesz czytać stan przycisków w przerwaniu co 1/8 sekundy, to w praktyce masz już eliminacje styków załatwioną? I nie musisz wtedy angażować, ani dodatkowego timera, ani dodatkowego przerwania do obsługi przycisków?
  • #3
    BlueDraco
    MCUs specialist
    1. Definiujesz stałe w pamięci RAM, zamiast w ROM.

    2. Niepotrzebnie używasz przerwania WDT i portu. Wystarczy jedno przerwanie timera o częstotliwości rzędu 100 Hz, w którym sprawdzasz przycisk, odliczasz czasy i zmieniasz światła.
  • #4
    excray
    Level 40  
    BlueDraco wrote:
    Niepotrzebnie używasz przerwania WDT i portu.

    Odnoszę wrażenie, że projekt jest zasilany z baterii, a co za tym idzie powinien być jak najbardziej energooszczędny. A do tego przerwanie z WDT jest przydatne.
  • #5
    BlueDraco
    MCUs specialist
    Ale diody świecą więc jakieś przerwanie timera o stałej częstotliwości niewiele tu zmieni, jśeli chodzi o pobór prądu timera też. Może to być i watchdog, jeśli da się z niego uzyskać te 50..100 Hz - nie pamiętam już, jak to było w AVR.
  • #6
    excray
    Level 40  
    Żeby działał timer to można uśpić w co najwyżej Iddle, a między Iddle, a Power Down jest przepaść jeśli chodzi o zużycie. W czasie świecenia LEDa to rzeczywiście nic, ale jak chcemy uśpić po zabawie to już jednak coś. WDT masz podział co 2. Czyli jak 125ms to za dużo, to niżej masz 64ms, 32ms i najmniej 16ms. A moim zdaniem WDI w zupełności pokrywa zapotrzebowania tego projektu. Jak będziesz czytać stan przycisków co 125ms, czy 64ms to zupełnie nie potrzebujesz dodatkowego debouncingu.
  • #7
    Zby.
    Level 8  
    BlueDraco wrote:
    1. Definiujesz stałe w pamięci RAM, zamiast w ROM.

    2. Niepotrzebnie używasz przerwania WDT i portu. Wystarczy jedno przerwanie timera o częstotliwości rzędu 100 Hz, w którym sprawdzasz przycisk, odliczasz czasy i zmieniasz światła.


    Dzięki z podpowiedzi. Jestem w fazie modyfikacji programu.
    Na chwilę obecną, jak tylko przeczytałem i złapałem się za głowę, ogarnąłem zmienne przede wszystkim pozbyłem się tych intów, skoro wystarczy mniej - to czemu używać więcej. Przyzwyczajenie z pisania programów na PCty, gdzie nie walczy się o każdy bajt pamięci :)

    Druga rzecz, to wywaliłem przerwanie do obsługi przycisku - rzeczywiście dam radę zrobić to w przerwaniu WDT. Teraz tylko widzę, że mam jeszcze jakiś problem z obsługą tego przycisku. :arrow: póki co jeszcze mam pomysł co zrobić samemu, więc nie pytam.

    :idea: Prośba do moderatora by jeszcze nie zamykać tego wątku. Niedługo znajdę trochę czasu by ruszyć dalej. Wtedy pewnie pojawią się pytania...
    Oczywiście jak ukończę "dzieło", podzielę się - a także chętnie wysłucham konstruktywnych uwag. :)

    Moderated By dondu:

    O zamknięciu tematu decydujesz sam klikając odpowiedni przycisk :)