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.

DS18B20 atmega162 serwer www???

michalb67 26 Sty 2008 14:52 2095 0
  • #1 26 Sty 2008 14:52
    michalb67
    Poziom 10  

    Witam! Mam taki malutki problem. Chciałem stworzyć sobie taki serwer www (kod programu ściągnięty z archiwów AVT) który pokazywał by mi przez internet temperaturę w jakimś oddalonym pomieszczeniu w innym budynku np. Do budowy tego wykorzystałem AVT-956 tj. internetowy sterownik I/O. Akurat go posiadam ponieważ robiłem nim ćwiczenia na pracowni informatycznej. Ogólnie służy on do sterownia wyjściami i przyjmowania sygnałów wszelakich na wejścia i wyświetlania w przeglądarce internetowej. Ale teraz wymyśliłem że podłącze sobie do niego DS18B20 i będe oglądał temperaturę. No i tak zrobiłem ale nici zero odzewu od DS-a. I moje pytanie takie, ponieważ po chwili sobie zmierzyłem napięcie dochodzące do Ds-a i mam na nim 7,5V z tego co wiem to może być maks. 5.5V czy to mogło być przyczyną problemów?? Poniżej zamieszczam kod źródłowy w Bascomie
    Czujnik podłączony jest do portu D.5 który jest podciągnięty przez rezystor 4.7kΩ do 5V

    Code:

    'Program bedacy serwerem HTTP (www)
    'Umozliwia logowanie do strony www
    'Na stronie www wyswietlana jest zmierzona przez serwer temperatura
    'Z poziomu strony www jest mozliwosc zapalenia lub zgaszenia diody LED
    'Wyswietlany jest dodatkowo status diody LED.
    'Wyswietlana strona jest automatycznie odswiezana co 5 sekund
    'Easy TCP/IP
    $prog &HFF , &HEF , &HD9 , &HFD                             'FuseBits
    $regfile = "M162def.dat"                                    'typ mikrokontrolera
    $crystal = 4000000                                          'czestotliwosc zegara
    $xa                                                         'wlaczenie dostepu do zewnetrznej magistrali mikrokontrolera
    $hwstack = 50                                               'wartosc stosu
    $swstack = 50                                               'wartosc stosu
    $framesize = 50                                             'wartosc ramki
    $lib "tcpip.lbx"                                            'zalaczenie biblioteki tcp/ip





    'stałe dla modułu TCP/IP
    Const Sock_stream = $01                                     ' Tcp
    Const Sock_dgram = $02                                      ' Udp
    Const Sock_ipl_raw = $03                                    ' Ip Layer Raw Sock
    Const Sock_macl_raw = $04                                   ' Mac Layer Raw Sock
    Const Sel_control = 0                                       ' Confirm Socket Status
    Const Sel_send = 1                                          ' Confirm Tx Free Buffer Size
    Const Sel_recv = 2                                          ' Confirm Rx Data Size
    Const Sock_closed = $00                                     ' Status Of Connection Closed
    Const Sock_arp = $01                                        ' Status Of Arp
    Const Sock_listen = $02                                     ' Status Of Waiting For Tcp Connection Setup
    Const Sock_synsent = $03                                    ' Status Of Setting Up Tcp Connection
    Const Sock_synsent_ack = $04                                ' Status Of Setting Up Tcp Connection
    Const Sock_synrecv = $05                                    ' Status Of Setting Up Tcp Connection
    Const Sock_established = $06                                ' Status Of Tcp Connection Established
    Const Sock_close_wait = $07                                 ' Status Of Closing Tcp Connection
    Const Sock_last_ack = $08                                   ' Status Of Closing Tcp Connection
    Const Sock_fin_wait1 = $09                                  ' Status Of Closing Tcp Connection
    Const Sock_fin_wait2 = $0a                                  ' Status Of Closing Tcp Connection
    Const Sock_closing = $0b                                    ' Status Of Closing Tcp Connection
    Const Sock_time_wait = $0c                                  ' Status Of Closing Tcp Connection
    Const Sock_reset = $0d                                      ' Status Of Closing Tcp Connection
    Const Sock_init = $0e                                       ' Status Of Socket Initialization
    Const Sock_udp = $0f                                        ' Status Of Udp
    Const Sock_raw = $10                                        ' Status of IP RAW

    Const Authenticate = 1                                      'wartosc 0 - wylaczenie logowania, 1 - wlaczenie logowania
    Enable Interrupts
    Config Tcpip = Int0 , Mac = 00.40.66.34.56.78 , Ip = 192.168.1.150 , Submask = 255.255.255.0 , Gateway = 192.168.1.1 , Localport = 1000 , Tx = $55 , Rx = $55       'konfiguracja modulu tcp/ip

    Config 1wire = Pind.5                                       'konfiguracja interfejsu 1wire

    Declare Sub Pom_temp                                        'procedura odczytu temperatury z DS18B20

    Dim S As String * 500 At &H200 , Shtml As String * 15 , Sheader As String * 30       'zmienne tekstowe
    Dim Woffset As Word , Wsize As Word , Bgenerate As Bit      'zmienne wykorzystywany przy wysylaniu strony www do przegladarki
    Dim Buf(500) As Byte At &H200 Overlay                       'tablica buf umieszczona w tej samej przestrzeni adresowej co zmienna S
    Dim Tempw As Word                                           'zmienna pomocnicza
    Dim I As Byte , Bcmd As Byte , P1 As Byte , P2 As Byte , Size As Word       'zmienne pomocnicze
    Dim Bcontent As Byte                                        'zmienna pomocnicza
    Dim Bauth As Byte , Ipcon As Long                           'zmienne wymagane przy wlaczonym logowaniu
    Dim Led_f As Bit                                            'flaga stanu diody LED
    Dim Count As Word                                           'zmienna licznikowa
    Dim Temperature As String * 6                               'zmienna przechowujaca tekstowo temperature
    Dim Tmp_ds As Integer
    Dim Temp_zm As Integer
    Dim Temp5 As Byte
    Dim Temp_ds(2) As Byte
    Dim T As Integer
    Dim Blad As String * 6

    Temp5 = 0
    I = 0                                                       'zmienna potrzebna przy pomiarze temperatury




    Do
      Tempw = Socketstat(i , 0)                                 'pobranie statusu polaczenia
      Select Case Tempw                                         'w zajeznosci od statusu jesli
        Case Sock_established                                   'polaczenie jest ustabilizowane to

          If Getdstip(i) <> Ipcon Then                          'jesli pobrany adres IP jest rowny adresowi IP w zmiennej Ipcon to
            Bauth = 0                                           'zerowanie bitu autoryzacji (po odswiezeniu strony nie bedzie ponownego logowania)
          End If
          Tempw = Socketstat(i , Sel_recv)                      'sprawdzenie czy sa dane do odebrania

          If Tempw > 0 Then                                     'jesli tempw wieksze od 0 to
            Bcmd = 0                                            'zerowanie bcmd
            Do                                                  'poczatek petli
              Tempw = Tcpread(i , S)                            'odczyt danych z TCP
              If Left(s , 3) = "GET" Then                       'jesli metoda GET to
                Bcmd = 1                                        'przypisanie do zmiennej wartosci 1
                Gosub Page                                      'skok do podprogramu Page
              Elseif Left(s , 4) = "HEAD" Then                  'jesli metoda HEAD to
                Bcmd = 1                                        'przypisanie do zmiennej wartosci 1
                Gosub Page                                      'skok do podprogramu Page
              Elseif Left(s , 4) = "POST" Then                  'jesli metoda POST to
                Bcmd = 2                                        'przypisanie do zmiennej wartosci 3
                Gosub Page                                      'skok do podprogramu Page
              Elseif Left(s , 15) = "Content-Length:" Then      'w przypadku metody POST odczytywana jest ilosc danych
                S = Mid(s , 16) : Bcontent = Val(s)             'ktora po przeksztalceniu zapisywana jest do zmiennej Bcontent
              Elseif Left(s , 20) = "Authorization: Basic" Then 'wykrywany jest komunikat autoryzacji
                Print S                                         'wyslanie do terminala zawartosci zmiennej S
                S = Mid(s , 22)                                 'odczyt zakodowanych znakow uzytkownika i hasla wyslanych przez przegladarke

                If Base64dec(s) = "test:test" Then              'jest uzytkownik i haslo poprawne to
                  Bauth = 1                                     ' zapis ze autoryzacja przebiegla ok
                  Ipcon = Getdstip(i)                           'zapis numeru IP uzytkownika
                End If

              End If
            Loop Until S = ""                                   'oczekiwanie az odebrane zostana wszystkie dane
            #if Authenticate                                    'jesli autoryzacja wlaczona to
              If Bauth = 0 Then                                 'i jeszcze nie przeprowadzono autoryzacji to
                Tempw = Tcpwrite(i , "HTTP/1.0 401 OK{013}{010}")       'wyslanie do przegladarki komendy autoryzacji 401
                Tempw = Tcpwrite(i , "WWW-Authenticate: Basic realm={034}Easy TCP/IP{034}{013}{010}")       'wyslanie nazwy serwera www
                Goto Continue                                   'skok do etykiety
              Else                                              'w przeciwnym razie
                Tempw = Tcpwrite(i , "HTTP/1.0 200 OK{013}{010}")       'wyslanie do przegladarki komendy 200
              End If
            #else                                               'gdy autoryzacja wylaczona to
                Tempw = Tcpwrite(i , "HTTP/1.0 200 OK{013}{010}")       'wyslanie do przegladarki komendy 200
            #endif
            If Bcmd = 2 Then                                    'jesli bcmd=3 to wykorzystywana metoda POST

              Tempw = Tcpread(i , Buf(1) , Bcontent)            'odczyt danych z TCP
              Bcontent = Bcontent + 1                           'obliczenie zmiennej
              Buf(bcontent) = 0                                 'dodanie znaku konca tekstu

            End If
            Gosub Struc                                         'skok do podprogramu struc
    Continue:                                                   'etykieta

            Closesocket I                                       'zamknięcie połączenia (gniazda)
          End If
        Case Sock_close_wait                                    'oczekiwanie na zamkniecie gniazda

          Closesocket I                                         'zamknięcie połączenia (gniazda
        Case Sock_closed                                        'zamkniecie gniazda

          I = Getsocket(0 , Sock_stream , 80 , 0)               'otarcie gniazda o numerze idx na porcie 80
          Socketlisten I                                        'otwarcie gniazda w trybie serwera

      End Select                                                'koniec instrukcji case

      Call Pom_temp

    Loop                                                        'koniec nieskonczonej petli
    End                                                         'koniec programu


    Page:                                                       'podprogram pobierajacy adres strony z przegladarki
      P1 = Instr(s , " ")                                       'szuka pierwszej spacji
      P1 = P1 + 1                                               'podanie do P1 wartosci 1
      P2 = Instr(p1 , S , " ")                                  'szuka drugiej spacji
      P2 = P2 - P1                                              'odjecie od P2 wartosci P1
      Shtml = Mid(s , P1 , P2)                                  'wydobywa nazwe strony
      Shtml = Lcase(shtml)                                      'zamienia duze znaki strony na male
      Print "HTML page:" ; Shtml                                'wyslanie do terminala nazwy strony
    Return                                                      'powrot z podprogramu

    Struc:                                                      'podprogram wysylajacy strone www
      Bgenerate = 0                                             'zerowanie zmiennej
      Select Case Shtml                                         'w zaleznosci od otrzymanego adresu
        Case "/index.htm"                                       'jesli adres index.htm to
          Bgenerate = 1                                         'wartosc zmiennej 1
        Case Else                                               'w przeciwnym razie
          Bgenerate = 0                                         'wartosc zmiennej 0
      End Select                                                'koniec instrukcji wyboru
      Tempw = Tcpwrite(i , "Content-Type: text/html{013}{010}") 'wyslanie do przegladarki komunikatu

        If Bgenerate = 0 Then                                   'jest zmienna 0 to
        S = "<html><head><title</title></head><body onload='window.location.href=" + Chr(34) + "/index.htm" + Chr(34) + "'></body></html>"       'wyslanie przekierowania na adres index.htm
        Wsize = Len(s)                                          'obliczenie ilosci wysylanych znakow
        Sheader = "Content-Length: " + Str(wsize) + "{013}{010}"       'dodanie ilosci wysylanych znakow
        Tempw = Tcpwritestr(i , Sheader , 255)                  'wyslanie ilosci danych
        Tempw = Tcpwrite(i , S , Wsize)                         'wyslanie strony www
                                      'zerowanie zmiennej
         Else                                                   'w przeciwnym razie
        Count = 0                                               'zerowanie zmiennej
        Restore Www                                             'ustawienie wskaznika na tablice www
        Wsize = 10000
        Sheader = "Content-Length: " + Str(wsize) + "{013}{010}"       'dodanie ilosci wysylanych znakow
        Tempw = Tcpwritestr(i , Sheader , 255)                  'wyslanie ilosci danych
        Count = 0                                               'zerowanie zmiennej
        Restore Www                                             'ustawienie wskaznika na tablice www
       Do
          Read S
       If S = "Temperatur:" Then
          S = S + Temperature
       End If
     Tempw = Tcpwritestr(i , S , 255)
     Loop Until S = "</body></html>"
      End If



     Sub Pom_temp

            If Temp5 = 0 Then                                   'jesli temp5=0 to
        1wreset                                                 'zerowanie magistrali 1wire
        1wwrite &HCC                                            'przeskoczenie numeru ukladu DS
        1wwrite &H44                                            'start pomiaru
      End If
      Incr Temp5                                                'zmiekszenie o 1 wartosci temp5
      If Temp5 < 15 Then                                        'jesli temp5 < 15 to
        Waitms 50                                               'czekaj 50 ms
      Else                                                      'w przeciwnym razie
        Temp5 = 0                                               'temp5=0
        1wreset                                                 'zerowanie magistrali 1wire
        1wwrite &HCC                                            'przeskoczenie numeru ukladu DS
        1wwrite &HBE                                            'rozkaz odczytu temperatury
        Temp_ds(1) = 1wread(2)                                  'odczyt temperatury
        Tmp_ds = Temp_ds(2)                                     'obliczenie temperatury
        Shift Tmp_ds , Left , 8                                 'dalsze obliczenia
        Tmp_ds = Tmp_ds + Temp_ds(1)                            'dalsze obliczenia
        Temp_zm = Tmp_ds / 16                                   'dalsze obliczenia
        Temperature = Str(temp_zm)


                                     'zamiana temperatury na postac tekstowa

      End If



       End Sub



    Www:                                                        'Zawartosc Strony Www
    Data "<html><head>"
    Data "<meta content={034}text/html; charset=ISO-8859-2{034}"
    Data "http-equiv={034}content-type{034}>"
    Data "<meta HTTP-EQUIV={034}refresh{034} CONTENT={034}5{034}>"
    Data "<title>Serwer www</title></head><body style={034}"
    Data "color: rgb(0, 0, 0); background-color: rgb(125, 255, 118); {034}"
    Data " alink={034}#000099{034} link={034}#000099{034} vlink={034}#990099{034}>"
    Data "<div style={034}text-align: center;{034}><big><big style={034}"
    Data "font-family: Agency FB; color: rgb(102, 51, 0);{034}><big><big><big><big><big"
    Data "style={034}font-weight: bold;{034}>Serwer www</big></big></big></b...g></big><br></div>"
    Data "<div style={034}text-align: center;{034}><big><big><big><big>Easy TCP/IP<br>"
    Data "</big></big></big></big><div style={034}text-align: left;{034}>"
    Data "<hr style={034}height: 5px; width: 100%;{034}></div></div>"
    Data "<div style={034}text-align: center;{034}><big><big><span style={034}font-style: italic;{034}><span style={034}"
    Data "color: rgb(255, 0, 0);{034}>"
    Data "Temperatura:"
    Data " &deg;C</span><br></span></big></big>"
    Data "<hr style={034}height: 5px; width: 100%;{034}><div style={034}"
    Data "text-align: left;{034}><big style={034}font-family: Agency FB; color: rgb(51, 102, 255);{034}>"
    Data "<big><span style={034}font-style: italic;{034}><span style={034}font-weight: bold;{034}>Status LED: </span> &nbsp;"
    Data "<span style={034}"
    Data "color: rgb(204, 102, 204);{034}>"
    Data "</span> </span></big></big><br>"
    Data "<big><big><span style={034}font-style: italic;{034}></span></big></big></div>"
    Data "<div style={034}text-align: left;{034}><big><big><span style={034}font-style: italic;{034}></span></big></big>&nbsp;<br>"

    Data "<hr style={034}height: 3px; width: 100%;{034}></div></div>"
    Data "</body></html>"



    Dodano po 3 [godziny] 43 [minuty]:

    Witam:) Teraz to aż mi głupio za ten temat. Problem już rozwiązany chodziło tylko o jedną literkę której brakowało i wszystko działa a męczyłem się z tym tydzień:) Niestety Bascom nie widział błędu:( i wszystko kompilował. Tak więc temat zamykam:)

    0 0