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 #P15 |< == ow_pin $CC == ow_rom_skip $44 == ow_temp_convert $BE == ow_scratchpad_read $33 == ow_rom_read $55 == ow_rom_match $F0 == ow_rom_search 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 LONG tick $2D tick ! \ 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 IF 0 \ return false ELSE -1 \ return true THEN #487 us \ ~500 us ; pub OW_WRITE_X ( 0|1 -- ) ow_pin OUTPUTS 0 us \ ~3.8 us IF ow_pin INPUTS THEN #49 us \ ~60.4 us ow_pin INPUTS 0 us \ ~3.8 us ; pub OW_READ_X ( -- 0|FF ) ow_pin OUTPUTS \ ow_pin low 0 us \ ~3.8 us ow_pin INPUTS \ ow_pin high \ 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 9*8 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 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 CRC8 ( -- ) \ CR 0 ow_crc C! 8 0 DO ow_addr @ I + C@ CRC8a LOOP ; \ 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 ow_bit C@ ow_locked C@ > IF \ ow_bit > ow_locked \ read 2 ow_bits 2 OW_SHIFT_IN ow_scratch C@ 3 AND OW_SEARCHa ELSE \ ow_bit <= ow_locked \ read 2 ow_bits 2 OW_SHIFT_IN 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 LOOP CR \ check ow_crc CRC8 \ 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 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 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 \ BEGIN *** *** *** main *** *** *** BEGIN pub 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 ! 0 DO \ get temp from sensor id # ow_addr @ I 8 * + GPAD \ 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 VIS CR LOOP tick @ $51 XOR tick ! KEY UNTIL ; \ END *** *** *** main *** *** *** END ]~ \ udskrift enablet END