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

Atmega32 Bascom i obsługa przycisku

janek1815 02 Maj 2011 21:50 2650 16
REKLAMA
  • #1 9462590
    janek1815
    Poziom 38  
    Mamy taki program:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Plus minus i ok to Aliasy portu D. Jak zrobić aby podczas naciśnięcia przycisku było tylko krótkie BEEP pomimo trzymania dalej naciśniętego przycisku?
  • REKLAMA
  • #2 9462717
    Fredy
    Poziom 27  
    Po kolei:

    1) sprawdź czy został przycisk naciśnięty, jeśli tak to
    2) włącz buzzer
    3) czekaj chwile
    4) wyłącz buzzer
    5) czekaj aż przycisk zostanie puszczony wolno
  • #3 9462729
    janek1815
    Poziom 38  
    No właśnie nie mogę czekać aż przycisk zostanie puszczony wolno ponieważ np. ktoś go będzie trzymał np 10s a beeper będzie cały czas wył
  • REKLAMA
  • #4 9462776
    Fredy
    Poziom 27  
    A nie możesz wykorzystać przerwania od zbocza np INT0? Jak pojawi się dodatnie zbocze to robisz krótki sygnał i program pracuje dalej. Dopiero jak ktoś puści przycisk i znów naciśnie pojawi się znów zbocze narastające które może wywołać przerwanie.

    Ideałem byłoby abyś po pojawieniu się przerwania od narastającego zbocza, włączał Buzzer potem uruchamiał Timer i w przerwaniu od przepełnienia Timera kasować Buzzer.
    Wtedy wszystko się dzieje w tle programu.
  • #5 9462790
    janek1815
    Poziom 38  
    Przerwania zarezerwowane. Powoli myślę nad Atmega64 ponieważ cały czas kręcę się w okolicach 95% pamięci Flash. Czy na pewno nie ma innego sposobu? (ja bynajmniej nie mogę nic wymyśleć)
  • #6 9462816
    Fredy
    Poziom 27  
    Nie wiem jak wygląda Twój program, ale jakimś rozwiązaniem może być też "wyłapywanie narastającego zbocza".
    Czyli robisz to tak - zapamiętujesz stan przycisku, potem badasz go ponownie, jeśłi stary stan jest niski a nowy jest wysoki to wywołujesz dźwięk na chwile.
    Wtedy wcisnięcie na stałe nie spowoduje tego że będzie ciągły dźwięk, musi dopiero nastąpić zbocze aby go uaktywnić.
  • #7 9463113
    dondu
    Moderator na urlopie...
    janek1815 napisał:
    Powoli myślę nad Atmega64 ponieważ cały czas kręcę się w okolicach 95% pamięci Flash. Czy na pewno nie ma innego sposobu?

    Sposób jest bardzo prosty ... zmień język na C lub assembler.
    W drugiej kolejności zastanów się nad zewnętrznym flashem, bo jak sądzę tę pamięć zajmują Ci próbki dźwięków, a nie program.

    janek1815 napisał:
    Przerwania zarezerwowane.

    Timery i ADC także?

    Fredy napisał:
    ... ale jakimś rozwiązaniem może być też "wyłapywanie narastającego zbocza"...

    Jak najbardziej, ale trzeba się zastanowić, czy drgania styków będą miały jakieś konsekwencje.
  • #8 9463474
    janek1815
    Poziom 38  
    Cytat:

    Sposób jest bardzo prosty ... zmień język na C lub assembler.

    Też nad tym myślałem ale to proste nie będzie

    Cytat:
    W drugiej kolejności zastanów się nad zewnętrznym flashem, bo jak sądzę tę pamięć zajmują Ci próbki dźwięków, a nie program.


    Nie ma żadnych próbek dźwiękowych program działa od kilku lat i jest ciągle udoskonalany. Buzzer znajduje się na płytce od dłuższego czasu i po prostu chciałem go uruchomić aby sygnalizować naciśnięcie przycisków krótkim beep Program ma 2400lini w dodatku pisanych tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Gdybym pisał każde polecenie w osobnej linii pewnie długość miała by około 4000 linii

    Cytat:
    Timery i ADC także?

    Wykorzystuję Timer1 do odliczania czasu 5 timerów Timer0 jest wolny ale będzie potrzebny prawdopodobnie do komunikacji po RS-485

    Cytat:
    ... ale jakimś rozwiązaniem może być też "wyłapywanie narastającego zbocza"...

    Jak najbardziej, ale trzeba się zastanowić, czy drgania styków będą miały jakieś konsekwencje.

    Nie będzie miało wpływu tam gdzie ma stosuję polecenie Bitwait
  • #9 9463498
    arktik1
    Poziom 27  
    A może DEBOUNCE?
  • #10 9463820
    dondu
    Moderator na urlopie...
    janek1815 napisał:
    Też nad tym myślałem ale to proste nie będzie

    Kiedyś ten krok trzeba wykonać, tym bardziej gdy piszesz spore programy.

    janek1815 napisał:
    Nie ma żadnych próbek dźwiękowych program działa od kilku lat i jest ciągle udoskonalany.

    32kB to całkiem sporo jak na program (oczywiście nie wiem do czego służy).

    janek1815 napisał:
    Nie będzie miało wpływu tam gdzie ma stosuję polecenie Bitwait

    Niestety Bascom-a nie znam ale zakładam, że wiesz co robisz.
  • REKLAMA
  • #11 9463885
    piotrva
    VIP Zasłużony dla elektroda
    Bitwait zatrzymuje cały program (to pętla typu
    
    Do
    Loop Until wartosc=0
    

    )
  • #12 9463947
    janek1815
    Poziom 38  
    Cytat:

    32kB to całkiem sporo jak na program (oczywiście nie wiem do czego służy).


    Program służy do utrzymania klimatu w pomieszczeniu:
    -8 ds18b20
    -czujnik co2
    - mierzy temperatury wilgotność dwutlenek węgla
    steruje ogrzewaniem nawilżaniem osuszaniem ,klimatyzacją zarówno freonową jak i wodną (woda ze studni przez chłodnicę i zrzut do drugiej studni) lub wykorzystuje chiller w tym wypadku mierzy temperaturę wyjściowa z chłodnicy i steruje elektrozaworem aby jak najbardziej ja wykorzystać zdarza się że woda na wejściu ma 2 stopnie a na wyjściu 5 stopni optymalne jej wykorzystanie to około 14 stopni.
    Do tego podłączone są jeszcze 3 wentylatory sterowane również czasowo. To mniej więcej wszystko.....
  • #14 9464370
    janek1815
    Poziom 38  
    Cytat:

    Właśnie odwiedziłem tę stronę i chyba zakupię tę pozycję. Rozpoczynając pisanie od nowa (wakacje) ale droga będzie WYBOISTA. Póki co zostanę przy tym co mam. Bascom dlatego że:
    -była ośla łączka 2004 rok wtedy już powstał początek tego programu 3ds18b20 i sterowanie czasowe wentylatorami
    -był polski help
    -w 2004 roku zakupiłem również pełną wersję Bascoma 1.11.6.9

    Co do C niestety ograniczała mnie znajomość języka angielskiego oczywiście w dzisiejszych czasach będzie łatwiej.
  • REKLAMA
  • #16 9464794
    SylwekK
    Poziom 32  
    Debounce spokojnie by tu wystarczył jeśli nie zależy Ci na ciągłości działania programu (ten zawsze wstrzyma na 25ms). Do tego wykorzystaj dodatkowy timer programowy do mierzenia czasu trwania buzera (ewentualnie można to zrobić w jakiejś pętli jeśli wstrzymanie programu jest nieistotne). Można też wykorzystać badanie portu z maskowaniem (AND) jeśli przyciski masz pod jednym portem i wykorzystać dodatkową zmienną bitową, która zerowana jest po puszczeniu dowolnego przycisku (ustawiana wraz z wykryciem wciśnięcia) tak aby po stwierdzeniu wciśnięcia, któregoś klawisza tylko raz pikało przez określony czas (zdefiniowany wspomnianym timerem programowym). Rozwiązań jest co najmniej kilka, a które wybierzesz zależy od Ciebie.
    Pozdrawiam
  • #17 9465622
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA