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.

[M32][Bascom][DS18B20] Prośba o krytykę programu.

Antystatyczny 08 Lip 2012 15:36 4025 37
  • #1 08 Lip 2012 15:36
    Antystatyczny
    Poziom 16  

    Witam.

    Naskrobałem coś takiego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Proszę o krytykę, a szczególnie zależy mi na obsłudze 1wire i sposobie obliczania ułamków. Obliczania temperatur ujemnych nie ma, bo niestety jeszcze tego nie rozumiem.
    Pozdrawiam!

    Dodano po 33 [minuty]:

    Aha, jeszcze dwa pytania. Czy DS może być blisko kwarcu? Mam go wlutowany ok. 1cm od kwarcu. Jaka jest żywotność pamięci eeprom w DS? 100000 zapisów jak w przypadku Atmega, czy więcej? Odczytuję temperaturę co pięć sekund i martwi mnie obecność eeprom w DS.

    0 29
  • #2 08 Lip 2012 16:45
    piotrva
    Moderator na urlopie...

    Program ogólnie poprawny, choć:
    1. Zamiast Waitms 750 postaraj się wszystko ztimingować na timerze.
    2. Nie ma żadnych przeciwwskazań, żeby w normalnej aplikacji DS był blisko kwarcu. A co ma poza tym eeprom ds'a do odczytu temperatury? EEPROM jest zapisywany wtedy i tylko wtedy gdy wywołasz komendę zapisu konfiguracji temperatur alarmów i rozdzielczości do EEPROM (komenda COPY SCRATCHPAD [48h]). Pozostałe komendy nie zmniejszają jego żywotności.
    3. poczytaj: http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf

    0
  • #3 08 Lip 2012 16:59
    Antystatyczny
    Poziom 16  

    Wobec tego źle zrozumiałem datasheet. Dlaczego nie korzystać z waitms 750? Chodzi o estetykę programu, czy objętość kodu wynikowego?

    0
  • #4 08 Lip 2012 17:27
    jousto
    Poziom 16  

    Ani o jedno ani o drugie. Jeśli ten układ z Atmegą ma służyć tylko do pomiaru i wyświetlania temperatury to można tak zostawić. Ale jeśli czy przyjdzie na myśl zrealizować jeszcze inne zadania (np obsługę przycisków) to nie może tak zostać. W czasie wykonywania instrukcji wait, uC nie zrobi już niczego innego. Kolega piotrva proponuje Ci aby załatwić to na timerze który wywołuje np co 1 sek podprogram który w parzystych sekundach zadaje DS'owi przetworzenie wartości zmierzonej temperatury, a w nieparzystych odczyta i aktualizuje wyświetlacz.

    0
  • #5 08 Lip 2012 18:02
    Antystatyczny
    Poziom 16  

    Na razie to tylko ćwiczenie mające na celu nauczenie się obsługi magistrali 1wire. Skoro mam w przyszłości z tego korzystać, na pewno użyję timera, ale tu powstaje pytanie: Mam włączyć przerwania i ewentualne opóźnienia w nich realizować?

    0
  • #6 08 Lip 2012 18:39
    arktik1
    Poziom 27  

    Cytat:
    sposobie obliczania ułamków

    Jakich ułamków?

    0
  • #7 08 Lip 2012 19:38
    Antystatyczny
    Poziom 16  

    Tych ułamków, które tak naprawdę są liczbą całkowitą, przedstawianą przy pomocy zmiennej U. Sądziłem, że komentarze obecne w programie wystarczą do zrozumienia zastosowania konkretnych zmiennych.

    0
  • #8 08 Lip 2012 20:06
    arktik1
    Poziom 27  

    Powiem szczerze, że nie wiem po co rozpisałeś ten kod aż do takich rozmiarów.
    Tu kawałek który mierzy temperaturę dodatnią i ujemną:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #9 08 Lip 2012 20:16
    Antystatyczny
    Poziom 16  

    Dziękuję, już analizuję.

    Dodano po 5 [minuty]:

    Ten wariant już przerabiałem, tzn. konwersję do string, formatowanie itd. To rozwiązanie mi nie odpowiada, bo nie wyświetla ułamków. To jest taka proteza obsługi wyświetlania temperatury dodatniej. Ćwiczę, by sie nauczyć pełnej obsługi i nie interesują mnie półśrodki.

    0
  • #10 08 Lip 2012 20:22
    arktik1
    Poziom 27  

    Tom w jakim formacie chcesz mieć temperaturę?
    0.0, 0.00, czy 0.000

    0
  • #11 08 Lip 2012 22:21
    Antystatyczny
    Poziom 16  

    Obecnie wyświetlam temperaturę w formacie 0.0000 i to mi odpowiada. Chciałem sie jedynie dowiedzieć, czy można jakoś uprościć komunikację 1wire, czy robię jakies błędy w obliczaniu "ułamków". O ujemne nie pytam, bo mnie pewnie moderator do kosza wywali :) Postaram się nauczyć we własnym zakresie.

    Dodano po 1 [godziny] 54 [minuty]:

    Arktik1, tak na marginesie: Ten kod nawet nie bada, czy tempereatura jest ujemna, a co dopiero o jej obliczeniu :)

    0
  • #12 09 Lip 2012 10:39
    tehaceole

    Poziom 28  

    Antystatyczny napisał:
    Obecnie wyświetlam temperaturę w formacie 0.0000 i to mi odpowiada
    Kolego... Przecież DS18B20:
    - ma rozdzielczość pomiaru 0,125st. C
    - ma dokładność odczytu +/- 0,5st. C
    Więc za przeproszeniem po jakiego grzyba wyświetlasz 4 miejsca po przecinku, skoro nawet jedno miejsce po przecinku obarczone jest z góry zdefiniowanym przez producenta błędem?
    W ramach ćwiczeń zrób eksperyment i wyświetl temperatury z 3 - 4 czujników równocześnie. Wtedy przekonasz się jakie są między nimi rozbieżności. Jeszcze pół biedy, gdy czujniki są z tej samej serii produkcyjnej. Ale miałem przypadek w którym 2 DS pokazywały temperaturę różniącą się o 1st. C! A były umieszczone jeden przy drugim... :)
    Co do części ułamkowych to poczytaj sobie ten artykuł. Kody co prawda są w C, ale sam sposób podejścia do problemu jest bardzo sympatycznie przedstawiony.

    Powodzenia! :)

    0
  • #13 09 Lip 2012 19:06
    atom1477
    Poziom 43  

    Kombinujecie jak koń pod górkę.
    Nie trzeba robić żadnej "obsługi" temperatur ujemnych.
    Wystarczy jedno:

    Code:

    Ss = Format(ss , "  0.0")

    i to od razu zapewni poprawne wyświetlanie temperatur dodatnich i ujemnych.

    0
  • #14 09 Lip 2012 20:18
    arktik1
    Poziom 27  

    Cytat:
    Arktik1, tak na marginesie: Ten kod nawet nie bada, czy tempereatura jest ujemna, a co dopiero o jej obliczeniu

    To wrzuć go do symulatora i zobacz.
    Poza tym mam kilka urządzeń zrobionych na tym kodzie.

    0
  • #15 09 Lip 2012 22:34
    Antystatyczny
    Poziom 16  

    Nie chcę konwersji do stringa, bo docelowo ten program ma obsługiwać wyświetlacz LED, a nie LCD. Arktik1, jak ten program może działać poprawnie skoro nie bada stanu 5 najstarszych. bitów w bajcie MSB? W nocie katalogowej DS jest wyraźnie napisane, że tylko wtedy należy wartośc reszty bajtu MSB i całego LSB jako ujemną. Symulator już mnie kilka razy zawiódł, więc przestał być dla mnie wyrocznią.
    Tehaceole, jestem świadom dokładności tego czujnika. Ostateczna wersja będzie miała jedno miejsce po przecinku. W ramach ćwiczenia chcę zastosować timery, by wyeliminować instrukcje wait, wykonać multipleks, a wszystko jakoś tak upakowac, by jedno drugiemu nie przeszkadzało.

    Pytanie odnośnie liczb ujemnych w systemie binarnym... Jeśli w bajcie mam wpisaną liczbę -16, to wystarczy, że wykonam NOT na tej liczbie i dodam 1, by potem to wyświetlić? W związku z powyższym... czy prawdłowa bedzie składnia np. u = NOT u?

    Dodano po 11 [minuty]:

    Już sobie sam odpowiedziałem na to pytanie czytając treśc z linku, który podał jeden z kolegów. Serdecznie dziękuję!

    0
  • #16 09 Lip 2012 22:54
    atom1477
    Poziom 43  

    Mimo wszystko chyba nie rozumiesz.
    Na tej temperaturze nie trzeba robić żadnych kombinacji.
    Np. nie trzeba sprawdzać najstarszych bitów.
    To jest liczba w kodzie U2 i wszystkie działania związane ze znakiem liczny robią się niejako automatycznie.

    0
  • #17 09 Lip 2012 23:02
    Antystatyczny
    Poziom 16  

    Prosze mnie poprawić jesli sie mylę... W kodzie U2 tylko najstarszy bit ustala znak przedstawianej liczby. A w bajcie MSB mamy aż 5 bitów bedących tą flagą. Nie do końca jest to U2. Oczywiście... jeśli przyjąć, że bit 3 w MSB będziemy traktować jako ostatni, wtedy stanie się prawdziwą liczbą w U2. A skoro tak, to powinienem zadeklarować zmienną typu INT, potem wrzucić do niej oba bajty odczytane z DS, przesunąć w lewo tak, by bit3 MSB znalazł się w miejscu bitu MSB mojej zmiennej i wtedy operować na niej.

    0
  • #18 09 Lip 2012 23:08
    MArSTER_1
    Poziom 18  

    Masz dużo racji. Prawdopodobnie to co napisałeś zadziała. Następnym krokiem ( pomnożyłeś przesuwając w lewo 4 razy przez 16) będzie podzielenie przez 16 i rzutowanie na zmienną single. Otrzymasz temperaturę dodatnią lub ujemną z dokładnością bodajże 4 miejsc po przecinku.

    0
  • #19 09 Lip 2012 23:10
    atom1477
    Poziom 43  

    To dalej jest najprawdziwsza liczba w kodzie U2.
    Kto mówi że te 5 bitów są flagą na raz?
    Dalej wystarczy sprawdzać tylko 1 najstarszy bit.
    Tutaj jest nawet lepiej bo możesz sobie wybrać czy będziesz sprawdzał bit ostatni czy trzeci od końca.
    Kolejne nadążają za tym najstarszym tylko dlatego że liczba zawarta w tych 16-tu bitach w rzeczywistości ma węższy zakres niż 16-bitów (bo ma 12-cie).
    Więc kolejne i tak muszą być jedynkami.
    Inaczej mówiąc to tak jak liczba np. 00001111. To jest 15. A wcześniej mamy 4 zera. Ale nie zmieniają one tej liczby. Dalej jest 15.
    Po prostu zapisując na 8 bitach liczby z zakresie tylko do 15 wymuszamy zera na kolejnych pozycjach. Co nie umniejsza faktu że liczba dalej jest 8-mio bitowa, po prostu nikt do niej nie wpisuje wartości gdzie te bity miały by wartość 1.
    Tak samo ujemne liczny w kodzie U2.
    Mamy trochę nadmiarowych jedynek które zawsze są jedynkami, ale tylko dlatego bo tak wychodzi z wykorzystywanego zakresu.
    Więc nie musowo się tym martwić.
    Poza tym przy obsłudze DS18B20 jest dokładnie odwrotnie niż napisałeś.
    Tzn. nie musisz tych bitów kopiować tak jak napisałeś.
    To DS18B20 specjalnie "kopiuje" ten "bit znaku" na kolejne pozycje właśnie po to żebyś Ty nie musiał już ich kopiować tylko od razu operować na tej liczbie jako 16-to bitowej ze znakiem.

    0
  • #20 09 Lip 2012 23:40
    Antystatyczny
    Poziom 16  

    Atom1477:

    Wiem do czego zmierzasz, ale...
    Włączam kalkulator programisty w windows 7. Ograniczam sobie ilość bitów do 16. Zaświecam bit MSB. zaświecam bit LSB, bit 1 i bit 2. Odpowiada to dzięsętnej liczbie -32764. Następnie, w celu edukacyjnym, bawię się bitami 14,13,12 i 11. Postać dziesiętna tej liczby się zmienia. Nieprawdą jest więc to, że wystarczy sprawdzać bit MSB, bo pozostałe 4 bity mają wpływ na wartośc zmiennej(nie znaku, to rozumiem). Stąd moja nieodparta chęć do przesunięcia bitów w lewo w celu pozbycia się 4 niepotrzebnych flag.Wszak ma być jedna w bicie MSB.

    Dodano po 3 [minuty]:

    Nie wiem, może nie widzę czegoś, co jest dla Was oczywiste... Jakiegoś skrótu, czy coś.

    Dodano po 1 [minuty]:

    Ewentulnie moge przecież wykonać operację AND na bitach 14,13,12 i 11. Co o tym myślicie? To by wyeliminowało wpływ włączonych (i powielonych) flag na wartość zmiennej.

    Dodano po 8 [minuty]:

    Własnie zauważyłem, że w przypadku liczb ujemnych sposób wpisywania liczby jest jakby odwrotny...tzn. 0 zamienia się miejscami z 1. Gdy chcę zwiększać wartość liczby ujemnej, muszę ustawiać coraz więcej zer w liczbę, a to by oznaczało, że te jedynki na bitach 14,13,12 i 11 w pewnym sensie odpowiadają zerom w przypadku liczby dodatniej, tak? Jesli dobrze myślę, jedynki odpowiadają zerom, czyli zawężają zakres zmiennej (jak pisał przedmówca). W związku z tym nie bedę musiał przesuwać bitów, bo w przypadku liczb ujemnych jedynka oznacza "zgaszony bit". Dobrze to teraz wykombinowałem?

    0
  • #21 10 Lip 2012 00:03
    atom1477
    Poziom 43  

    Antystatyczny napisał:
    Włączam kalkulator programisty w windows 7. Ograniczam sobie ilość bitów do 16. Zaświecam bit MSB. zaświecam bit LSB, bit 1 i bit 2. Odpowiada to dzięsętnej liczbie -32764. Następnie, w celu edukacyjnym, bawię się bitami 14,13,12 i 11. Postać dziesiętna tej liczby się zmienia. Nieprawdą jest więc to, że wystarczy sprawdzać bit MSB, bo pozostałe 4 bity mają wpływ na wartośc zmiennej(nie znaku, to rozumiem). Stąd moja nieodparta chęć do przesunięcia bitów w lewo w celu pozbycia się 4 niepotrzebnych flag.Wszak ma być jedna w bicie MSB.

    Przeprowadzasz konwersję w złą stronę.
    Konwertuj raczej liczby dziesiętne (ale tylko takie jakie może zwracać czujnik DS18B20) na liczby dwójkowe.
    To zobaczysz że zawsze pierwsze 5 jedynek będzie ustawionych.
    No i najważniejsze: skoro zmieniasz dowolnie bity 14, 13 i 12 to nic dziwnego że zmienia się wartość liczby. Bo zmieniając je sprawiłeś że one już nie są flagami.
    Mimo wszystko nawet w tym przypadku nie powinieneś się pozbywać tych, jak to nazwałeś, "flag".
    W takim przypadku po prostu powinieneś sprawdzać tylko flagę na bicie 15.
    Otrzymasz jednak różne liczby no bo różne liczby podajesz zmieniając te bity.
    Gdybyś dowolnie nie zmieniał tych bitów (a DS18B20 ich nie zmienia), to do oceny znaku też wystarczy sprawdzać tylko bit 15.
    Czyli w obydwu przypadkach nie trzeba niczego usuwać, i w obydwu przypadkach trzeba sprawdzać tylko bit 15.
    No i dlatego nie rozumiem tych Twoich mega kombinacji, skoro do oceny znaku jak i oceny wartości liczby w obu przypadkach (12 i 16 bitów) jest taki sam algorytm.

    Poza tym:
    Antystatyczny napisał:
    Nieprawdą jest więc to, że wystarczy sprawdzać bit MSB, bo pozostałe 4 bity mają wpływ na wartośc zmiennej(nie znaku, to rozumiem).

    Nie napisałem że nie ma. Napisałem tylko że do samego sprawdzenia znaku wystarczy sprawdzić ten bit, bo wystarczy.

    Poza tym #2:
    Antystatyczny napisał:
    Ewentulnie moge przecież wykonać operację AND na bitach 14,13,12 i 11. Co o tym myślicie? To by wyeliminowało wpływ włączonych (i powielonych) flag na wartość zmiennej.

    to nie ma sensu.
    Skoro te bity są powielone, to po co sprawdzać wszystkie?

    Wracając do początku Twojego testu, sprawdzaj sobie właśnie takie liczby. Czyli takie gdzie te bity są powielone (bity 15, 14, 13 i 12). A zobaczysz że wtedy liczba się nie zmienia (bo to będzie ta sama liczba :D).


    Antystatyczny napisał:
    Własnie zauważyłem, że w przypadku liczb ujemnych sposób wpisywania liczby jest jakby odwrotny...tzn. 0 zamienia się miejscami z 1. Gdy chcę zwiększać wartość liczby ujemnej, muszę ustawiać coraz więcej zer w liczbę, a to by oznaczało, że te jedynki na bitach 14,13,12 i 11 w pewnym sensie odpowiadają zerom w przypadku liczby dodatniej, tak? Jesli dobrze myślę, jedynki odpowiadają zerom, czyli zawężają zakres zmiennej (jak pisał przedmówca). W związku z tym nie bedę musiał przesuwać bitów, bo w przypadku liczb ujemnych jedynka oznacza "zgaszony bit". Dobrze to teraz wykombinowałem?

    No właśnie o to chodzi.
    W Twojej metodzie z wycinaniem czy przesuwaniem bitów na koniec i tak musiał byś dopełniać jedynkami do pełnych 16-tu bitów.
    Żeby mieć pewność że nie wejdzie tam żadno zero co zmieni wartość liczby.
    Tak jak trzeba dopełniać zerami przy liczbie dodatniej (żeby żadne jedynki nie weszły).
    Bo uC raczej operują tylko na liczbach 8/16/24/32/... bitowych i trzeba ręcznie dbać o zawężanie zakresu wpisując te zera/jedynki.
    A przecież takie dopełnienie jedynkami masz na dzień dobry po odczytaniu z czujnika, i dlatego mówię że nie trzeba już kombinować.

    0
  • #22 10 Lip 2012 00:29
    Antystatyczny
    Poziom 16  

    Atom, wydaje mi się, że sprawiłeś, iż od teraz jestem mądrzejszy :) MSB nadaje flagę, a bity 14,13,12 i 11 są ustawione na 1, by nie zawyżać wartości odczytu. Tak więc nie muszę przesuwać bitów, nie muszę kombinować. Wystarczy, że sprawdzę MSB i jeśli będzie się świecił, mam tę liczbę potraktować jako ujemną (zanegować i poddać obróbce, by wyłuskać konkretne cyfry dla poszczególnych cyfr wyświetlacza LED). W przypadku liczby dodatniej flaga i 4 młodsze bity są zgaszone (0), bo też zmieniłyby wartość odczytu. To jest własnie ograniczenie do 12 bitów! Mam jeszcze jedno pytanie:
    Dlaczego arktik1 mnoży zawartość przez 10? Dzielenie przez 16 rozumiem... w ten sposób pozbywa się ułamka. Hmm, może chodzi o to, by najpierw zwiększyć zawartośc zmiennej dziesięciokrotnie, a potem podzielić przez 16, by wynik dał wartość z jednym miejscem po przecinku? Nadal nie rozumiem, w jaki sposób bada wartość ujemną w tym kodzie, który przedstawił(choć wcześniej sądziłem, że jest to dla mnie absolutnie zrozumiałe)

    Dodano po 16 [minuty]:

    Jeśli konwertujemy liczbę ujemną na z INt na STRING... w stringu znajdzie się również znak tej liczby? Chyba zaczynam rozumieć ten kod na nowo.

    0
  • #23 10 Lip 2012 09:41
    atom1477
    Poziom 43  

    Antystatyczny napisał:

    Dlaczego arktik1 mnoży zawartość przez 10? Dzielenie przez 16 rozumiem... w ten sposób pozbywa się ułamka. Hmm, może chodzi o to, by najpierw zwiększyć zawartośc zmiennej dziesięciokrotnie, a potem podzielić przez 16, by wynik dał wartość z jednym miejscem po przecinku?

    Dokładnie tak.

    Antystatyczny napisał:
    Nadal nie rozumiem, w jaki sposób bada wartość ujemną w tym kodzie, który przedstawił(choć wcześniej sądziłem, że jest to dla mnie absolutnie zrozumiałe)

    No bardzo prosto:
    Code:
    If Temp < 000 Then

    Tylko nie wiem po co dał te 3 zera. Wystarczy jedno.

    Antystatyczny napisał:
    Jeśli konwertujemy liczbę ujemną na z INt na STRING... w stringu znajdzie się również znak tej liczby? Chyba zaczynam rozumieć ten kod na nowo.

    Tak.
    Dlatego i tutaj też nie trzeba nic kombinować (np. wcale nie trzeba stosować tego Ifa zastosowanego przez Arktika1).

    0
  • #24 10 Lip 2012 19:41
    Antystatyczny
    Poziom 16  

    Wobec tego arktik1 miał rację twierdząc, że Jego kod działa. Zwracam honor!

    Już niejako na koniec tej dyskusji/lekcji chciałbym się upewnić, czy muszę coś kombinować z częścią ułamkową, czy też metoda jest identyczna jak w przypadku liczb całkowitych? Chodzi mi o uzyskanie wartości bezwzględnej, by móc potem wykonywać na niej działania matematyczne.

    Dodano po 15 [minuty]:

    Poniżej aktualny kod programu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 4 [minuty]:

    Kolejnym etapem będzie usunięcie poleceń wait. Chcę włączyć któryś timer, który generowałby przerwanie np. co sekundę. Mam w planie w obsłudze przerwania wpakować polecenie 1wwrite &HBE oraz odczyt dwóch bajtów z szyny. Nie zamulę tym głównego programu?

    0
  • #25 10 Lip 2012 21:17
    arktik1
    Poziom 27  

    Cytat:
    wcale nie trzeba stosować tego Ifa zastosowanego przez Arktika1

    Oczywiście że nie, chodziło tu o dopasowanie przesunięcia cyfr po pojawieniu się znaku minus. :D
    Sorki że nie skasowałem...

    0
  • #26 10 Lip 2012 21:48
    atom1477
    Poziom 43  

    Mi chodzi o to że nawet do dopasowania przesunięcia cyfr nie trzeba tego IFa.

    0
  • #27 10 Lip 2012 21:56
    Antystatyczny
    Poziom 16  

    Wystarczy na stałe mieć spację w poleceniu formatującym, dobrze myślę?

    0
  • #28 10 Lip 2012 23:40
    atom1477
    Poziom 43  

    Tak.
    Tzn długość polecenia formatującego (spacje + zera + kropki) powinna być co najmniej równa maksymalnej długości podawanego ciągu do sformatowania.
    Czyli dla temperatur do -99°*C z jednym miejscem po przecinku trzeba " 0.0" (dwie spacje i 0.0).
    Druga spacja dba o to żeby tekst się nie wydłużał jak temperatura będzie miała cyfrę na miejscach dziesiętnych, a pierwsza o to żeby się nie wydłużał jak pojawi się znak minus.
    Arktik1 dawał tylko jedną spację i dlatego musiał kombinować z Ifem bo mu się tekst rozjeźdżał jak się dodatkowo pojawiał minus.

    0
  • #29 11 Lip 2012 07:49
    Antystatyczny
    Poziom 16  

    Rozumiem.

    A teraz mam małą zagwozdkę:

    1. Wysyłam żądanie konwersji.
    2. Startuje timer1 generując przerwanie co ok. 2 sekundy.
    3. Skok do obsługi przerwania, a w niej żadanie odczytu 1wire i pobranie dwóch bajtów danych.
    4. Powrót do programu głównego.
    5. W programie dokonuję niezbędnych przeliczeń i operacji na zmiennych.

    Dobrze kombinuję, czy nie bardzo?

    Teraz następna zagwozdka:

    Co się stanie z obsługą multipleksowania w przerwaniu na timer0, gdy nagle program skoczy do obsługi przerwania z timer1? Wyświetlacz przygaśnie, czy raczej tego nie zauważę? Zwykle mam mux o częstotliwości 244 lub 488Hz.
    A może cały program oprzeć o jedno przerwanie? Np. Napisać obsługę mux oraz zwiększać jakąś zmienną podczas obsługi przerwania, a gdy osiągnie jakąś wartość, która była inkrementowana przez 750ms, po prostu wysłać &HBE z poziomu programu głównego, a tuż po nim kolejne polecenie w celu odczytu 2 bajtów danych.

    0
  • #30 12 Lip 2012 14:05
    tehaceole

    Poziom 28  

    Antystatyczny napisał:
    1. Wysyłam żądanie konwersji.
    2. Startuje timer1 generując przerwanie co ok. 2 sekundy.
    3. Skok do obsługi przerwania, a w niej żadanie odczytu 1wire i pobranie dwóch bajtów danych.
    4. Powrót do programu głównego.
    5. W programie dokonuję niezbędnych przeliczeń i operacji na zmiennych.

    A czemu nie korzystasz z timerów programowych? Ustawiasz sobie jeden timer sprzętowy żeby generował przerwanie np. co 10ms, w obsłudze przerwania robisz tylko jedno:
    ustawiasz flagę (tzw. systick). W głównej pętli programu używasz tej flagi do wchodzenia w procedurę dekrementowania iluś tam zmiennych będących niezależnymi timerami programowymi. Po ich zdekrementowaniu kasujesz flagę. I tak w kółko:) Ostatnio potrzebowałem zrobić ciekawą interakcję z klientem (na LCD) i w programie używałem coś ok 70 takich timerów.

    Tylko ważna uwaga: takie podejście to już zalążki tzw. pseudowątkowości. Wobec tego w programie nie możesz używać żadnych "normalnych" opóźnień.

    0