home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 May / CHIPCD5_98.iso / software / miernik / chip.s03 < prev    next >
Text File  |  1998-03-24  |  7KB  |  362 lines

  1. ;    Interfejs pomiΩdzy czujnikami Dallas DS1820
  2. ;    a komputerem PC
  3. ;     Mikrokontroler ATMEL 89C2051
  4.  
  5. ;    (c) Piotr Sliwinski '98
  6.  
  7.  
  8.  
  9.     NAME     DALLAS
  10.     speed        EQU    0F4h ; 2400 bit/s
  11. ; Dla Atmela F4 (11.059 MHz) , dla Siemensa F3 (12 MHz)
  12.  
  13.     P4        EQU    0E8H
  14.     PCON        EQU     97h
  15.     SMOD        EQU    PCON.7
  16.     data_bit    EQU    P1.7    ; port do komunikacji z czujnikami
  17.  
  18. ;        ZMIENNE POMOCNICZE
  19.  
  20.     ORG    40H
  21.  
  22.     wyn        DS    3
  23.     temp        DS    2
  24.     t2        DS    2
  25.     nr        DS    1
  26.     przec        DS    1
  27.     pos        DS    1
  28.     pos2        DS    1
  29.     crc        DS    1    ; dla obliczania CRC
  30.     czuj_no    DS    1    ; dla pobierania nr ser. z tabeli
  31.     status     DS    1    ; status czujnika  
  32.  
  33. ; *********************************************
  34. ;        PROGRAM  GLOWNY        
  35.     
  36.  
  37.     ORG    0H
  38.     JMP    MAIN
  39.  
  40.     ORG    0BH
  41.     JMP    MAIN
  42.     
  43.     ORG    1BH
  44.     JMP    MAIN
  45.  
  46.     ORG    100H
  47.  
  48. MAIN:    CALL    POWER_RISE
  49.  
  50.     CLR    EA
  51.     CLR    A
  52.     MOV    R0,A
  53.     MOV    R1,A
  54.     MOV    R2,A
  55.     MOV    R3,A
  56.     MOV    R4,A
  57.     MOV    R5,A
  58.     MOV    R6,A
  59.     MOV    R7,A
  60.  
  61. ; inicjalizacja RS232
  62.  
  63.     CALL    INITMOD
  64.  
  65.     macro %crto
  66.     call    do_crc
  67.     call    touchbyte
  68.     endmac
  69.  
  70.     macro %crc_read_touchb
  71.     mov    a,#0FFh
  72.     call    touchbyte
  73.     call    do_crc
  74.     endmac
  75.     
  76. ;******************************
  77.  
  78.     macro %crc_read_temp    ;odczyt temperatury i sprawdz. CRC
  79.     %read_scratchpad
  80.     mov    crc,#0        ; init crc byte
  81.     %crc_read_touchb
  82.     mov    temp,A
  83.     %crc_read_touchb    
  84.     mov    temp+1,A
  85.     %crc_read_touchb    ; skip user bytes & reserved
  86.     %crc_read_touchb
  87.     %crc_read_touchb
  88.     %crc_read_touchb
  89.     %crc_read_touchb
  90.     mov    t2,A    ; count remain
  91.     %crc_read_touchb
  92.     mov    t2+1,A  ; count per c
  93.     %crc_read_touchb
  94.     mov    a,crc        ; na wyjsciu crc=0 jesli OK
  95.     endmac
  96.  
  97.     macro %init
  98.     call    touchreset
  99.     mov    a,#0CCh;    skip ROM
  100.     call    touchbyte
  101. ;    mov    crc,#0
  102. ;    mov     a,#10h
  103. ;    %crto
  104.     endmac
  105.  
  106.     macro %ocr
  107.     mov    a,#06h
  108.     %crto
  109.     mov    a,#0h;
  110.     %crto
  111.     mov    a,#0h;
  112.     %crto
  113.     mov    a,#0h;
  114.     %crto
  115.     mov    a,crc
  116.     call    touchbyte
  117.     endmac
  118.  
  119.     macro %read_scratchpad
  120.     mov    a,#0BEh     
  121.     call    touchbyte
  122.     endmac
  123.  
  124.  
  125. look:
  126.     call    touchreset    ; sprawdz, czy sa czujniki
  127.     jnc    niema
  128. wpres:
  129.     sjmp    dal2
  130. clniema:
  131.     
  132. niema:    
  133. uu:    call    touchreset    ; czeka na podlaczenie czujnika
  134.     jnc    uu
  135.  
  136. dal2:    
  137.  
  138. loopu:
  139.     call    touchreset
  140.     jnc    clniema    ; je£li nie ma ┐adnego czujnika
  141.  
  142.     call    touchreset
  143.     mov    a,#0CCh    ; skip ROM - rozkaz wydawany do wszystkich czujnik≤w
  144.     call    touchbyte
  145.     mov    a,#044h    ; rozkaz "convert temperature" - konwersja temperatury
  146.     call    touchbyte
  147.     call    wait200    ; czekanie na dokonanie konwersji
  148.     call    wait200    
  149.  
  150.  
  151. ; **************************
  152. czuj4:    
  153.     mov     czuj_no,#0
  154. cz_loop:
  155.     %init               " inicjalizacja - reset + skip ROM
  156.  
  157.     %crc_read_temp
  158.     jz    noerr4
  159.     mov nr, czuj_no
  160.     mov status,#0     ; nie uda│o siΩ odczytaµ temp. z czujnika
  161.     call send
  162.     jmp cz_loop_end
  163. noerr4:    mov nr, czuj_no
  164.     mov status,#1    ; czujnik OK
  165.     call    send
  166. cz_loop_end:
  167.     jmp loopu
  168.  
  169. send:    mov     a, #0Dh   ; sekwencja 0D 0A s│u┐y do synchronizacji (nag│≤wek)
  170.     call    PUTCHAR
  171.     mov     a, #0Ah
  172.     call    PUTCHAR
  173.     mov     a, #0    ; numer czujnika - zawsze r≤wny 0
  174.     call    PUTCHAR
  175.     mov    a, status    ; status czujnika: 0 - nie uda│o siΩ odebraµ danych, 1 - OK
  176.     call    PUTCHAR
  177.     mov     a, temp
  178.     CALL    PUTCHAR
  179.     mov    a, temp+1
  180.     CALL    PUTCHAR
  181.     mov    a, t2
  182.     CALL    PUTCHAR
  183.     mov    a, t2+1
  184.     JMP    PUTCHAR
  185.  
  186. tabela:    DW 0A3F9h    ; 0
  187.         DW 0CBF8h    ; 1
  188.         DW 0D2F8h    ; 2
  189.         DW 0BAFAh    ; 3
  190.  
  191.  
  192. odczyt1:
  193.     
  194. do_crc:    push     ACC
  195.     push    ACC
  196.     mov    B,#8
  197. crc_lp:    xrl    a,crc
  198.     rrc    a
  199.     mov    a,crc
  200.     jnc    zer_c
  201.     xrl    a,#18h
  202. zer_c:    rrc     a
  203.     mov    crc,a
  204.     pop    acc
  205.     rr    a
  206.     push    acc
  207.     djnz    B,crc_lp
  208.     pop    acc
  209.     pop    acc
  210.     ret
  211.     
  212. INITMOD:        ;
  213.     MOV  SCON,#52h  ;
  214.     ;SETB 97h.1    ;  czestotl. komunik. fxtal/16
  215.     MOV  TMOD,#20h    ; 2400 BIT/S
  216.     MOV  TCON,#69h    ; 8 BIT
  217.  
  218.     ;MOV  TH1 ,#0f4h    ; NONE PARITY
  219.     ;MOV  TH1,#98h    ; 300 bod    
  220.     MOV  TH1,#speed   ; 9600 bod
  221.     SETB TR1    ; 1 BIT STOP
  222.     SETB TI     ;
  223.     RET        ;
  224.  
  225. PUTCHAR:
  226.     ; WYPISANIE ZNAKU NA ZLACZE 
  227.     JNB  TI,$
  228.     CLR  TI
  229.     MOV  SBUF,A
  230.     RET
  231. ;------------------------------------------------------------------------------;
  232. GETCHAR:
  233.     JNB  RI,GET_END        ; ODCZYTANIE ZNAKU ZE ZLACZA
  234.     CLR  RI
  235.     MOV  A,SBUF
  236.     CLR  C
  237.     RET
  238. GET_END:
  239.     SETB C
  240.     RET
  241.  
  242. ;******    read dallas and write in hex
  243. acc_dal:mov    a,#0FFh        ; laduje wartosc z dallasa do akumulatora
  244.     jmp    touchbyte
  245.  
  246. redal:    mov    a,#0FFh        ; laduje i pisze na ekran
  247. wrdal:    call    touchbyte
  248.  
  249. ;    *********************
  250.  
  251.     sjmp    do_crc
  252.  
  253. ;******    procedury z Dallasa
  254.  
  255. ; Procedura wysyla impuls Reset do czujnika i czeka na impuls obecnosci.
  256. ; Na wyjsciu bit Carry jest ustawiony jesli wykryto impuls obecnosci,
  257. ; w przeciwnym wypadku C=0. Kod napisany jest dla zegara 12 MHz.
  258.  
  259. touchreset:            
  260.                 
  261.     push    b
  262.     push    acc
  263.     mov    a, #4        ; zmienna petli zewn. dla opoznienia    
  264.     clr    data_bit    ; ustaw linie danych na 0
  265.     mov    b,#221        ; opoznienie - czekaj 
  266.     djnz    b,$
  267.     setb    data_bit    ; ustaw linie danych na 1
  268.     mov    b,#6
  269.     clr    c        ; znacznik obecnosci = 0
  270. waitlow:            
  271.     jb    data_bit,wh    ; wyjdz z petli, jesli linia danych = 1
  272.     djnz    b,waitlow    ; czekaj przez 3360 us jesli linia = 0 
  273.     djnz    acc,waitlow
  274.     sjmp    short        ; linia nie ustawila sie na 1
  275. wh:
  276.     mov    b,#111        ; opoznienie dla wykrycia obecnosci
  277. hl:
  278.     orl    c,/data_bit    ; wykryj impuls obecnosci
  279.     djnz    b,hl
  280. short:
  281.     pop    acc
  282.     pop    b
  283.     ret
  284.  
  285.  
  286. ; Procedura przesyla bajt w akumulatorze do czujnika i jednoczesnie przesyla
  287. ; bajt z czujnika do akumulatora.
  288. ; instrukcje NOP wstawione sa do generacji opoznien wlasciwych dla 
  289. ; zegara 12 MHz.
  290.  
  291. touchbyte:
  292.     push    b
  293.     mov    b,#8
  294. bit_loop:
  295.     rrc    a        ; wez bit z carry
  296.     call    touchbit    ; wyslij bit
  297.     djnz    b,bit_loop    ; wez nastepny bit
  298.     rrc    a        ; wez ostatni bit do ACC.
  299.     pop    b
  300.     ret            ; powrot
  301. touchbit:
  302.     clr    data_bit    ; zacznij przedzial czasu
  303.     nop            ; czekaj aby upewnic sie, 
  304.     nop            ; ze czujnik "widzi" 0 przez
  305.     ;nop            ; przynajmniej 1 us.
  306.     nop
  307.     mov    data_bit,c    ; wyslij bit danych
  308.     nop            ; czekaj aby dane przyslane z czujnika 
  309.     nop            ; ustalily sie przed ich odczytaniem
  310.     nop
  311.     ;nop
  312.       ;nop
  313.     ;nop
  314.     nop
  315.     nop
  316.     mov    c,data_bit    ; probkuj bit wejsciowy
  317.     mov    r1,#20        ; opoznienie az do konca przedzialu czasowego
  318.     djnz    r1,$
  319.  
  320.     setb    data_bit    ; zakoncz przedzial czasowy
  321.     ret
  322.  
  323. wait200:
  324.  
  325.     mov    r4,#3        ; czekaj przez ok. 200 ms
  326. lwaitu2:
  327.     mov    r3,0
  328. lwaitu:    
  329.     mov    r2,0
  330.     djnz    r2,$
  331.     djnz    r3,lwaitu
  332.     djnz    r4,lwaitu2
  333.     ret
  334.  
  335. wait500:
  336.     
  337.     mov    r4,#46        ; wait for 0.5 s
  338. waitu2:
  339.     mov    r3,0
  340. waitu:    
  341.     mov    r2,0
  342.     djnz    r2,$
  343.     djnz    r3,waitu
  344.     djnz    r4,waitu2
  345.     ret
  346.  
  347. ;----------------------------------------------------------------------------
  348. ;            PROCEDURY UZYTKOWE 
  349. ;----------------------------------------------------------------------------
  350.  
  351. POWER_RISE:
  352.     
  353. NEW:    DJNZ    R0,$
  354.     DJNZ    R0,$
  355.     DJNZ    R0,$
  356.     DJNZ    R0,$
  357.     DJNZ    R0,$
  358.     DJNZ    R0,$
  359.     DJNZ    R1,NEW
  360.     RET
  361.  
  362. END