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

Pomiar wilgotności za pom Atmega16

marrog 27 Kwi 2009 22:20 8276 30
  • #1 27 Kwi 2009 22:20
    marrog
    Poziom 22  

    Witam

    Chce zrobić pomiar wilgotności powietrza, wstępnie chciałem użyć SHT11 i po kłopocie, jednak ze względu na to iż czujnik od procka musi znajdować się bardzo daleko ok 30-50 metrów, nie wiem czy da radę takie rozwiązanie, oprócz tego, muszę mieć dwa czujniki, czyli musiałbym zbudować dwa tory pomiarowe, a wymagane jest aby czujnik był galwanicznie odseparowany od procesora. Znalazłem optoizolację na i2c, ale z tego co wyczytałem i pamiętam i2c może obsłużyć do 15cm.

    Jakie inne rozwiązanie koledzy doradzają? odpadają czujniki ponad 60zł/szt ( ograniczony budżet).

    0 29
  • #2 27 Kwi 2009 22:35
    antrykot
    Poziom 20  

    Najprościej będzie dołożyć obok czujnika jakiegoś małego attiny i spiąć z głównym po RS485, lub ew RS232.

    0
  • #3 28 Kwi 2009 00:08
    marrog
    Poziom 22  

    Witam

    No też już myślałem nad tym, żeby zastosować jakiś mały uP i przy pomocy innej magistrali ( zapomniałem o RS232) przekazywać informacje do ATmega16.
    Tylko nie robiłem takiego myku jeszcze.
    A gdyby tak zastosować czujnik rezystywny RHMS1
    Na końcu noty jest podana aplikacja, tzn czujnik higrometr i wpięty termistor równolegle do toru pomiarowego, wówczas można by było mierzyć przy pomocy wbudowanego przetwornika A/C mierzyć napięcie, tylko jak przeliczać to na wilgotność?

    Mile widziane jakieś rady.

    0
  • #4 28 Kwi 2009 16:09
    antrykot
    Poziom 20  

    Ja bym sie nie bawił w pomiar napięcia, które bierzemy z czujnika 50m dalej. W takim kablu będą się indukować zakłócenia, przydzwięk sieci itp.
    Oprócz tego łatwo odseparować galwanicznie magistrale od głównego procesora.
    A mały Attiny kosztuje z 3zł, więc to żaden wydatek.

    0
  • #5 28 Kwi 2009 18:10
    Dar.El
    Poziom 40  

    Witam
    Tylko RS485 lub coś na pętli prądowej. Najtańszy scalak do RS485 to SN75176. Jeszcze trzeba zabezpieczyć układy wejściowe na wypadek bliskiego wyładowania atmosferycznego.

    0
  • #6 28 Kwi 2009 19:19
    marrog
    Poziom 22  

    Witam

    Dzięki za odpowiedź. No w sumie jest to rozwiązanie które raczej za dużo drożej nie wyjdzie. Tak jak mówisz, nie warto bawić się z pomiarem napięć dla zwykłych czujników.
    ja to widzę tak, jeśli nie zda egzaminu podłączenie samym kablem na odległości 30-50m SHT to wówczas dam attiny2313 + scalak SN75176 i on będzie mi konwertował odczytaną temp i wilgotność i przesyłał do Atmega16.
    Tylko nigdy nie bawiłem się ani RS232 ani RS485 :/
    Więc trochę się obawiam tego.

    0
  • #8 28 Kwi 2009 20:48
    Dar.El
    Poziom 40  

    SN75176 jest najtańszym odpowiednikiem MAX485.

    0
  • #9 28 Kwi 2009 21:23
    marrog
    Poziom 22  

    W sumie nie zależy mi na 2-4 zł przy koszcie jaki poniosę przy budowie całego urządzenia.
    Jednak rozwiązanie z dodatkowymi mikroprockami wydaje się być najlepszym rozwiązaniem. Tylko będę musiał zrobić optoizolację RS485, noi poczytać w jaki sposób ja uruchomić. Dużo pracy przede mną, w najbliższych tygodniach :-)

    Macie może jakąś dobrą lekturkę jak ją zrealizować, nie napisałem wcześniej, korzystam z BASCOM-a do programowania Atmegi16 ( z góry z założenia miałem użyć tego języka).

    0
  • #10 28 Kwi 2009 21:27
    antrykot
    Poziom 20  

    Ja zrobiłem ostatnio komunikacje przez zwykły UART na odległość 100m kablem telefonicznym o tragicznych parametrach.
    Amplituda sygnału to 24V i śmiga jak trzeba.
    Ale chyba i tak RS485 będzie lepszy i pewniejszy.

    0
  • #11 28 Kwi 2009 21:36
    Dar.El
    Poziom 40  

    Jak chcesz zrobić izolację optyczną RS485, to tylko na poziomie UARTA AVR, między uP a SN75176. Samej linii RS485 raczej nie uda się.

    0
  • #12 28 Kwi 2009 21:53
    marrog
    Poziom 22  

    No w sumie taka optoizolacja już wystarczy w najgorszym wypadku jak padnie to tylko czujnik i MAX485 ( SN75176).
    A jeśli mogę zapytać, to da radę bez problemów zrobić RS485 pod BASCOM-em, czy będą jakieś problemy? O RS232 trochę czytałem i wiem, że Atmega ma już wbudowany i bez problemu pod BASCOM-em można go obsługiwać, ale jak wygląda sprawa z RS485?

    0
  • #14 28 Kwi 2009 23:37
    _jta_
    Specjalista elektronik

    Mi magistrala 1-wire zadziałała na 250m, więc nie jest problemem technicznym łączność na 50m.
    Tylko jak chcesz przesyłać nieco szybciej, to uważaj na pojemności kabli: np. RS-232 przy 100m
    może mieć kłopoty z transmisją 9600 bodów, lepiej użyć innych poziomów sygnałów; ja na 1-wire
    przesyłałem znacznie szybciej, ale stosując dodatkowe tranzystory do zwiększenia prądu -
    sam RS-232 ma napięcia 12V, prądy kilka mA i przez to straszne niedopasowanie do kabla.

    0
  • #15 29 Kwi 2009 00:32
    marrog
    Poziom 22  

    Witam

    Mówisz o magistrali 1-Wire wg specyfikacji Dallasa, czy masz na myśli komunikację z SHT za pomocą przewodów na odległości 50m bez stosowania jakichkolwiek układów? Z 1-Wire wg Dallasa to nie mam problemu i pastylki podpięte pod niego bez problemu będą działały ( DS18B20) tylko muszę mieć jeszcze pomiar wilgotności wewnątrz pomieszczenia ( a DS będzie mierzyć na zewnątrz) i wczoraj nasunęła mi się myśl czy sam kabel ( ekranowany może jakaś skrętka) wystarczy żeby przesyłać z i do SHT sygnały.
    Jeśli nie da rady to myślę, że rozwiążę go tak jak doradzali koledzy zastosuje dodatkowe uP ( attiny2313 + MAX485) i po RS485 bez problemu powinno chodzić, tylko oby mi sam RS485 odpalił od strony programowej - bo muszę napisać całość pod BASCOM-em :-)

    -=pozdrawiam=-

    0
  • #16 29 Kwi 2009 01:58
    _jta_
    Specjalista elektronik

    Piszę - fonia przez forum nie działa ;) - o układach Dallasa, takich jak DS18B20. Najprostszy interfejs
    do portu RS-232, zawierający tylko oporniki i diody, działał mi tylko na niektórych komputerach,
    a i to tylko na małą odległość - zastosowanie tranzystorów do wzmocnienia prądu i zasilanie tego
    układu niezależnie od portu RS-232 zwiększyło mi zasięg wielokrotnie. Pewnie z innymi magistralami
    będzie tak samo, jeśli nie są dopasowane do oporności falowej przewodu. I pewnie można zrobić
    podobnie do łączności z SHT, tylko sprawdź, jakie prądy potrafi pociągnąć z linii, i jakiego używa
    napięcia zasilania - istotny jest stosunek napięcia do prądu, im większy tym gorsza transmisja, ale
    można ją poprawić wzmacniając prąd dodatkowym tranzystorem. Być może będzie potrzeba więcej
    przewodów w kablu, żeby oprócz sygnału przesłać zasilanie dla układu wzmacniającego.

    0
  • #17 29 Kwi 2009 08:25
    byrrt
    Poziom 21  

    Po co kombinować i stosować jakieś wzmacniacze itp? Najelegantszym sposobem będzie ten RS485 - oprogramowanie tego w bascom to pestka - generalnie bardzo podobne do RS232 właściwie to samo tylko nadajesz i odbierasz osobno.. Swoją drogą możesz tylko nadawać od strony SHT a czekać na dane w procesorze gł.. RS485 może chodzić na różnych napięciach - myślę że spokojnie poszłoby na 5V ale dla pewności mógłbyś dać chociaż te ~12. Wg. mnie nie ma też potrzeby separacji galwanicznej bo same maxy mają dość dużą wytrzymałość na esd itp.. A jak trzepnie piorun czy coś innego większego to żadna separacja i tak Ci nic nie da.. ew. dać jakieś szybkie diody zabezpieczające dwukierunkowe i tyle na temat.. Oczywiście jak RS485 to puszczasz sygnał skrętką - jakbyś kombinował zwyczajnie bez RS'a to nie wiem czy skrętka to dobry pomysł.. Pozdrawiam

    0
  • #18 29 Kwi 2009 09:18
    _jta_
    Specjalista elektronik

    Myślę, że łatwiej dodać tranzystor i dwa oporniki, niż kostkę, którą trzeba oprogramować.

    0
  • #19 29 Kwi 2009 09:19
    marrog
    Poziom 22  

    Witam

    No znalazłem trochę informacji na temat RS485 i jego realizacji pod BASCOM-em , w sumie tak jak piszesz byrrt nie powinno sprawic klopotów.
    Co do komunikacji.
    Jeśli pr. główny ma tylko odbierać, ( bo w sumie odczyt temp i wilgotność a także ich konwersję zrobiłbym na procku przy SHT i wysyłał już wartość po konwersji), to który z procków ma byc MASTER a który SLAVE? Przypomnę, że będą 2 SHT w dwóch różnych miejscach, co daje 2 dodatkowe procki na magistrali RS485 i pr. główny.
    Normalnie myślałem tak:
    1. Procki robią odczyt i konwersję z SHT,
    2. Master ( atmega16) wysyła zapytanie i otrzymuje odpowiedz raz od jednego SLAVE raz od drugiego,
    Przy czym wysyła zapytaie pod konkretnego SLAVE i od niego otrzymuje odpowiedź ( no wiadomo o co chodzi, - przecież ja nie będę kolegom tłumaczyć, czegoś co wiedzą dużo lepiej niż ja i mają z tym nie lada praktykę :-) )

    0
  • #20 29 Kwi 2009 09:50
    byrrt
    Poziom 21  

    Masterem musi być procesor główny, slave'm małe procki przy sht.. Faktycznie musi być RS485 w obydwie strony - bez tego nie da się podłączyć wielu czujników na jednej interface.. Procki przy sht muszą mieć jakieś adresowanie - jeżeli będą tylko dwa możesz po prostu zmienić adres w programie, ale jeżeli w przyszłości planujesz rozbudowę systemu na Twoim miejscu zrobiłbym jakieś zworki na płytce aby można było je adresować - ew. jakiś podprogram konfiguracyjny aby do nowo zaprogramowanego procka przy czujniku móc po rs485 zapisywać ID i przechowywać go np. w EEPROMie w procku. Ustal sobie jakąś sensowną ramkę danych

    0
  • #21 29 Kwi 2009 10:09
    _jta_
    Specjalista elektronik

    Jeśli tam, gdzie ma być mierzona wilgotność, będzie również mierzona temperatura, to użyć DS18B20
    do pomiaru temperatury i rozpoznawania adresu - wtedy cała komunikacja byłaby przez 1-Wire.

    0
  • #22 29 Kwi 2009 11:03
    marrog
    Poziom 22  

    Witam

    No bedzie mierzona wilgotność i temp. Przy czym SHT ma wbudowany sensor temperatury, więc można korzystać z obu pomiarów przy wykorzystaniu jednego czujnika.

    0
  • #23 29 Kwi 2009 11:26
    Dar.El
    Poziom 40  

    W książce "Mikrokontrolery AVR programowanie w języku C przykłady zastosowań" Andrzeja Witkowskiego, na stronie 170 w rozdziale "Komunikacja między wieloma urządzeniami", jest opis tego co potrzebujesz. Nie ma sensu wyważać otwartych drzwi.

    0
  • #24 29 Kwi 2009 15:34
    skit123
    Poziom 12  

    moj post
    [/code]


    100% podobny problem naj efektywniej będzie zrobić emulator ds18b20

    2 przewody mnogość czujników standardowe procedury obsługi na różnych platformach

    Jetem z okolic Gostynia mam kody emulatorów w asm , c , i bascom

    potrzebuje pomocy przy przekonwertowaniu dla atmega8 bo takie mam
    ten kod w bascom prawie działa - to znaczy odczytuje id każdym programem ale nie moge odczytać scrachpadu - procek go nadaje ale chyba zle

    jak wygląda poprawne nadanie scrachpadu 9 bajtów 9 to crc8 ?

    u mnie 1 wire chodzi na 200m bez dodatkowych układów po rs232 schemat ze strony grzesiek termometr pc

    Alres pl
    Avt pl
    Jest hex dla atmega8 ale bez zrodla wiec kicha
    Bascom eng rus
    Supper w bascom - tylko nie ten uklad nad tym pracuje przerabiając na ds18b20 Super

    CodeVisionAVR C ds1820

    Mega the best super duper jest na atmega88 w c ds1820
    uwaga ds1820 i ds18b20 inaczej koduja temp i naleza do innych rodzin
    i maja inna rozdzielczosc

    wszystko w czystym
    asm

    ASM CZ SK


    bez zrodla hex

    ENG

    0
  • #25 29 Kwi 2009 15:55
    _jta_
    Specjalista elektronik

    Z tego, co wyczytałem, SHT11 jest przewidziany do połączenia o pojemności do 100pF; to jest pojemność
    około metra, może dwóch typowego kabla. Możesz mieć łączność na większą odległość, ale wtedy musisz
    dodać jakiś układ poprawiający sygnał - np. tranzystor, które te 4mA, które daje SHT11 odpowiednio wzmocni.
    Poza tym jakieś diody zabezpieczające przed przepięciami, które mogą się indukować w kablu.

    Inna sprawa, że DS18B20 ma taki sam (nominalnie) prąd wyjściowy, a mi działa i na 250m, i nie stosuję żadnych
    diód do zabezpieczenia, tylko podłączam go wprost do kabla - ale on jest ponad 10 razy tańszy, mniej ryzykuję.

    Na pewno na kablu dłuższym niż parę m nie możesz stosować zegara 5MHz do transmisji, bo SHT11 nie nadąży
    rozładowywać pojemności kabla (chyba, że mu pomożesz dodając tranzystor). Ja w moim kablu (250m) miałem
    opóźnienia rzędu 30us, koryguję je programowo przy odbieraniu sygnałów z DS18B20 - i działa całkiem dobrze.

    Istotny może być sam kabel - jaką ma oporność - ja ćwiczyłem na jakiejś imitacji kabla, o oporności 200 om/100m,
    i to już dawało główny wkład do czasu rozładowania kabla (stan wysoki -> stan niski), a spory nawet do czasu
    ładowania (stan niski -> stan wysoki; tu nieco większy wkład dawał opornik "pull-up" - był około 1k).

    Nie wiem, jak jest z wymaganiem SHT11 co do czasu opadania na linii danych przy wysyłaniu do SHT11 - jakoś
    nie widzę, żeby to było jasno napisane, czy te 200ns to czas, jaki zapewni SHT11, czy wymagany przez niego.
    Kabel może mieć ładunek około 20nC, więc żeby go rozładować w 200ns potrzebny jest prąd 100mA.

    ---

    U mnie 1-wire z RS-232 przez układ z opornika i diód chodził do 100m z 1-ym, może 2-ma czujnikami.
    Jak podłączyłem więcej - przestawał działać. Kabel telefoniczny 4-żyłowy (prawdziwy, nie imitacja).
    Do tego działał na co drugim komputerze. Uznałem, że mnie to nie zadowala, i zrobiłem lepszy układ
    - taki, co na 200m imitacji kabla + 50m prawdziwego działał bez problemów. ;)

    Ale na 2-żyłowym mogło działać na większą odległość - ma mniejsze pojemności.

    0
  • #26 29 Kwi 2009 16:21
    skit123
    Poziom 12  

    dla 1 wire 200m 11 czujników stosuje skrętke sieciową utp 8 żył miedziane
    po 5 przesyłam z lpt przez uln2004 sygnał do optotriaków i steruje silnikami włącz wyłącz , na jednym mam stale 5v - może miałeś gdzieś zwarcie przewodów 1 wire jest na to bardzo czułe - wszystkie połączenia lutowane. rs232 w pc ładnie znosi burze - jednak taki przewód to niezła antena i kondensator :) - kilka razy padł mi lpt dlatego zastosowałem uln jako zabezpieczenie - brak optoizolacji .

    Kto pomoże z tym slave ds18b20 w bascom
    Jak wygląda nadanie scrachpada - nie mam oscyloskopu a nie jest to jawne jawne jest tylko obsługa mastera - salve jest tajny

    wikipedi jest przebieg zapisu i odczytu i master nadaje inaczej niż slave.

    Dodano po 7 [minuty]:

    kto przeanalizuje te kody są w asm c bascom i powie jak ma wyglądać nadanie scratchpadu - tylko to potrzebuje by emul działaL

    0
  • #27 29 Kwi 2009 18:14
    marrog
    Poziom 22  

    Witam

    teraz dopiero ( po przeczytaniu artykułu) łapie o co chodzi z tym emulatorem, no w sumie ciekawe rozwiązanie, a nie lepiej po RS485?
    Jak chcesz podeśle Ci na mail-a pdf z EP gdzie opisują jak w BASCOM-ie zrobić RS485 :-)

    Ja chyba zrobię to po RS-485 tak jak większość w wypowiedziach sugerowała, na 1Wire zostawie tylko DS-a którym będę mierzyć temp. na zewn. obiektu.

    0
  • #28 29 Kwi 2009 18:27
    skit123
    Poziom 12  

    włożyłem tyle pracy nie wycofam się teraz poprostu w atmedze zmierzysz wilgotnosc w sth jest przykład w bascom i wyslesz wilgotnosc jako temperature lub nawet jedno i drugie w jednej paczce danych bo ds18b20 ma dwa bajty wolne dla użytkownika - a własciwie 4 bo 2 są wykorzystywane do przechowywania zmiennych służących do obliczenia temperatury ds1820 w rozdzielczosci 12bit - a ds18b20 podaje odrazu po skonfigurowaniu wynik w 12bitach
    wiec da się przesłać w jednej paczce danych z ds18b20 udawanego temperature wilhotnosc z sht + dodatkowo orginalna z ds18b20

    Zalety - zgodnosc ze standardami na różnych platformach
    - tylko 2 przewody
    - linia ponad 150m
    - 3 wyniki pomiarów w jednym odczycie danych

    0
  • #29 29 Kwi 2009 21:21
    marrog
    Poziom 22  

    Witam

    Mam banalne pytanie do RS485, jakie powinny być kwarce przy prockach , czy muszą byc takie same? Dodam że przy Atmega mam ok 16MHz, a ja chcę zastosować przy SHT attiny2313.

    0
  • #30 30 Kwi 2009 01:10
    skit123
    Poziom 12  

    emulator ruszył błędnie obliczyłem sume crc8

    crc = crc8(mytemp(1),8)
    a miałem mytemp 8 na 8
    master nie odbierał danych bo suma kontrolna sie nie zgadzała wrzucam kod prosze paniętać że autorem jest Vladimir I. Yershov
    Program jest jeszcze do poprawek to tylko prowizorka jest 1:08 w nocy i chciałem sie podzielić radoscią
    $regfile = "M8DEF.DAT"
    $crystal = 12000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16


    Config Adc = Single , Prescaler = Auto
    Config Timer0 = Timer , Prescale = 64
    Config Timer1 = Timer , Prescale = 1

    Const Dqpin = 2
    Const Ipin = 0 ' value in DDRB for input
    Const Opin = 1 ' value in DDRB for output

    Timer Alias Tcnt0

    Dq Alias Pind.dqpin

    ' Commands
    Const Search_rom = &HF0
    Const Skip_rom = &HCC
    Const Match_rom = &H55
    Const Read_rom = &H33
    Const Writemem = &H55
    Const Convert = &H3C
    Const Read_mem = &HAA
    Const Bootload = &HEE
    Const Write_epr = &HE0
    Const Convertt = &H44 'dodane ds18b20
    Const Readscratchpad = &HBE 'dodane ds18b20
    Const Recalle2 = &HB8
    ' Timings

    Const Owpresent = 150 ' 60us < OWPresent < 240us
    Const Owpause = 50 ' 15us < OWPause < 60us
    Const Owstrobe = 10 ' org 15 ' read Dq value after Owstrobe us '12 '10 4MHz 12 8 MHz
    Const Owdata = 17 ' oprg 25
    ' Valid output data for Owdata us '20 '15 '12 '7 12

    ' Timer Delays

    Const T1reset = 60 'T1us * 490 Min Reset width
    Const Timeout = 120
    Const Czasresetumin = 6000 ' 98 'T1us * 970 Max Reset width
    Const Czasresetumax = 6250
    ' Allocate variables
    Dim Temp As Byte
    Dim I As Byte
    Dim B As Byte
    Dim C As Byte
    Dim Inmask As Byte
    Dim Readout As Byte
    Dim Addrlo As Byte
    Dim Adcnum As Byte
    Dim Addrhi As Byte
    Dim Bajt1 As Byte
    Dim Bajt2 As Byte
    Dim Bajt3 As Byte
    Dim Bajt4 As Byte
    Dim Bajt5 As Byte
    Dim Bajt6 As Byte
    Dim Bajt7 As Byte
    Dim Bajt8 As Byte
    Dim Bajt9 As Byte

    Dim Myrom(8) As Byte
    Dim Mytemp(9) As Byte

    Dim Crc16_hi As Byte
    Dim Crc16_lo As Byte

    Dim Ram(32) As Byte
    Dim Ramw(16) As Word ' At ' Ram(8) Overlay
    Dim Ad_result As Word
    Dim Bytedat As Byte
    Dim Wreg As Byte

    Dim Tstval As Byte
    Dim Temp1 As Byte
    Dim Templ As Byte
    Dim Temph As Byte
    Dim Tempw As Word At Templ Overlay

    Dim Overresol As Byte
    Dim Oversample As Byte
    Dim Overcount As Byte
    Dim Overshift As Byte
    Dim Normshift As Byte

    Dim Bitdat As Bit

    Bajt1 = &H77
    Bajt2 = &H01
    Bajt3 = &H00
    Bajt4 = &H00
    Bajt5 = &H7F
    Bajt6 = &HFF
    Bajt7 = &H09
    Bajt8 = &H10
    Bajt9 = &H97

    Restore Myrom

    For Addrlo = 1 To 17
    Read B
    Myrom(addrlo) = B
    Next Addrlo

    C = Crc8(myrom(1) , 8) 'calculate value which is 216

    Print C


    'Restore Mytemp
    ' For Addrhi = 1 To 9
    ' Read C
    ' Myrom(addrhi) = C
    ' Print C

    ' Next Addrhi


    Enable Interrupts
    Enable Timer0
    On Timer0 Isr Nosave
    Stop Timer0
    Print "start" '#1 , "T45.3 18.11.07" ' version info

    'Waitms 500
    '-----------------------------------

    Mainloop:
    Waitreset:

    Disable Interrupts
    Timer0 = 0

    Waitfall:
    ' Disable Interrupts
    'Timer1 = 0
    L1:
    sbis pind, DqPin
    rjmp L1
    L2:
    sbic pind, DqPin
    rjmp L2
    'Timer = 0
    Start Timer0

    Rwaitrise:

    L01:
    sbic pind, DqPin
    rjmp L01
    L02:
    sbis pind, DqPin
    rjmp L02

    Stop Timer0


    If Timer0 < T1reset Then Goto Waitreset
    If Timer0 > Timeout Then Goto Waitreset
    ' print "reset "

    Sendpresense:

    Waitus Owpause
    Ddrd.dqpin = Opin
    Waitus Owpresent
    Ddrd.dqpin = Ipin
    Timer = 0
    Enable Interrupts

    Readb:
    Gosub Readbyte
    Readb1:
    'print Bytedat
    'Gosub Mainloop
    If Bytedat = Match_rom Then Goto Matchrom
    If Bytedat = Read_rom Then Goto Readrom
    If Bytedat = Search_rom Then Goto Sendrom
    If Bytedat = Skip_rom Then Goto Funct
    'If Bytedat = Convertt Then Goto Pomiarth
    'If Bytedat = Readscratchpad Then Print "sp" 'Goto Sendscratchpad

    Goto Readb
    End




    Isr:
    Spl = &H5F
    Sph = 1

    If Dq = 0 Then
    Timer = T1reset

    Goto Rwaitrise
    Else
    Goto Waitreset
    End If

    Return
    '-------------------------------
    Readrom:
    For B = 1 To 8
    Bytedat = Myrom(b)
    Gosub Sendbyte
    Next B
    Goto Readb
    '----------------------------------
    Matchrom:
    For B = 1 To 8
    Gosub Readbyte
    If Bytedat <> Myrom(b) Then Goto Mainloop ' jesli romid sie nie zgadza wracaj do wreset
    Next B
    Funct:
    Gosub Readbyte
    If Bytedat = Convertt Then Goto Pomiarth
    ' ds18b20v46.delph7 najpier mowi przepisz schpad do ram
    ' HB8 (184) a potem podaj HBE (190) schpad strata czasu
    If Bytedat = Recalle2 Then Goto Waitreset
    ' nie rob nic wroc do wreset

    ', trzeba zoptymalizowac kod ds18b20v46
    If Bytedat = Readscratchpad Then Goto Sendscratchpad
    If Bytedat = Convert Then Goto Conversion
    If Bytedat = Read_mem Then Goto Readmem
    If Bytedat = Writemem Then Goto Write_mem
    If Bytedat = Bootload Then Goto Fwupgrade


    ' If Bytedat = Write_epr Then Goto Writeepr

    Goto Readb1
    '----------------------------------------
    Fwupgrade:
    Gosub Sendbyte
    jmp 0

    Readmem:
    Crc16_lo = 0
    Crc16_hi = 0
    B = 0

    Gosub Crc_update ' ByteDat = ReadMem

    Gosub Readbyte
    Addrlo = Bytedat
    Gosub Crc_update ' ByteDat = AddrLo

    Gosub Readbyte
    Gosub Crc_update ' ByteDat = AddrHi
    Readloop:
    Bytedat = Ram(addrlo + 1)

    Gosub Sendbyte
    Gosub Crc_update

    Incr Addrlo
    Incr B

    If B = 8 Then Goto Exitreadmem
    Goto Readloop
    Exitreadmem:
    B = 0

    Bytedat = Crc16_lo Xor &HFF
    Gosub Sendbyte
    Bytedat = Crc16_hi Xor &HFF
    Gosub Sendbyte

    Crc16_lo = 0
    Crc16_hi = 0

    If Addrlo < 31 Then Goto Readloop

    Goto Mainloop

    '----------------------------------------
    Write_mem:
    Crc16_lo = 0 : Crc16_hi = 0

    Gosub Crc_update 'Bytedat = Writemem

    Gosub Readbyte
    Addrlo = Bytedat
    Gosub Crc_update ' AddrLo

    Gosub Readbyte
    Gosub Crc_update ' AddrLo

    Gosub Readbyte
    Ram(addrlo + 1) = Bytedat
    Gosub Crc_update ' MemByte

    Bytedat = Crc16_lo Xor &HFF
    Gosub Sendbyte

    Bytedat = Crc16_hi Xor &HFF
    Gosub Sendbyte

    Bytedat = Ram(addrlo + 1)
    Gosub Sendbyte
    ' ====== END OF FIRST PASS ===========
    Writememloop:
    Incr Addrlo
    Crc16_hi = 0
    Crc16_lo = Addrlo ' low (Crc16) = Addrlo

    Gosub Readbyte
    Ram(addrlo + 1) = Bytedat
    Gosub Crc_update

    Bytedat = Crc16_lo Xor &HFF
    Gosub Sendbyte

    Bytedat = Crc16_hi Xor &HFF
    Gosub Sendbyte

    Bytedat = Ram(addrlo + 1)
    Gosub Sendbyte

    If Addrlo < 31 Then Goto Writememloop

    Goto Mainloop

    ' =============
    Conversion:
    Crc16_lo = 0 : Crc16_hi = 0
    Gosub Crc_update 'ByteDat = Convert

    Gosub Readbyte 'ByteDat = InMask
    Gosub Crc_update

    Gosub Readbyte 'ByteDat = ReadOut
    Gosub Crc_update

    Bytedat = Crc16_lo Xor &HFF
    Gosub Sendbyte

    Bytedat = Crc16_hi Xor &HFF
    Gosub Sendbyte

    Overresol = 12 ' Desired Oversample Resolution
    Overshift = Overresol - 10 ' Shift Left After Oversampling
    Normshift = 6 - Overshift
    Oversample = 4 ^ Overshift


    For Adcnum = 1 To 4
    Ramw(adcnum) = 0
    Next Adcnum

    Start Adc
    For Overcount = 1 To Oversample
    For Adcnum = 1 To 4
    B = Adcnum - 1
    Ad_result = Getadc(b)
    Ramw(adcnum) = Ramw(adcnum) + Ad_result
    Next Adcnum
    Next Overcount

    For Adcnum = 1 To 4
    Shift Ramw(adcnum) , Right , Overshift
    Shift Ramw(adcnum) , Left , Normshift
    Next Adcnum

    Exit_case:

    Stop Adc

    Goto Mainloop
    '======================================================
    Crc_update:


    Return
    '---------------------------------
    '================================
    Readbyte:
    For I = 0 To 7

    L11:
    sbis pind, DqPin
    rjmp L11
    L12:
    sbic pind, DqPin
    rjmp L12
    Timer = 256 - T1reset
    Start Timer0
    Rotate Bytedat , Right
    Waitus Owstrobe
    Bytedat.7 = Dq
    Next I
    Stop Timer0
    Return
    '----------------------------------
    Sendbyte:
    Adcnum = Bytedat
    For I = 0 To 7

    L21:
    sbis pind, DqPin
    rjmp L21
    L22:
    sbic pind, DqPin
    rjmp L22
    Timer = 256 - T1reset
    Start Timer0

    If Bytedat.0 = 0 Then Ddrd.dqpin = Opin
    Waitus Owdata
    Ddrd.dqpin = Ipin

    Rotate Bytedat , Right

    Next I
    Bytedat = Adcnum
    Stop Timer0
    Return
    '-----------------------------------
    Sendrom:
    ' Stop Timer0
    For I = 1 To 8
    Bytedat = Myrom(i)
    For B = 0 To 7
    '----------------------------
    Sendcbit1:

    L31:
    sbis pind, DqPin 'wH
    rjmp L31
    L32:
    sbic pind, DqPin 'wL
    rjmp L32

    If Bytedat.0 = 0 Then Ddrd.dqpin = Opin
    Waitus Owdata
    Ddrd.dqpin = Ipin
    '----------------------------
    Sendcbit2:

    L41:
    sbis pind, DqPin
    rjmp L41
    L42:
    sbic pind, DqPin
    rjmp L42

    If Bytedat.0 = 1 Then Ddrd.dqpin = Opin
    Waitus Owdata
    Ddrd.dqpin = Ipin

    '--------------------------
    Readcbit:

    L51:
    sbis pind, DqPin
    rjmp L51
    L52:
    sbic pind, DqPin
    rjmp L52

    Waitus Owstrobe

    Bitdat = Dq

    '-------------------------
    If Bitdat <> Bytedat.0 Then Goto Mainloop
    Rotate Bytedat , Right
    Next B
    Next I

    Goto Readb

    Sendtemp:

    For I = 1 To 8
    Temp = Bytedat

    '----------------------------
    Sendcbit11:

    L311:
    sbis pind, DqPin 'wH
    rjmp L311
    L321:
    sbic pind, DqPin 'wL
    rjmp L321

    If Bytedat.0 = 0 Then Ddrd.dqpin = Opin
    Waitus Owdata
    Ddrd.dqpin = Ipin
    '----------------------------
    Sendcbit21:

    L411:
    sbis pind, DqPin
    rjmp L411
    L421:
    sbic pind, DqPin
    rjmp L421

    If Bytedat.0 = 1 Then Ddrd.dqpin = Opin
    Waitus Owdata
    Ddrd.dqpin = Ipin

    '--------------------------
    Readcbit1:

    L511:
    sbis pind, DqPin
    rjmp L511
    L521:
    sbic pind, DqPin
    rjmp L521

    Waitus Owstrobe

    Bitdat = Dq

    '-------------------------
    If Bitdat <> Bytedat.0 Then Goto Mainloop
    Rotate Bytedat , Right

    Next I

    Goto Readb
    Pomiarth:

    Goto Mainloop

    Sendscratchpad:
    Bytedat = Bajt1
    Gosub Sendbyte
    Bytedat = Bajt2
    Gosub Sendbyte
    Bytedat = Bajt3
    Gosub Sendbyte
    Bytedat = Bajt4
    Gosub Sendbyte
    Bytedat = Bajt5
    Gosub Sendbyte
    Bytedat = Bajt6
    Gosub Sendbyte
    Bytedat = Bajt7
    Gosub Sendbyte
    Bytedat = Bajt8
    Gosub Sendbyte
    Bytedat = Bajt9
    Gosub Sendbyte
    'Print Bytedat
    'Print Bajt1
    'Print Bajt2
    'Print Bajt3
    'Print Bajt4
    'Print Bajt5
    'Print Bajt6
    'Print Bajt7
    'Print Bajt8
    'Print Bajt9
    Goto Readb
    End


    Myrom:
    'Data &HB8 , &H00 , &H00 , &H00 , &HC2 , &HF0 , &HC8 , &H28
    'Data &H28 , &HC8 , &HF0 , &HC2 , 00 , 00 , 00 , &HB8
    'Data &H20 , &HAC , &HC7 , &H0A , 00 , 00 , 00 , &HA6
    Data &H28 , &H71 , &H2E , &HBA , 00 , 00 , 00 , &H61
    'Data &H77 , &H01 , &H00 , &H00 , &H7F , &HFF , &H09 , &H10 , &H00
    'Data &H20 , &HA5 , &HC1 , &H0A , 00 , 00 , 00 , &HAC
    'Mytemp:
    'Data &H81 , &H55 , &H22 , &H24 , 00 , 00 , 00 , &H6A
    'Data &H77 , &H01 , &H00 , &H00 , &H7F , &HFF , &H09 , &H10 , &H97

    0