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

Odczyt DS18B20 w przerwaniach

august_a 14 Maj 2006 19:29 2011 12
  • #1 14 Maj 2006 19:29
    august_a
    Poziom 21  

    Witam,
    Piszę program na ATmega128 pod Bascom AVR.
    Od kilku godzin szukam rozwiązania, jak zrrealizować odczyt czujnika temp. DS18b20 korzystając z przerwań.
    Czy takie rozwiązanie jest możliwe??

    0 12
  • CControls
  • #2 14 Maj 2006 23:27
    olekewaagata
    Poziom 25  

    Przerwania są zarezerwowane na zjawiska zewnętrzne zachodzące w nieprzewidywalnym czasie, żeby system nie próbkował na okrągło danego wejścia. Natomiast odczyt DS-a jest wtedy, kiedy programista ustawi go w programie, więc nie ma tu żadnej przypadkowości, więc nie widzę też sensu stosowania tego na przerwaniach, zwłaszcza że od resetu do końca odczytu uP jest masterem i steruje transmisją.

    0
  • #3 14 Maj 2006 23:45
    Tomasz.W
    Poziom 35  

    olekewaagata napisał:
    Przerwania są zarezerwowane na zjawiska zewnętrzne zachodzące w nieprzewidywalnym czasie....
    No raczej nie masz racji . Wewnętrzny licznik też może wystawić przerwanie i to w ściśle przewidywalnym czasie .

    0
  • #4 15 Maj 2006 08:32
    GienekS
    Poziom 32  

    Dlaczego uparłeś się akurat na odczyt tego czujnika w przerwaniu ? No chyba że nie używasz więcej przerwań to nie ma problemu. Procedura komunikacji z DS18... jest trochę długa i może zakłócić ci obsługę przerwań jak jest ich więcej i są szybkie a to prowadzi do "runięcia" programu.

    0
  • CControls
  • #5 15 Maj 2006 09:12
    plp
    Poziom 15  

    Stosuję odczyt DS18B20 w przerwaniu, dlatego, że przerwanie rozkładało mi transmisję 1wire.

    Przerwanie jest wyzwalane z częstotliwością 100 Hz, przez częstotliwość sieci 220 V i służy do obsługi ściemniacza. Transmisję 1wire umieściłem w tym przerwaniu, żeby uniknąć jej zakłócania właśnie przez to przerwanie. Co przerwanie wykonywana jest kolejna instrukcja 1wire.

    Może to Ci coś nasunie.

    Natomiast cała obsługa w jeden raz wyzwolonym przerwaniu co cieńko.

    Jeśli odczytujesz temperaturę cyklicznie możesz zamienić kolejność, czyli najpierw czytasz, potem bez czekania przez słynne 700 ms wydajesz polecenie konwersji temperatury. Przy kolejnym odczycie odczytasz tą temperaturę. Czyli jeśli czytasz co 1 s, dostajesz odczyt sprzed sekundy.

    PL

    0
  • #6 15 Maj 2006 10:42
    agendek
    Poziom 12  

    Wyłącz przerwania na czas transmisji 1wire

    0
  • #7 15 Maj 2006 12:57
    august_a
    Poziom 21  

    Cytat:
    Wyłącz przerwania na czas transmisji 1wire

    Właśnie tak zrobiłem i pomogło.
    Pozdrawiam

    0
  • #8 15 Maj 2006 19:23
    keramstwo
    Poziom 13  

    Dołącze się do dyskusji. Ja u siebie mam sterowanie ds18B20 ustawione w przerwaniu. Dodatkowo jest to procedura obejmujaca wszystkie rozkazy sterujace pracą czujnika czyli do proceduryt podaje czego chcę od DS18b20 i właczam przerwanie potem program główny ma za zadanie sprawdzic czy procedura odczytu zostałą ukonczona a w buforze mam dane z DS18b20. Gdy mialem odczyt nie w przerwaniach to inne procedury (np dzwiek) musialy czekac az ukoncze odczyt a wiadomo jak to brzmi :)

    Dodano po 58 [sekundy]:

    Dołącze się do dyskusji. Ja u siebie mam sterowanie ds18B20 ustawione w przerwaniu. Dodatkowo jest to procedura obejmujaca wszystkie rozkazy sterujace pracą czujnika czyli do proceduryt podaje czego chcę od DS18b20 i właczam przerwanie potem program główny ma za zadanie sprawdzic czy procedura odczytu zostałą ukonczona a w buforze mam dane z DS18b20. Gdy mialem odczyt nie w przerwaniach to inne procedury (np dzwiek) musialy czekac az ukoncze odczyt a wiadomo jak to brzmi :)

    0
  • #9 15 Maj 2006 20:14
    plp
    Poziom 15  

    Keramstwo,

    coś nie gra w Twojej wypowiedzi. Wynika z tego, że dzięki umieszczeniu obsługi DS w przerwaniu uniknąłeś opóźniającego wpływu na bieg programu.

    Wybacz, ale to absurd.

    Obsługa DS tyle samo trwa w przerwaniu co poza nim, a na czas przerwania zatrzymywany jest normalny bieg programu. Dlatego np. program realizujący emisję dźwięku poprzez ciągłe zmiany stanu jakiejś końcówki, czy chce, czy nie chce musi zatrzymać się na czas przerwania.

    Chyba, że zrobiłeś tak jak w opisanym przeze mnie powyżej rozwiązaniu, czyli co przerwanie wykonujesz tylko fragment obsługi DS. Wtedy wplatasz ją niejako w bieg normalnego programu.
    Oczywiście dokładnie to samo można wykonać bez przerwania.

    Pozdrawiam !

    PL

    0
  • #10 16 Maj 2006 08:40
    keramstwo
    Poziom 13  

    Oj opóźnienie jest ale niewielkie przeciez musi kontroler przyjac przerwanie wyliczyc czas potrzebny do ustawienia kolejnego przerwania i wyjsc z przerwania (oczywiscie cos tam odczytac).Na pewno nie bede czekał w programie głównym 480mkrsek Sztuczka polega na tym ze wykonuje tylko jedna operacje w jedym przerwaniu i odczyt jest prawie niezauwazalny. A zresztą ja sie słąbo znam na mikroprocesorach dopiero 20 lat tworze takie absurdy. Absurd nie absurd chodzi i już. Jestem zdania ze co sie da zrobic w przerwaniu to trzeba to zrobic. Dla mnie to wygoda dąłączam bibloteke a w programi głównym zajmuje sie tylko odczytem wartosci.

    0
  • #11 16 Maj 2006 08:52
    plp
    Poziom 15  

    No przecież napisałeś dokładnie to o czym pisałem, czyli o wykonywaniu tylko jednej instrukcji co przerwanie.

    I to jest w porządku i na pewno działa tak jak piszesz.

    Natomiast w wersji z poprzedniego postu, dalej twierdzę, że to absurd. I nie dlatego, że program zły, tylko nie było to do końca wyjaśnione i sugerowało inne rozwiązanie.

    I nie obrażaj się o słowo absurd, przytaczając lata praktyki, tylko spójrz na zawartość posta. Brakowało w nim istotnej informacji. Nie w tym rzecz, żeby się domyślać co chciałeś napisac.

    Pozdrawiam !

    PL

    0
  • #12 16 Maj 2006 08:57
    keramstwo
    Poziom 13  

    Rozumiem ze już rozumiesz:D
    Też pozdrawiam

    0
  • #13 16 Maj 2006 08:59
    plp
    Poziom 15  

    No nie bardzo. Czego nie rozumiałem wcześniej ?

    PL

    0