DS18B20 rare waarden

Ik denk dat het in het datasheet staat. Ik denk dat ik het ooit werkend heb gehad. Maar ik weet het niet meer uit m'n hoofd en nu geen tijd om uit te zoeken. Kijk eventueel even in datasheets van oudere DS1820 chips (andere tussenletters of zelfs geen letter). Mogelijk wordt het nu als "bekend" verondersteld terwijl het er vroeger in stond. Anders een OneWire eeprom of zo opzoeken. Daar staat vast een schrijf voorbeeld in uitgespeld. Het zal bij de 1820 vast wel ongeveer hetzelfde werkenn.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
buckfast_beekeeper

Golden Member

Van Lambiek wordt goede geuze gemaakt.
Bavelt

Golden Member

Ik had al een beetje in deze sfeer gezocht.

Dit zou betekenen dat het er zo uit zou moeten zien:

pic basic code:


'====================================================================================================
 Sub procedure Read_Temp()              'Read Temperature from DB18B20
'====================================================================================================
  Ow_Reset(PORTB, 0)                    'Onewire reset signal
  Ow_Write(PORTB, 0, 0x4E)
  Ow_Write(PORTB, 0, 0x00)              'Configuration TH
  Ow_Write(PORTB, 0, 0x00)              'Configuration TL
  Ow_Write(PORTB, 0, 0x1F)              '9 bits resolution ?
  Ow_Write(PORTB, 0, 0xCC)              'Issue command SKIP_ROM
  Ow_Write(PORTB, 0, 0x44)              'Issue command CONVERT_T
  Delay_us(120)
  Ow_Reset(PORTB, 0)                    'Onewire reset signal
  Ow_Write(PORTB, 0, 0xCC)              'Issue command SKIP_ROM
  Ow_Write(PORTB, 0, 0xBE)              'Read ScratchPad

  TempL1 =  Ow_Read(PORTB, 0)
  TempH1 =  Ow_Read(PORTB, 0)
  Temp  = TempH1 <<4 + TempL1 >>4
  TempDec = TempL1 and 0x0F
  If TempDec > 4 Then Inc(Temp) End If  'From .5 and above add 1 Degree
End Sub

Na de 0x4E drie keer een write: de eerste 2 de temp's voor het alarm TH en TL, dan het configuratieregister.

9-bits zou zijn %00011111 (=0x1F).

Maar op deze constructie reageert het lezen van temp niet meer.
ik krijg een dummy waarde terug en de sensor reageert niet...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Er staat zelfs een example in de helpfile:

pic basic code:


  '--- Main loop
  while (TRUE)
    '--- Perform temperature reading
    Ow_Reset(PORTE, 2)                                     ' Onewire reset signal
    Ow_Write(PORTE, 2, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTE, 2, 0x44)                               ' Issue command CONVERT_T
    Delay_us(120)

    Ow_Reset(PORTE, 2)                                     ' Onewire reset signal
    Ow_Write(PORTE, 2, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTE, 2, 0xBE)                               ' Issue command READ_SCRATCHPAD

    temp =  Ow_Read(PORTE, 2)
    temp = (Ow_Read(PORTE, 2) << 8) + temp

    '--- Format and display result on Lcd

    Display_Temperature(temp)

    Delay_ms(520)
  wend
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Jawel, maar niet van het schrijven naar het configuratie register (0x4E)
Edit: en daarmee wil ik het ding van de standaard resolutie van 12-bit naar 9-bits brengen vanwege de conversietijd.

[Bericht gewijzigd door Bavelt op woensdag 25 januari 2023 12:51:51 (45%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dit is een van de redenen dat ik 't ding nooit gebruik... :) (zelfde geldt voor de uni/o bus...)

[Bericht gewijzigd door Arco op woensdag 25 januari 2023 13:14:07 (24%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 25 januari 2023 09:15:02 schreef rew:
Ik denk dat het in het datasheet staat. Ik denk dat ik het ooit werkend heb gehad. Maar ik weet het niet meer uit m'n hoofd en nu geen tijd om uit te zoeken. Kijk eventueel even in datasheets van oudere DS1820 chips (andere tussenletters of zelfs geen letter). Mogelijk wordt het nu als "bekend" verondersteld terwijl het er vroeger in stond. Anders een OneWire eeprom of zo opzoeken. Daar staat vast een schrijf voorbeeld in uitgespeld. Het zal bij de 1820 vast wel ongeveer hetzelfde werkenn.

De DS1820 (dus zonder 'B') had een resolutie van 9-bits.

De latere versie DS18B20 kan tot 12-bits.

Maar ik heb nog geen enkel voorbeeld kunnen vinden hoe het configuratie-register in te stellen. De datasheet gaat daar heel snel over heen en toont geen voorbeeld.

pic basic code:


  Ow_Write(PORTB, 0, 0x4E)
  Ow_Write(PORTB, 0, 0x00)              'Configuration TH
  Ow_Write(PORTB, 0, 0x00)              'Configuration TL
  Ow_Write(PORTB, 0, 0x1F)              '9 bits resolution ?

werkt niet en

pic basic code:


Ow-Write(PORTB, 0, 0x00, 0x00, 0x1F) mag niet...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Wel vond ik dit vandaag:

DS18B20 write scratchpad-bug (0x4E) / QT18B20 scratchpad [5,12]:
If 3 data bytes are sent (as per DS18B20 datasheet, TH, TL, Config) then <byte 6> changes to the third byte sent,

Dat gebeurt nl bij enkele 'klonen'...

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

Great-Cow Basic heeft diverse libraries voor de Dallas-1Wire dingen.
https://gcbasic.sourceforge.net/Typesetter/index.php/Home

De jongere generatie loopt veel te vaak zijn PIC achterna.
Bavelt

Golden Member

Ik heb hier lopen grasduinen.

Wat ik tegenkwam is dit:

pic basic code:


Sub DS18B20SetResolution ( in DS18B20SetResolutionValue  )

   wait 250 ms ' Not really needed but left in just in case ***
   MasterRST
   PPulse
   wait 1 ms
   OWout SkipRom         ' Bypass ds18b20 serial number read
   wait 1 ms
   OWout WriteScratch
   wait 1 ms
   OWout 0x00             'User byte 0 - Unused
   OWout 0x00             'User byte 1 - Unused


   Select Case DS18B20SetResolutionValue
        Case DS18B20_TEMP_9_BIT
              OWout ( DS18B20_TEMP_9_BIT )  'set up 9bits
        Case DS18B20_TEMP_10_BIT
              OWout ( DS18B20_TEMP_10_BIT )  'set up 10bits
        Case DS18B20_TEMP_11_BIT
              OWout ( DS18B20_TEMP_11_BIT )  'set up 11bits
        Case DS18B20_TEMP_12_BIT
              OWout ( DS18B20_TEMP_12_BIT )  'set up 12bits
        Case Else
              OWout ( DS18B20_TEMP_12_BIT )  'set up en 12 bits (0x7F)
   End Select

      wait 250 ms ' wait for write to complete


End Sub

Ook hier zie ik het schrijven (WriteSratch (=0x4E)

gevolgd door twee keer 0x00
En daarna een waarde.

Maar wat hier nu precies gebeurt is tamelijk onoverzichtelijk met al die constanten en verwijzingen naar andere routines / delen...

Het punt moet zijn dat je het 'scratchpad' vult. Maar wat er daarna moet gebeuren (schrijven naar EEprom?) is voor mij een raadsel.

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

Het staat er toch vrij duidelijk in (in de datasheet).
Config Registers R0/R1 bepalen de resolutie.

Default start hij op in 12 Bits mode.

Data is written to bytes 2, 3, and 4 of the scratchpad using
the Write Scratchpad [4Eh] command; the data must be
transmitted to the DS18B20 starting with the least significant bit of byte 2. To verify data integrity, the scratchpad
can be read (using the Read Scratchpad [BEh] command)
after the data is written.

ds18b20.pdf

De jongere generatie loopt veel te vaak zijn PIC achterna.

[edit]

Mijn excuses, ik zie dat ik hier de mist in ga. Ik zal er later nog eens naar kijken.
Wat hier stond was een poging de Arduino voorbeeld schets aan te passen naar 9 bit, wat leek te werken, maar de uitgelezen configuratie klopte niet :+

[Bericht gewijzigd door Aart op donderdag 26 januari 2023 09:58:50 (91%)

Bavelt

Golden Member

Op 26 januari 2023 09:41:17 schreef Aart:
[edit]

Mijn excuses, ik zie dat ik hier de mist in ga. Ik zal er later nog eens naar kijken.
Wat hier stond was een poging de Arduino voorbeeld schets aan te passen naar 9 bit, wat leek te werken, maar de uitgelezen configuratie klopte niet :+

Volgens de datasheet moet byte 4 worden aangepast voor de resolutie.
En daarom moeten er eerst twee writes worden gedaan om daar te komen.

Maar HOE dat moet, is mijn worsteling.

Fouten zijn het bewijs dat je het probeert..

Wat ik probeerde was letterlijk:

Data is written to bytes 2, 3, and 4 of the scratchpad using the Write Scratchpad [4Eh] command; the data must be transmitted to the DS18B20 starting with the least signifi- cant bit of byte 2. To verify data integrity, the scratchpad can be read (using the Read Scratchpad [BEh] command) after the data is written.

dus:

code:

 
ds.write(0x4E); 
  ds.write(0x00); // Write scratchpad byte 2
  ds.write(0x00); // Write scratchpad byte 3
  ds.write(0x1F); // Write scratchpad byte 4

De rest doet de library.

Bavelt

Golden Member

Op 26 januari 2023 09:06:38 schreef bprosman:
Het staat er toch vrij duidelijk in (in de datasheet).
Config Registers R0/R1 bepalen de resolutie.

Default start hij op in 12 Bits mode.

[bijlage]

Data is written to bytes 2, 3, and 4 of the scratchpad using
the Write Scratchpad [4Eh] command; the data must be
transmitted to the DS18B20 starting with the least significant bit of byte 2. To verify data integrity, the scratchpad
can be read (using the Read Scratchpad [BEh] command)
after the data is written.

[bijlage]

Dit had ik gezien; er staat weliswaar beschreven welke byte (configuration register) en bits (6 en 5) de resolutie bepalen. En dat je het write commando 0x4E moet gebruiken.

Maar het houdt op HOE dat moet.

Ik had verwacht iets in de geest van:

pic basic code:


Ow_Write(PORTB, 0, 0x4E)              'Write Scratchpad
Ow_Write(PORTB, 0, 0x00)              'Write TH-Register
Ow_Write(PORTB, 0, 0x00)              'Write TL-Register
Ow_Write(PORTB, 0, 0x1F)              '9-bits resolution

Maar dat is het dus niet. Maar wat dan wel... :?

Fouten zijn het bewijs dat je het probeert..

Volgens mij heb ik het voor elkaar. De truuk was dan na het instellen van de configuratie byte een reset te geven en het device opnieuw aan te spreken. Dus in Arduino:

c code:

 

  ds.reset();
  ds.select(addr);

  ds.write(0x4E); 
  ds.write(0x00); // Write scratchpad byte 2
  ds.write(0x00); // Write scratchpad byte 3
  ds.write(0x1F); // Write scratchpad byte 4

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(100);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

geeft:

code:



11:29:43.526 -> ROM = 28 FF 3D E5 84 16 5 6D
11:29:43.526 ->   Chip = DS18B20
11:29:43.627 ->   Data =  20 1 0 0 1F FF 1F 10 8C  CRC=8C
11:29:43.665 ->   Temperature = 18.00 Celsius, 64.40 Fahrenheit
11:29:43.701 -> No more addresses.
11:29:43.738 -> 
11:29:43.946 -> ROM = 28 FF 3D E5 84 16 5 6D
11:29:43.946 ->   Chip = DS18B20
11:29:44.089 ->   Data =  20 1 0 0 1F FF 1F 10 8C  CRC=8C
11:29:44.126 ->   Temperature = 18.00 Celsius, 64.40 Fahrenheit
11:29:44.126 -> No more addresses.
11:29:44.198 -> 
11:29:44.377 -> ROM = 28 FF 3D E5 84 16 5 6D
11:29:44.377 ->   Chip = DS18B20
11:29:44.521 ->   Data =  20 1 0 0 1F FF 1F 10 8C  CRC=8C
11:29:44.556 ->   Temperature = 18.00 Celsius, 64.40 Fahrenheit
11:29:44.590 -> No more addresses.

Waar de configuratie inderdaad op 1F is gezet.

Bavelt

Golden Member

Heel grappig, terwijl jij aan het testen was, was ik dat ook en kwam tot dezelfde conclusie!

Bij mij is het nu:

pic basic code:


'====================================================================================================
Sub procedure Set_Resolution(Dim pRes As Byte)   'Set Resolution of DS18B20
'====================================================================================================
  Ow_Reset(PORTB, 0)                    'Onewire reset signal
  Ow_Write(PORTB, 0, 0xCC)              'Issue command SKIP_ROM
  Ow_Write(PORTB, 0, 0x4E)              'Write Scratchpad
  Ow_Write(PORTB, 0, 0x01)              'Write TH-Register
  Ow_Write(PORTB, 0, 0x02)              'Write TL-Register
  Ow_Write(PORTB, 0, pRes)              'Write Config Register
 End Sub
'====================================================================================================
 Sub procedure Read_TempD()              'Read Temperature from DB18B20
'====================================================================================================
  Ow_Reset(PORTB, 0)                    'Onewire reset signal
  Ow_Write(PORTB, 0, 0xCC)              'Issue command SKIP_ROM
  Ow_Write(PORTB, 0, 0x44)              'Issue command CONVERT_T
  Delay_ms(750)
  Ow_Reset(PORTB, 0)                    'Onewire reset signal
  Ow_Write(PORTB, 0, 0xCC)              'Issue command SKIP_ROM
  Ow_Write(PORTB, 0, 0xBE)              'Read ScratchPad

  Reg0 =  Ow_Read(PORTB, 0)
  Reg1 =  Ow_Read(PORTB, 0)
  Reg2 =  Ow_Read(PORTB, 0)
  Reg3 =  Ow_Read(PORTB, 0)
  Reg4 =  Ow_Read(PORTB, 0)
  Reg5 =  Ow_Read(PORTB, 0)
  Reg6 =  Ow_Read(PORTB, 0)
  Reg7 =  Ow_Read(PORTB, 0)
  Reg8 =  Ow_Read(PORTB, 0)
End Sub

En om de resolutie te zetten moet je dus:

pic basic code:


Set_Resolution(X)

Waarbij voor X geldt:

9-bits = 0x1F (31)
10-bits = 0x3F (63)
11-bits = 0x5F (95)
12-bits = 0x7F (127)

En daarna kun je lezen:

pic basic code:

Read_Temp()

De truc zat hem inderdaad om een reset te geven na het wijzigen van de registers!

In de leesroutine gebeurt dat bij aanvang.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De truc zat hem inderdaad om een reset te geven na het wijzigen van de registers!

Dat staat toch ook 'duidelijk' in de datasheet... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Je hebt gelijk. Maar wat is daar nu de lol van ;)