home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 May
/
CHIPCD5_98.iso
/
software
/
miernik
/
chip.s03
< prev
next >
Wrap
Text File
|
1998-03-24
|
7KB
|
362 lines
; Interfejs pomiΩdzy czujnikami Dallas DS1820
; a komputerem PC
; Mikrokontroler ATMEL 89C2051
; (c) Piotr Sliwinski '98
NAME DALLAS
speed EQU 0F4h ; 2400 bit/s
; Dla Atmela F4 (11.059 MHz) , dla Siemensa F3 (12 MHz)
P4 EQU 0E8H
PCON EQU 97h
SMOD EQU PCON.7
data_bit EQU P1.7 ; port do komunikacji z czujnikami
; ZMIENNE POMOCNICZE
ORG 40H
wyn DS 3
temp DS 2
t2 DS 2
nr DS 1
przec DS 1
pos DS 1
pos2 DS 1
crc DS 1 ; dla obliczania CRC
czuj_no DS 1 ; dla pobierania nr ser. z tabeli
status DS 1 ; status czujnika
; *********************************************
; PROGRAM GLOWNY
ORG 0H
JMP MAIN
ORG 0BH
JMP MAIN
ORG 1BH
JMP MAIN
ORG 100H
MAIN: CALL POWER_RISE
CLR EA
CLR A
MOV R0,A
MOV R1,A
MOV R2,A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,A
; inicjalizacja RS232
CALL INITMOD
macro %crto
call do_crc
call touchbyte
endmac
macro %crc_read_touchb
mov a,#0FFh
call touchbyte
call do_crc
endmac
;******************************
macro %crc_read_temp ;odczyt temperatury i sprawdz. CRC
%read_scratchpad
mov crc,#0 ; init crc byte
%crc_read_touchb
mov temp,A
%crc_read_touchb
mov temp+1,A
%crc_read_touchb ; skip user bytes & reserved
%crc_read_touchb
%crc_read_touchb
%crc_read_touchb
%crc_read_touchb
mov t2,A ; count remain
%crc_read_touchb
mov t2+1,A ; count per c
%crc_read_touchb
mov a,crc ; na wyjsciu crc=0 jesli OK
endmac
macro %init
call touchreset
mov a,#0CCh; skip ROM
call touchbyte
; mov crc,#0
; mov a,#10h
; %crto
endmac
macro %ocr
mov a,#06h
%crto
mov a,#0h;
%crto
mov a,#0h;
%crto
mov a,#0h;
%crto
mov a,crc
call touchbyte
endmac
macro %read_scratchpad
mov a,#0BEh
call touchbyte
endmac
look:
call touchreset ; sprawdz, czy sa czujniki
jnc niema
wpres:
sjmp dal2
clniema:
niema:
uu: call touchreset ; czeka na podlaczenie czujnika
jnc uu
dal2:
loopu:
call touchreset
jnc clniema ; je£li nie ma ┐adnego czujnika
call touchreset
mov a,#0CCh ; skip ROM - rozkaz wydawany do wszystkich czujnik≤w
call touchbyte
mov a,#044h ; rozkaz "convert temperature" - konwersja temperatury
call touchbyte
call wait200 ; czekanie na dokonanie konwersji
call wait200
; **************************
czuj4:
mov czuj_no,#0
cz_loop:
%init " inicjalizacja - reset + skip ROM
%crc_read_temp
jz noerr4
mov nr, czuj_no
mov status,#0 ; nie uda│o siΩ odczytaµ temp. z czujnika
call send
jmp cz_loop_end
noerr4: mov nr, czuj_no
mov status,#1 ; czujnik OK
call send
cz_loop_end:
jmp loopu
send: mov a, #0Dh ; sekwencja 0D 0A s│u┐y do synchronizacji (nag│≤wek)
call PUTCHAR
mov a, #0Ah
call PUTCHAR
mov a, #0 ; numer czujnika - zawsze r≤wny 0
call PUTCHAR
mov a, status ; status czujnika: 0 - nie uda│o siΩ odebraµ danych, 1 - OK
call PUTCHAR
mov a, temp
CALL PUTCHAR
mov a, temp+1
CALL PUTCHAR
mov a, t2
CALL PUTCHAR
mov a, t2+1
JMP PUTCHAR
tabela: DW 0A3F9h ; 0
DW 0CBF8h ; 1
DW 0D2F8h ; 2
DW 0BAFAh ; 3
odczyt1:
do_crc: push ACC
push ACC
mov B,#8
crc_lp: xrl a,crc
rrc a
mov a,crc
jnc zer_c
xrl a,#18h
zer_c: rrc a
mov crc,a
pop acc
rr a
push acc
djnz B,crc_lp
pop acc
pop acc
ret
INITMOD: ;
MOV SCON,#52h ;
;SETB 97h.1 ; czestotl. komunik. fxtal/16
MOV TMOD,#20h ; 2400 BIT/S
MOV TCON,#69h ; 8 BIT
;MOV TH1 ,#0f4h ; NONE PARITY
;MOV TH1,#98h ; 300 bod
MOV TH1,#speed ; 9600 bod
SETB TR1 ; 1 BIT STOP
SETB TI ;
RET ;
PUTCHAR:
; WYPISANIE ZNAKU NA ZLACZE
JNB TI,$
CLR TI
MOV SBUF,A
RET
;------------------------------------------------------------------------------;
GETCHAR:
JNB RI,GET_END ; ODCZYTANIE ZNAKU ZE ZLACZA
CLR RI
MOV A,SBUF
CLR C
RET
GET_END:
SETB C
RET
;****** read dallas and write in hex
acc_dal:mov a,#0FFh ; laduje wartosc z dallasa do akumulatora
jmp touchbyte
redal: mov a,#0FFh ; laduje i pisze na ekran
wrdal: call touchbyte
; *********************
sjmp do_crc
;****** procedury z Dallasa
; Procedura wysyla impuls Reset do czujnika i czeka na impuls obecnosci.
; Na wyjsciu bit Carry jest ustawiony jesli wykryto impuls obecnosci,
; w przeciwnym wypadku C=0. Kod napisany jest dla zegara 12 MHz.
touchreset:
push b
push acc
mov a, #4 ; zmienna petli zewn. dla opoznienia
clr data_bit ; ustaw linie danych na 0
mov b,#221 ; opoznienie - czekaj
djnz b,$
setb data_bit ; ustaw linie danych na 1
mov b,#6
clr c ; znacznik obecnosci = 0
waitlow:
jb data_bit,wh ; wyjdz z petli, jesli linia danych = 1
djnz b,waitlow ; czekaj przez 3360 us jesli linia = 0
djnz acc,waitlow
sjmp short ; linia nie ustawila sie na 1
wh:
mov b,#111 ; opoznienie dla wykrycia obecnosci
hl:
orl c,/data_bit ; wykryj impuls obecnosci
djnz b,hl
short:
pop acc
pop b
ret
; Procedura przesyla bajt w akumulatorze do czujnika i jednoczesnie przesyla
; bajt z czujnika do akumulatora.
; instrukcje NOP wstawione sa do generacji opoznien wlasciwych dla
; zegara 12 MHz.
touchbyte:
push b
mov b,#8
bit_loop:
rrc a ; wez bit z carry
call touchbit ; wyslij bit
djnz b,bit_loop ; wez nastepny bit
rrc a ; wez ostatni bit do ACC.
pop b
ret ; powrot
touchbit:
clr data_bit ; zacznij przedzial czasu
nop ; czekaj aby upewnic sie,
nop ; ze czujnik "widzi" 0 przez
;nop ; przynajmniej 1 us.
nop
mov data_bit,c ; wyslij bit danych
nop ; czekaj aby dane przyslane z czujnika
nop ; ustalily sie przed ich odczytaniem
nop
;nop
;nop
;nop
nop
nop
mov c,data_bit ; probkuj bit wejsciowy
mov r1,#20 ; opoznienie az do konca przedzialu czasowego
djnz r1,$
setb data_bit ; zakoncz przedzial czasowy
ret
wait200:
mov r4,#3 ; czekaj przez ok. 200 ms
lwaitu2:
mov r3,0
lwaitu:
mov r2,0
djnz r2,$
djnz r3,lwaitu
djnz r4,lwaitu2
ret
wait500:
mov r4,#46 ; wait for 0.5 s
waitu2:
mov r3,0
waitu:
mov r2,0
djnz r2,$
djnz r3,waitu
djnz r4,waitu2
ret
;----------------------------------------------------------------------------
; PROCEDURY UZYTKOWE
;----------------------------------------------------------------------------
POWER_RISE:
NEW: DJNZ R0,$
DJNZ R0,$
DJNZ R0,$
DJNZ R0,$
DJNZ R0,$
DJNZ R0,$
DJNZ R1,NEW
RET
END