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.

Pomiar temperatury + obsługa klawiatury

Leon90 24 Sty 2013 10:11 2160 18
  • #1 24 Sty 2013 10:11
    Leon90
    Poziom 11  

    Witam,
    Mam jedno pytanie. Pomiar temperatury przy użyciu układu DS18b20 trwa 750ms przy rozdzielczości 12 bitów. Używam ATmega32, a sam pomiar działa poprawnie. Jak można rozwiązać problem polegający na tym, że program podczas wykonywania pomiaru nie "czyta" klawiszy?
    Z góry dziękuję za odpowiedź.
    Poniżej zamieszczam kod samego pomiaru:


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 18
  • #2 24 Sty 2013 10:22
    BlueDraco
    Specjalista - Mikrokontrolery

    Zrobić całą obsługę OneWire na przerwaniu timera. Ja mam to tak zrobione na LPC17xx, podejrzewam, że ktoś to zrobił również na AVR, chociaż to nie aż tak proste, ze względu na krótkie czasy pomiędzy przerwaniami.

    A, i wyrzuć te float z programu - do niczego to nie potrzebne, a marnuje pamięć i czas procesora. Jeśli bardzo chcesz mieć te dziesięciotysięczne stopnia, to pomnóż 4 najmniej znaczące bity odczytu przez 625.

    0
  • #3 24 Sty 2013 11:03
    Leon90
    Poziom 11  

    Nie za bardzo rozumiem jak to zrobić na przerwaniu timera. A czy pomiar byłby prawidłowy jeżeli bym np. co 800ms wywoływał funkcję w której jest tylko odczyt temperatury i jej wyświetlanie ( temp1=read_byte ... wyświetlenie na LCD)?

    0
  • #4 24 Sty 2013 11:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie, chodzi o całą obsługę OW zrobioną w przerwaniu timera, bez użycia jakichkolwiek funkcji "delay", a na to narzuca się jeszcze automat związany z pomiarami temperatury, też zrobiony na przerwaniach timera.

    Motto nr 2: Delay - to twój wróg.

    Użycie Delay gdziekolwiek poza inicjowaniem działania urządzenia (czyli przed "pętlą główną", o ile ona w ogóle istnieje) zawsze kończy się problemami, gdy urządzenie ma robić cokolwiek nietrywialnego i sensownego.

    0
  • Pomocny post
    #5 24 Sty 2013 11:37
    piotrva
    Moderator na urlopie...

    Może ja wyjaśnię jaśniej. Generujesz przerwanie od timera np. co 800ms, czy 1s. I w przerwaniu wykonujesz operacje:
    1. Odczyt temperatury do zmiennej
    2. Komenda Convert_T
    Odpowiadając na Twoje pytanie - 750ms to MINIMALNY czas między CONVERT_T a odczytem (dla 12-bit). Więc odczyt po 1, 2, 3600 sekundach po CONVERT_T nie jest błędem.
    Dzięki takiej metodzie zapominasz o istnieniu termometru i opóźnienia - po prostu w jakiejś zmiennej masz stale aktualną temperaturę.

    0
  • #7 24 Sty 2013 14:46
    snnaap
    Poziom 25  

    Czemu ludzie korzystający z tego przetwornika (DS18B20) "czekają' te 750 ms??

    Czemu ludzie korzystający z tego przetwornika (DS18B20) nie używają narzędzi, które daje im tenże przetwornik?

    Oczywiście przy podłączeniu 3 przewodowym ;)

    Cytat:
    If the DS18B20 is powered by an external supply, the master can issue read time slots after the Convert T command and the DS18B20 will respond by transmitting a 0 while the temperature conversion is in progress and a 1 when the conversion is done.

    0
  • #8 24 Sty 2013 14:49
    Leon90
    Poziom 11  

    Czyli _delay_ms(500) po komendzie Convert T jest zbędny? Podłączenie mam 3 przewodowe.

    0
  • #10 24 Sty 2013 18:01
    Leon90
    Poziom 11  

    Obsługa klawiatury znajduję się w nieskończonej pętli for ale już tego fragmentu nie wrzucałem. Obsługę klawiatury nie mam zrobionej na przerwaniu zewnętrznym. A czy wysyłanie komend SKIP ROM i CONVERT T można w ogóle wyrzucić z tej pętli?

    0
  • #11 24 Sty 2013 18:54
    snnaap
    Poziom 25  

    Pokaż cały program.
    Czemu nie używasz zewnętrznych przerwań?
    Ile masz klawiszy?

    Teraz masz ciągle sprawdzaną temperaturę i nie ma co się dziwić, że program "nie obsługuje" klawiatury.

    Zgaduje, że zapewne jest teraz tak, że aby klawisz zadziałał trzeba go przytrzymać ok 1 sek?


    Ps. chcesz się czegoś nauczyć czy chcesz gotowe rozwiązanie?

    0
  • Pomocny post
    #13 24 Sty 2013 21:04
    snnaap
    Poziom 25  

    No to tak:
    Jeżeli dobrze czytam program to masz 4 przyciski, timer ustawiony tak aby przerwanie od niego występowało co 50 Hz i nic poza tym.
    Używasz tylko przerwania od Timera - boisz się innych? Czy może to tylko nieznajomość AVR.

    Aż prosi się żeby przyciski działały pod INT0 / 1 - zewnętrzne przerwanie i po kłopocie.
    Następnie _delay_ms(750); zamienił bym na 40 przerwań od timera jak już go używasz.
    A najlepiej napisać troszkę inaczej program przyjmując inną taktykę.

    Ale przechodząc do sedna, jak naprawić w prosty sposób Twój program?!


    Masz taki fragment:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Przenieś go zaraz za:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli tam gdzie rozpoczyna się funkcja wykonująca się co jedną sekundę.

    Na początku pierwszego fragmentu masz:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    wywal
    //_delay_ms(750);

    a resztę wstaw na koniec pierwszego fragmentu czyli po zmianach powinno to wyglądać tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czyli patrz co zrobiliśmy
    co sekundę masz programowe "przerwanie" na początku tego przerwania odczytujesz temperaturę i wyświetlasz ją na ekranie, następnie startujesz z następnym pomiarem lecz nie czekasz aż pomiar temperatury się skończy lecz lecisz dalej, wyświetlasz na ekranie czas itp.

    Czas konwersji temperatury wynosi ok 750 ms , czyli będzie gotowy na koleje "sekundowe przerwanie".

    Kumasz??

    Pozdrawiam

    0
  • #14 24 Sty 2013 21:13
    Leon90
    Poziom 11  

    Komentarze są do starego projektu ale przerwanie używane do zegara generuje impuls o okresie 1s. Jeżeli klawiatura bedzie obsługiwana na przerwaniu INT0 to jej obsługa będzie działała prawidłowo (czyli wykryte będzie każde naciśnięcie a nie tak jak teraz dopiero po przytrzymaniu na 1s)?

    0
  • #16 24 Sty 2013 21:51
    miszcz310
    Poziom 19  

    Jeżeli ja mogę dorzucić swoje dwa grosze.
    Ja obsługę tego termometru robię zazwyczaj na maszynie stanów, którą umieszczam w przerwaniu od timera. Timer zazwyczaj wywołuję co 10 ms i on mi generuje nazwijmy to tyknięcia zegarowe, dla funkcji sprawdzającej stan klawiszy i do wspomnianej maszyny stanów. W main() w nieskończonej pętli mam zrobioną maszynę stanów do odczytu temp., konwersję liczby i wyświetlanie na LCD (jak nowa temp. zostanie wczytana i ustawiona odpowiednia flaga). Po takiej funkcji sprawdzająco-wyświetlającej mam funkcję do obsługi klawiszy i w sumie tyle.
    Słowo kluczowe do sprawdzenia: maszyna stanów. Polecam sobie poczytać, bo w mikrokontrolerach można ją śmiało traktować jako taki wzorzec programowy (innym np. jest bufor cykliczny itd).
    Pozdrawiam.

    0
  • #17 25 Sty 2013 09:25
    Leon90
    Poziom 11  

    Snnaap dzięki wielkie. Teraz działa wszystko idealnie :D

    0
  • #18 25 Sty 2013 09:54
    tehaceole

    Poziom 28  

    Twoje problemy są (mam nadzieję) dobrze omówione tutaj.
    Dokładnie to w przykładowym pliku 11_DS18B20_multi.rar masz gotowy program obsługi:
    - termometrów DS18B20,
    - menu,
    - wejść / wyjść,
    - zegara RTC PCF8583.
    Koniecznie zapoznaj się wcześniej z treścią pliku 00_CzytajToKodyAVR!!!.txt.

    Powodzenia:)

    0
  • #19 25 Sty 2013 12:46
    snnaap
    Poziom 25  

    0 napisał:
    Snnaap dzięki wielkie. Teraz działa wszystko idealnie :D


    Przedstawione przeze mnie rozwiązanie sprawiło że program zaczął działać w sposób dostateczny aby użytkować to urządzenie, ale problem tkwi głębiej u samych podstaw.


    Pozdrawiam

    0