rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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 SubNa 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...
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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 SubOok 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.
[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 SubEn 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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
