Die Sensoren kannst du dank dem 1-Wire Bus alle an den gleichen Port anschliesen.
Dieser Assemblercode könnte ein Ansatz sein.
Code:
port .equ $02 ; Port C
portdir .equ $06 ; Datenrichtungsregister
ds18s .equ 7 ; bit 7
ds18smask .equ $80
bas_1 .equ $b7 ; erste Basic Variable => Fehlerrückgabe
bas_2 .equ $b8 ; zweite Basic Variable => Daten Rein&Raus
.ORG $101
reset sei ;mask any intr, as they inject heavy jitter
bclr ds18s,port ; port low
bset ds18s,portdir; Port als Ausgang
lda #$4b ; 4b 75 * 10 5sec => ~750 5sec
jsr delay ; in Warteschleife springen
bclr ds18s,portdir; Port high Z
lda #$08 ; 8 * 10 5sec => ~80 5sec
jsr delay ; warten auf PRESENCE-PULSE-DS1820
lda port
and #ds18smask ; nur bit1, alle anderen maskieren
bne error ; Fehler-Flag setzen
lda #$2d ; erneut 45 * ~10 5sec => ~450 5sec
jsr delay
byte_send lda #$08 ; 08 Bits
sta bas_1
bset ds18s,port
bset ds18s,portdir
byte_send_b bclr ds18s,port; Write 1 Slot ~5 5sec Port 1 Low
clc ; clear Carry bit
ror bas_2 ; in Carry schieben
bcc write0
bcs write1
write0 bclr ds18s,port
bra weiter
write1 bset ds18s,port
weiter lda #$07 ; 7 * ~10 => 70 5sec delay
jsr delay
bset ds18s,port
dec bas_1
bne byte_send_b
cli ;vor jedem rts ein cli nicht vergessen
rts
byte_read lda #$08 ; 08 Bits
sta bas_1
lda #$00
sta bas_2
byte_read_b bset ds18s,port; first set value, then drive, not vice versa
bset ds18s,portdir
bclr ds18s,port
bclr ds18s,portdir
nop ; 14 5sec abwarten
nop ; wenn ein hochkapazitives oder langes Kabel verwendet wird, haben die Dallas Probleme
nop ; von 0 auf highZ in 14us zu kommen. Event muessesn dann mehr nops eingebaut werden.
nop
nop
nop
nop
nop
brset ds18s,port,rot ; Bit in C lesen
rot ror bas_2
lda #$07 ; Gesamtzykluszeit abwarten (~60 5sec)
jsr delay
dec bas_1
bne byte_read_b
bset ds18s,port
bset ds18s,portdir
cli
rts
delay ldx #$02 ; ca. 10 5sec delay
inloop decx
bne inloop
deca
bne delay
rts
error lda #$ff ; Ein Fehler => 255 speichern
sta bas_1
cli
rts
.end
Quelle: http://www.b-kainka.de/ccbsp.htm
Lesezeichen