TACHYON \ starter linienumre \ [~ \ udskrift disablet \ BLACK:GND RED:3.3V White:Data <--> \ $3100.0005.454D.9A28 \ BLACK:GND RED:3.3V Yellow:Data <--> \ $E200.0004.A851.5828 \ $5C00.0004.A790.7428 { pub OW_RESET ( -- t/f ) pub OW_WRITE_X ( 0|1 -- ) pub OW_READ_X ( -- 0|FF ) pub OW_SHIFT_OUT ( data count -- ) pub OW_SHIFT_IN ( bits -- ) \ from 1 to 72 bits pub OW_CRC8a ( byte -- ) pub OW_CRC8 ( addr bytes -- ) \ check number of bytes pub OW_BIT_Xa ( ow_bit 0|1|2 -- |t/f ) \ ow_bit 0..63 pub OW_SEARCHa ( val --) pub OW_SEARCH ( -- ) pub OW_GPAD ( addr -- ) pub OW_VIS ( addr -- ) pub OW_CONVERT ( -- ) pub OW_OWX ( -- ) CR } #P15 |< == ow_pin $CC == ow_rom_skip $44 == ow_temp_convert $BE == ow_scratchpad_read $33 == ow_rom_read \ --- not in use yet $55 == ow_rom_match $F0 == ow_rom_search LONG tick $2D tick ! LONG ow_addr LONG ow_sddr BYTE ow_temp BYTE ow_found BYTE ow_bit BYTE ow_disc BYTE ow_mark BYTE ow_locked BYTE ow_crc BYTE ow_cnt 9 BYTES ow_scratch 3 ow_cnt C! \ no of sensors <--- <--- <--- no of sensors ow_cnt C@ 8 * BYTES ow_rom ow_cnt C@ 2 * BYTES ow_sensor \ BEGIN *** *** *** timing words *** *** *** BEGIN pub OW_RESET ( -- t/f ) ow_pin OUTPUTS \ ow_pin low #487 us \ ~500 us ow_pin INPUTS \ ow_pin high #66 us \ ~77 us ow_pin IN NOT #487 us \ ~500 us ; pub OW_WRITE_X ( 0|1 -- ) ow_pin OUTPUTS NOP NOP NOP \ ~1.2 us IF ow_pin INPUTS THEN #49 us \ ~60.4 us ow_pin INPUTS NOP NOP NOP \ ~1.2 us ; pub OW_READ_X ( -- 0|FF ) ow_pin OUTPUTS \ ow_pin low NOP NOP NOP \ ~1.2 us ow_pin INPUTS \ ow_pin high NOP NOP NOP \ ~1.2 us \ 1 us \ ~10.6 us \timing wrong with 4 elements on datastack \ 0 us \ ~3.8 us -- ~4.2 us \ this works with more or nothing on datastack ow_pin IN \ ow_pin read #39 us \ ~50.6 us ; \ END *** *** *** timing words *** *** *** END pub OW_SHIFT_OUT ( data count -- ) FOR DUP 1 AND OW_WRITE_X 2/ \ shift data 1 to the right NEXT DROP ; pub OW_SHIFT_IN ( bits -- ) \ from 1 to 72 bits 0 DO I 8 U/MOD \ ( -- r q ) DUP \ ( r q -- r q q ) ow_scratch + C@ \ ( r q q -- r q b ) ROT 1 SWAP ROL \ ( r q b -- q b i ) OW_READ_X \ ( q b i -- q b i t/f ) 1 AND \ ( q b i t/f -- q b i 0/1 ) 0= IF ANDN ELSE OR THEN SWAP \ ( q b -- b q) ow_scratch + C! \ ( -- ) LOOP ; \ BEGIN *** *** *** crc8 *** *** *** BEGIN pub OW_CRC8a ( byte -- ) #8 FOR DUP ow_crc C@ XOR 1 AND ow_crc C@ 2/ SWAP IF $8C XOR THEN ow_crc C! 2/ NEXT DROP ; pub OW_CRC8 ( addr bytes -- ) \ check number of bytes 0 ow_crc C! 0 DO DUP I + C@ OW_CRC8a LOOP DROP ; \ END *** *** *** crc8 *** *** *** END \ BEGIN *** *** *** 1-wire search routine *** *** *** BEGIN pub OW_BIT_Xa ( ow_bit 0|1|2 -- |t/f ) \ ow_bit 0..63 DUP 2 > IF ." too big must be 0|1|2" 2DROP ELSE ow_temp C! DUP #65 < \ ( ow_bit ow_bit #64 -- ow_bit t/f ) IF 1 - 8 U/MOD \ ( ow_bit 8 -- r q ) ow_addr @ + DUP C@ \ ( r q -- r rom1 xx ) ROT 1 SWAP ROL ( rom1 xx y -- ) ow_temp C@ SWITCH 0 CASE ANDN SWAP C! BREAK 1 CASE OR SWAP C! BREAK 2 CASE AND 0 > SWAP DROP BREAK ELSE ." too big" CR DROP THEN THEN ; pub OW_SEARCHa ( val --) SWITCH 0 CASE ow_bit C@ ow_disc C@ = IF \ setBitX -> 1 ow_bit C@ 1 OW_BIT_Xa ELSE ow_bit C@ ow_disc C@ > IF \ setBitX -> 0 ow_bit C@ 0 OW_BIT_Xa ow_bit C@ ow_mark C! ELSE ow_bit C@ 2 OW_BIT_Xa 0= IF ow_bit C@ ow_mark C! THEN THEN THEN BREAK 1 CASE \ setBitX -> 1 ow_bit C@ 1 OW_BIT_Xa BREAK 2 CASE \ setBitX -> 0 ow_bit C@ 0 OW_BIT_Xa BREAK 3 CASE ." no response" CR EXIT BREAK ." after SWITCH" . CR ; pub OW_SEARCH ( -- ) ." Search for 1-wire" CR ow_rom ow_addr ! 0 ow_found C! 0 ow_disc C! 0 ow_locked C! ow_cnt C@ FOR \ repeat 1-wire OW_RESET NOT IF ." Presence Detected -> no" CR EXIT THEN ow_rom_search 8 OW_SHIFT_OUT 0 ow_mark C! 1 ow_bit C! #64 FOR \ repeat bits \ read 2 ow_bits 2 OW_SHIFT_IN ow_bit C@ ow_locked C@ > IF \ ow_bit > ow_locked ow_scratch C@ 3 AND OW_SEARCHa THEN \ setBitX -> 0|1 ow_bit C@ 2 OW_BIT_Xa 1 OW_SHIFT_OUT ow_bit C@ 1 + ow_bit C! \ ow_bit +1 NEXT \ ow_bit \ show sensor id # 8 0 DO \ ow_addr @ 7 I - + C@ .BYTE ow_addr @ I + C@ .BYTE LOOP CR \ check ow_crc ow_addr @ 8 OW_CRC8 \ check 8 bytes at ow_addr \ crc = 0 ? ow_crc C@ DUP 0= IF ow_addr DUP @ 8 + SWAP ! \ next addr ow_found DUP C@ 1 + SWAP C! \ found +1 DROP ELSE ." Wrong CRC8 " . CR THEN \ search done ? ow_mark C@ DUP ow_disc C! 0= IF ." Found : " ow_found C@ . CR EXIT THEN NEXT \ addr ; \ END *** *** *** 1-wire search routine *** *** *** END \ BEGIN *** *** *** get scratchpad *** *** *** BEGIN pub OW_GPAD ( addr -- ) { OW_RESET DROP \ no presence test ow_rom_match 8 OW_SHIFT_OUT 8 0 DO DUP I + C@ 8 OW_SHIFT_OUT LOOP ow_temp_convert 8 OW_SHIFT_OUT BEGIN \ wait for 1 OW_READ_X UNTIL } OW_RESET DROP \ no presence test ow_rom_match 8 OW_SHIFT_OUT 8 0 DO DUP I + C@ 8 OW_SHIFT_OUT LOOP DROP ow_scratchpad_read 8 OW_SHIFT_OUT #72 OW_SHIFT_IN ; \ END *** *** *** get scratchpad *** *** *** END \ BEGIN *** *** *** show the result *** *** *** BEGIN pub OW_VIS ( addr -- ) CR DUP 1 + C@ 8 ROL SWAP C@ OR DUP . CR decimal DUP #4 SHR . ." ." DUP #15 AND #625 * DUP #625 = IF ." 0" THEN . CR DUP #4 SHR . ." ." #1 ROR #7 AND #125 * . CR hex ; \ END *** *** *** show the result *** *** *** END pub OW_CONVERT ( -- ) OW_RESET DROP \ no presence test ow_rom_skip 8 OW_SHIFT_OUT ow_temp_convert 8 OW_SHIFT_OUT BEGIN \ wait for 1 OW_READ_X UNTIL ; \ BEGIN *** *** *** main *** *** *** BEGIN pub OW_OWX ( -- ) CR OW_SEARCH \ search 1-wire BEGIN ow_found C@ DUP 0= IF ." no sensors found" CR DROP EXIT ELSE ow_rom ow_addr ! ow_sensor ow_sddr ! OW_CONVERT 0 DO \ get temp from sensor id # ow_addr @ I 8 * + OW_GPAD \ CRC8 check on scratchpad ow_scratch 9 OW_CRC8 ow_crc C@ IF ." wrong CRC8" EXIT THEN \ save temp in sensor # ow_scratch 1 + C@ ow_sddr @ 1 I 2 * + + C! ow_scratch 0 + C@ ow_sddr @ 0 I 2 * + + C! LOOP THEN ow_found C@ 0 DO ow_sddr @ I 2 * + 1 I + . tick @ EMIT OW_VIS CR LOOP tick @ $51 XOR tick ! KEY UNTIL ; \ END *** *** *** main *** *** *** END pub tt ( -- ) \ start program OW_OWX ; ]~ \ udskrift enablet END