• Email
  • Forum

Emulator DS18B20 napisany w Bascom


KOD I SCHEMAT ZNAJDZIESZ NA FORUM


Odsłona trzecia - pomniejszona ;)

[Rozmiar: 91198 bajtów]


[Rozmiar: 61662 bajtów]

[Rozmiar: 120018 bajtów]

Może się przydać wszędzie tam gdzie chcemy przetestować jak badany układ zachowa się przy wskazaniu innej temperatury.
Od -55 do +125 stopni
bez mrożenia lub grzania czujników.

-chłodnictwo-
-ogrzewanie-
i inne..

[Rozmiar: 37989 bajtów]


Druga odsłona

Teraz dodałem kilka ciekawych funkcji:
-urządzenie można wyszukiwać poprzez MatchROM, SearchROM a nawet Verify

pozwala to na pracę w środowisku wielu czujników


-urządzenie może skopiować ROM ID działającego czujnika by podmienić go w systemie

Możemy podmienić czujnik w działającym systemie który ma przyuczone ID`y swoich czujników

-temperatury możemy zmieniać z trzema różnymi skokami 0,1st, 0,5st i 1st.`

Można szybko zmienić wielkość skoku temperatury naciskając krótko przycisk enkodera

-urządzenie pamięta nastawy temperatury i po uruchomieniu startuje od zapamiętanej wartości

Jeśli chcemy zapisać wartość wystarczy dłużej przytrzymać przycisk enkodera

-może pracować w trybie odczytu tylko dwóch bajtów lub dziewięciu z CRC

Nie ma znaczenia jak będzie go odpytywał Master. Zachowuje się jak czujnik.

-można przywrócić pierwotne ustawienia

Przytrzymując przycisk podczas uruchamiania można usunąć zapamiętane wartości i urządzenie ma swój ID

Możliwość zasilania z układu lub baterii.
Kiedy nie wprowadzamy danych to po chwili podświetlanie obniża swoją moc




[Rozmiar: 37989 bajtów]

Opiszę jeszcze ideę jak mi przyświecała :D

Chodziło o to by można było odłączyć czujnik w pracującym układzie i emulować jego obecność ponieważ jego ID można w sekundę skopiować do urządzenia.
Można więc sprawdzić jak sterownik zamrażarki będzie reagować na -28st a jak na -30st bez potrzeby oczekiwania
To samo z Alarmem o gotującej się wodzie w instalacji C.O. Teraz można bez gotowania wody przetestować Alarm
Urządzenie reaguje na SkipROM, ale też pozwala się wyszukiwać. Niepytane milczy.
Dodatkowo w tej wersji zastosowałem całkowicie nowe podejście i czujnik zawsze odpowiada na zapytania Mastera nawet jeśli akurat kręcimy enkoderem. Brak błędów transmisji był priorytetem.

Nowy filmik

Poprzedni filmik

Poniżej program na którym testowałem urządzenie. Sprawdza CRC, zawartość ósmego bajtu i rózne inne zachowania

$regfile = "m32adef.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 100
$framesize = 100

Config Submode = New

'### LCD DISPLAY ###
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2       ', Wr = Portc.6
Config Lcd = 20x4                                           'nowy sposób zapisu
Cursor Off Noblink
Cls

Config Porta = Output

Led1 Alias Porta.7
Led2 Alias Porta.6

Config 1wire = Portc.0
'timer
Config Timer1 = Timer , Prescale = 256 , Compare_a = Disconnect , Compare_b = Disconnect , Clear Timer = 1
Enable Compare1a : On Compare1a Timer1_isr Nosave : Compare1a = 31249       '1s @8MHz

Dim 1s As Byte , N As Byte



Dim Id_ds1(8) As Byte
Dim Id_ds2(8) As Byte

Dim Ds_data(9) As Byte , Sum As Byte
Dim T As Integer At Ds_data(1) Overlay                      'dwa pierwsze bajty tablicy tworzą tez Integer ;)
Dim Celsius As String * 2
 Celsius = "{223}C"

Dim Temp_str As String * 6
Dim Help_str As String * 6

 Id_ds1(1) = 1wsearchfirst()
 Id_ds2(1) = 1wsearchnext()


 Lcd " ID sensor one"
  Lowerline

   For N = 1 To 8
    Lcd Hex(id_ds1(n))
   Next N

 Waitms 2500 : Cls
 Waitms 500

 Lcd " ID sensor two"
  Lowerline

   For N = 1 To 8
    Lcd Hex(id_ds2(n))
   Next N

 1wreset
  1wwrite &HCC
  1wwrite &H44


 Wait 3 : Cls



 Enable Interrupts


Do

  If 1s = 1 Then
      1s = 0
    '               SENSOR 1
    '**************************************
    '***  VERIFY IF SENSOR IS PRESENT   ***
    '***  TEST 8`th BYTE &H10 EXPECTED  ***
    '***        TEST CRC                ***
    '**************************************


   'start test so LED ON
    Set Led1


    1wverify Id_ds1(1)

     If Err = 0 Then

      1wwrite &HBE

      Ds_data(1) = 1wread(9)


        If Ds_data(8) = &H10 Then

         Sum = Crc8(ds_data(1) , 8)

          If Sum = Ds_data(9) Then

           T = T * 10
           T = T \ 16

           Help_str = Str(t)
            Temp_str = Format(help_str , "#.#")
             Locate 1 , 1 : Lcd "T=" ; Temp_str ; Celsius ; Spc(3)

             If T > 0 Then Reset Porta.0 Else Set Porta.0

                  If T > 150 Then Set Porta.1 Else Reset Porta.1
                  If T > 250 Then Set Porta.2 Else Reset Porta.2
                  If T > 450 Then Set Porta.3 Else Reset Porta.3
                  If T > 650 Then Set Porta.4 Else Reset Porta.4
                  If T > 1000 Then Set Porta.5 Else Reset Porta.5
                  If T > 1200 Then Set Porta.6 Else Reset Porta.6

            'everything OK so LED OFF
             Reset Led1

          Else

           Home : Lcd Spc(16)
            Locate 1 , 1 : Lcd "E CRC"

          End If

        Else

           Locate 1 , 1 : Lcd "ERR4 "

        End If

     Else

        Locate 1 , 1 : Lcd "ERR5 "

     End If



     Set Led2

      1wreset

        If Err = 0 Then

         1wwrite &H55
          1wwrite Id_ds2(1) , 8


             If Err = 0 Then

               1wwrite &HBE
                Ds_data(1) = 1wread(2)

                  T = T * 10
                  T = T \ 16

                  Help_str = Str(t)
                  Temp_str = Format(help_str , "#.#")
                  Locate 2 , 1 : Lcd "T=" ; Temp_str ; Celsius ; Spc(3)



                   Reset Led2

             Else

                   'Home : Lcd Spc(16)
                   Locate 2 , 1 : Lcd "ERR5"


             End If

        Else

          Home : Lcd Spc(16)
          Locate 2 , 1 : Lcd "ERR1"

        End If


      1wreset

         If Err = 0 Then
          1wwrite &HCC
          1wwrite &H44
         Else
          Locate 2 , 1 : Lcd "ERR2 "
         End If

  End If

Loop
End

Timer1_isr:
   push r24
   !in r24,sreg
   push r24

    1s = 1
     'Tuned with NoSave Tool

   pop r24
   !out sreg,r24
   pop r24
Return
Email

Jeśli mogę w czymś pomóc, napisz.