Advertisement
Ocelot

1-Wire address reader

Mar 1st, 2012
791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Тактовая частота 1200 kHz
  2.  
  3. .include "tn12def.inc"
  4. .def    Temp=R16
  5. .def    Temp1=R17
  6. .def    Data=R18
  7. .def    Duration=R19
  8. .def    Count=R20
  9. .def    Count1=R21
  10. .def    EEAdr=R22
  11.  
  12. .equ DATAPIN=2
  13. .equ PULLUPPIN=1
  14. .equ POWERPIN=0
  15. .equ RANDPIN=4
  16. .equ LED_B=3
  17.  
  18. .cseg
  19. .org $000       ; вектора прерываний
  20.     rjmp RESET
  21.     reti        ; int0
  22.     reti        ; pins
  23.     rjmp TIMER  ; timer0 ovfl
  24.     reti        ; eeprom
  25.     reti        ; anacomp
  26.    
  27. RESET:
  28.  
  29.     ldi Temp, (1<<ACD)
  30.     out AINBG, Temp     ; отключить аналоговый компаратор
  31.     ldi Temp, (1<<SE)
  32.     out MCUCR, Temp    
  33.    
  34.     ldi Temp, 0b00000010
  35.     out TIMSK, Temp     ; включить прерывание по таймеру T0
  36.     ldi Temp, (1<<PULLUPPIN)
  37.     out DDRB, Temp      ;
  38.     out PORTB, Temp
  39.  
  40.    
  41. START:
  42.     sei
  43.     rcall ONEWIRE_RESET
  44.     ldi Data, 0x33      ; read Rom
  45.     rcall ONEWIRE_SEND
  46.    
  47.     ldi Count1, 8
  48.     ldi EEAdr, 0x00
  49.     RD_LOOP:
  50.         rcall ONEWIRE_RECEIVE
  51.         cpi EEAdr, 0x00
  52.         brne NoCompare
  53.         cpi Data, 0x00
  54.         breq STOP
  55.         cpi Data, 0xFF
  56.         breq STOP
  57.     NoCompare:
  58.         rcall EEWR
  59.         inc EEAdr
  60.         dec Count1
  61.     brne RD_LOOP
  62.  
  63. STOP:
  64. ldi Duration, 0xFF
  65.     rcall DELAY_MS
  66.     rcall DELAY_MS
  67.     rcall DELAY_MS
  68.     rcall DELAY_MS
  69. rjmp START
  70.  
  71.    
  72. ONEWIRE_RESET:
  73.     sbi DDRB, DATAPIN
  74.     ldi Duration, 184   ; x3 600clk, 500uS
  75.     rcall DELAY_US
  76.     rcall DELAY_US
  77.     rcall DELAY_US
  78.     cbi DDRB, DATAPIN   ; release dataline
  79.     sbi PORTB, DATAPIN  ; pullup on
  80.     ldi Duration, 50    ; 66clk, 55uS
  81.     rcall DELAY_US
  82.     sbic PINB, DATAPIN
  83.     ldi Duration, 239   ; x2 510clk, 425uS
  84.     rcall DELAY_US
  85.     rcall DELAY_US
  86.     sbi PORTB, DATAPIN  ; pullup off
  87. ret
  88.  
  89. ONEWIRE_SEND:
  90.     ldi Count, 8
  91.     TX_LOOP:
  92.         lsr Data
  93.         brcs TX_ONE
  94.     TX_ZERO:
  95.         sbi DDRB, DATAPIN   ; pull down
  96.         ldi Duration, 56    ; 72clk, 60uS
  97.         rcall DELAY_US
  98.         cbi DDRB, DATAPIN   ; release
  99.         ldi Duration, 1     ; 16clk, 10uS
  100.         rcall DELAY_US
  101.         rjmp TX_ENDBIT
  102.     TX_ONE:
  103.         sbi DDRB, DATAPIN   ; pull down
  104.         nop                 ; 7clk, 6uS
  105.         nop
  106.         nop
  107.         nop
  108.         nop
  109.         nop
  110.         nop    
  111.         cbi DDRB, DATAPIN   ; release
  112.         ldi Duration, 60    ; 76clk, 64uS
  113.         rcall DELAY_US
  114.     TX_ENDBIT:
  115.         dec Count
  116.     brne TX_LOOP
  117. ret
  118.  
  119. ONEWIRE_RECEIVE:
  120.     ldi Data, 0
  121.     ldi Count, 8
  122.     RX_LOOP:
  123.         lsr Data
  124.         sbi DDRB, DATAPIN   ; pull down
  125.         nop                 ; 7clk, 6uS
  126.         nop
  127.         nop
  128.         nop
  129.         nop
  130.         nop
  131.         nop
  132.         cbi DDRB, DATAPIN   ; release
  133.         nop                 ; 10clk, 9uS
  134.         nop
  135.         nop
  136.         nop
  137.         nop
  138.         nop
  139.         nop
  140.         nop
  141.         nop
  142.         nop
  143.         sbic PINB, DATAPIN  ; 0 - skip
  144.         ori Data, 0b10000000
  145.        
  146.         ldi Duration, 50    ; 66 clk, 55uS
  147.         rcall DELAY_US
  148.         dec Count
  149.     brne RX_LOOP
  150. ret
  151.  
  152. EEWR:       ; запись в EEPROM
  153.     sbic EECR, 1
  154.     rjmp EEWR
  155.     cli
  156.     out EEAR, EEAdr
  157.     out EEDR, Data
  158.     sbi EECR, 2
  159.     sbi EECR, 1
  160.     sei
  161. ret
  162.  
  163. EEREAD:     ; чтение из EEPROM
  164.     sbic EECR, 1
  165.     rjmp EEREAD
  166.     out EEAR, EEAdr
  167.     sbi EECR, 0
  168.     in Data, EEDR
  169. ret
  170.  
  171. ; функции задержек
  172. DELAY_US:               ; %Duration%+16 clk
  173.     ldi Temp, 0xFF
  174.     sub Temp, Duration
  175.     out TCNT0, Temp
  176.     ldi Temp, 0b00000001; CK/1
  177.     out TCCR0, Temp     ; Start TIMER0
  178.     sleep
  179. ret
  180.  
  181. DELAY_MS:               ; %Duration%*1024+16 clk
  182.     ldi Temp, 0xFF
  183.     sub Temp, Duration
  184.     out TCNT0, Temp
  185.     ldi Temp, 0b00000101; CK/1024
  186.     out TCCR0, Temp     ; Start TIMER0
  187.     sleep
  188. ret
  189.  
  190. ; обработчик прерывания таймера T0
  191. TIMER:
  192.     ldi Temp, 0b00000000
  193.     out TCCR0, Temp     ; Stop TIMER0
  194. reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement