Op 24 januari 2023 10:24:22 schreef Bavelt
Maar veel mérkcomponenten komen voor een overgroot deel óók uit China.
Ik vraag me dan weleens af: heb je dan 'good and bad guys' daar? (waar niet :) ) Voor hobbywerk is het wel meestal wel redelijk te doen vind ik.

En ik bestel ook nooit één exemplaar, maar minimaal 5 tegelijk.

Vaak weten de handelaren ook niet dat het fake is. Met fake bedoel ik niet niet-werkend, maar een kopie. Het analoge deel van de Chinees werkt best goed, vooral in het middengebied van de temperatuur. In het digitale deel van het component hebben ze wat steekjes laten vallen bij het maken van de kopie.

Veel fabrieken staan in China gewoon normale dingen te doen. Maar dit is een kleiner bedrijf dat een gat in de markt zag. De reden was dat het originele component erg duur is. Dus dachten ze daar geld te verdienen.

Ze hebben het helemaal niet voor Europa gemaakt maar voor China waar alles helemaal niks mag kosten. Alleen zien handelaren dat als een mogelijkheid wat bij te verdienen, zo komt het ook hier. Je bent niet de eerste met dit probleem. Bijna alle sensoren uit China waar dit component inzit hebben de fake. Soms kost de hele sensor met component minder dan het originele component.

Good en bad betekent in China wat anders. Alles wat geld genereert is good. Ook alles wat geld bespaart is good. Zo kan je subcontractor daar gewoon ander materialen toepassen en dan trots tegen je zeggen "kijk eens hoe goedkoop we het hebben gemaakt". Dat is good.

De echt goede hebben kwaliteitscontrole en regelen hun zaken goed. Die zijn er ook genoeg. Maar die hebben geen louche handelaar op aliexpress nodig. Sommigen hebben daar, of op alibaba, wel hun eigen winkel, dan weet je wel waar het vandaan komt.

Ik vraag me dan weleens af: heb je dan 'good and bad guys' daar?

JA zeker in dan ook nog de very bad guys ;).
Nu is het niet zo dat die chinezengeweten loze criminelen zijn maar gewoon andere morele waarden hebben. Zoals hoeben ook zegt de meeste tussen handelaren weten zelf ook niet meer wat fake is niet. Of ze weten het wel maar het interesserend ze niets.

En dan zei er de bad guys zij die de nep onderdelen ook echt produceren. Zo kan er bv een fabrikant of tussen persoon met obsoleet spul zitten die ze in de handel dumpen. Dat word dan nog een tijd verkocht totdat opdroogt of er geen winstmarge meer te behalen valt. Dan kunnen ze zo onderdeel schoon laseren er iets anders op laseren.
Wat ook gebeurd is dat ze afgekeurde productie ergens vinden die niet vernietigd is. Dan zijn dan kale chips of die's die kunnen ze dan eenvoudig in een behuizing stoppen en daar een opdruk van een goed verkopen component opzetten.
Of ze kopen gewoon een partij oude printplaten op en strippen daar de componenten vanaf zetten er weer nieuwe pootjes aan en een nieuwe opdruk. Er kan en gebeurd van alles daar.

En ik bestel ook nooit één exemplaar, maar minimaal 5 tegelijk.

Hoeveel je er bestelt maakt meestal niet veel uit...

Ik ken een bedrijf die (om te proberen) 5 stuks ic's bestelde om te kijken of ze goed waren, en dat waren ze. Daarna 25 stuks bij zelfde tent, ook OK.
Toen maar meteen 250 stuks, en dat... was rommel.(deden niets).

Bij een onbekende bron blijft het altijd een risico, ook als je er al vaker besteld hebt...

Ondertussen ben ik verder gegaan met een poging om de resolutie op 9 bits te zetten. Dat scheelt enorm in de conversie tijd.

Volgens de data sheet moet je dan in het Configuration Register Bit 6 en 5 op 00 zetten.

Maar ik kan nergens gewaar worden wat nu het commando is om het configuration register te muteren.

Hoe zet ik die bitjes nu?

Hele avond gezocht maar nergens een voorbeeld gevonden voor een 9-bits resolutie.
Het is iets met een 'scratchpad' dat je moet schrijven.

Maar kan niet ontdekken hoe...

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.

Ik had al een beetje in deze sfeer gezocht.

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


'====================================================================================================
 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...

Er staat zelfs een example in de helpfile:


  '--- 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

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 (45%)]

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

[Bericht gewijzigd door Arco op (24%)]

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.


  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


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

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'...

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

Ik heb hier lopen grasduinen.

Wat ik tegenkwam is dit:


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.

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

[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 (91%)]

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.

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:

 
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.

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:


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... :?

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:

 

  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:



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.

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

Bij mij is het nu:


'====================================================================================================
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:


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:

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.

Dank voor het meedenken!

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

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

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