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

[atmega8/16][bascom] - Prosty sterownik + zegar + temp

plati92 18 Sie 2013 14:12 2508 5
REKLAMA
  • #1 12640350
    plati92
    Poziom 11  
    Witam, zaczynam "zabawę" z uC i programowaniem.
    Na pierwszy strzał chciałem zrobić prosty (tak na początku mi się wydawało) sterownik. Planowane opcje to: zegarek, termometr i obsługa 2-6 wyjść 230V. Wszystko chciałem stworzyć na atmedze8 ewentualnie 16.

    Założenia:
    - LCD na którym będą informacje prawdopodobnie będzie 4x20
    - czas + ewentualnie data
    - 2 temperatury
    - stan 2-6 wyjść.

    Aktualnie posiadam zbudowany mały układ na stykówce: atmega8, 2 switche, 2 diody LED, LCD 2x16 i 1x ds18b20. Na LCD są informacje: LED1 ON/OFF, LED2 ON/OFF + temperatura.

    Pierwszy problem zaczyna się na obsłudze przycisków. Program główny wygląda tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Prosty i przejrzysty. W pętli odczyt temp i 2 przyciski. I tu jest pierwszy mały problem. Odczyt trwa te 500ms, nie wiele ale gdy się przyciśnie przycisk to nie zawsze zareaguje, trzeba przytrzymać go dłużej żeby zmienić stan na wyjściu.

    Myślałem o przerwaniach. Ale przerwania obsługują tylko 2 porty INT0 i INT1. Z tego wychodzą 2 opcje: 1 przycisk do wywołania przerwań i wtedy obsługa wyjść itd. Lub tylko 2 przyciski działające przy przerwaniach.
    Jak najlepiej rozwiązać kwestie przycisków działających natychmiastowo ? A wiem że ich będzie więcej.
    Jak to jest w przypadku obsługi klawiatur typu 3x3/3x4/4x4.

    Urządzenie ma działać jako "sterownik pokoju" - zegarek, temp w pokoju i na dworze i sterowanie kilkoma urządzeniami na 230V typu lampa, wentylator itd.
  • REKLAMA
  • #2 12640385
    BlueDraco
    Specjalista - Mikrokontrolery
    Zacznij (jak w 99% projektów) od przerwania timera. W nim sprawdzaj stan przycisków i wykonuj prawie wszystkie pozostałe czynności.
  • REKLAMA
  • #3 12640519
    plati92
    Poziom 11  
    Czyli jak to dokładnie działa ?

    Dodaje w configu coś takiego ?
    Kod: text
    Zaloguj się, aby zobaczyć kod

    I właściwie to wszystko czy jak ? Niestety nie potrafię znaleźć niczego konkretnego, jak coś jest to czysta teoria bez przykładów. Jak gotowy program to zazwyczaj zbyt rozbudowany i mam jakieś niepewności.

    Do tego czy da się zrobić tak żeby temperatura była sczytywana np co 10s ? Oczywiście wait 10 na początku/końcu pętli odpada bo bym się nie doczekał na zadziałanie przycisków.
  • REKLAMA
  • #4 12640570
    gray77
    Poziom 12  
    Tak jak piszesz.
    Przerwanie od Timera przelicz sobie aby się wykonywało odpowiednio szybko (mi zazwyczaj wystarcza ok 10 razy na sekundę) a w przerwaniu sprawdzaj stan przycisków. Jeśli jakiś jest wciśnięty - ustaw flagę a w programie głównym ją obsługuj.
    W Twoim przypadku, musisz napisać obsługę przerwania:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    W przerwaniu ustawiaj sobie tylko flagi, całą resztę przenieś do głównego programu:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    plati92 napisał:
    Do tego czy da się zrobić tak żeby temperatura była sczytywana np co 10s ? Oczywiście wait 10 na początku/końcu pętli odpada bo bym się nie doczekał na zadziałanie przycisków.

    Tutaj ustawiłbym Timer0 na przerwanie co 10ms i tam też zliczał czas do 10 sek. Po tym czasie ustawiasz flagę Odczytaj_temp a w programie głównym ją obsługujesz.
  • REKLAMA
  • #5 12640648
    BlueDraco
    Specjalista - Mikrokontrolery
    Zupełnie inaczej. Obsługa przerwania, która tylko ustawia znaczniki, zupełnie nie ma sensu. W przerwaniu timera zgłaszanym np. 50 (20..100) razy na sekundę, czy poprzednio przycisk był zwolniony, a teraz jest wciśnięty. Jeśli tak - ustaw znacznik do ew. wykorzystania w ew. pętli zdarzeń (to dość nieszczęśliwe rozwiązanie, ale w Bascom i u początkujących od biedy ujdzie). Oczywiście zapisz również bieżący stan przycisku jako poprzedni, do wykorzystania przy następnym przerwaniu. Jak napisano wyżej, zliczaj przerwania w jakiejś zmiennej i po doliczeniu do wartości odpowiadającej np. 10 sekundom ustawiaj znacznik odświeżenia temperatury i zeruj ten licznik czasu.
  • #6 12645759
    SylwekK
    Poziom 32  
    Polecam zapoznać się z moim malutkim programem. Po jego zrozumieniu rozwiążesz swój problem w szybciej niż Ci się wydaje.
    https://www.elektroda.pl/rtvforum/topic2232417.html
REKLAMA