1 wire presence detect

This commit is contained in:
Sergey Yarkov 2023-05-10 22:31:29 +03:00
parent 9df148d8d0
commit a74e7008ff
No known key found for this signature in database
GPG Key ID: E91CE1FABC619B6F
3 changed files with 275 additions and 216 deletions

View File

@ -3,31 +3,32 @@
:020016003EC0EA :020016003EC0EA
:10001A0000C04F935F930F935FB7409167004530DD :10001A0000C04F935F930F935FB7409167004530DD
:10002A000CF403C0442740936700403041F493988E :10002A000CF403C0442740936700403041F493988E
:10003A0094989598929A00916600AAD06BD0413014 :10003A0094989598929A00916600B5D06BD0413009
:10004A0041F4929894989598939A00916500A0D05B :10004A0041F4929894989598939A00916500ABD050
:10005A0061D0423041F4929893989598949A00917D :10005A0061D0423041F4929893989598949A00917D
:10006A00640096D057D0433041F49298939894986C :10006A006400A1D057D0433041F492989398949861
:10007A00959A009163008CD04DD0439540936700C8 :10007A00959A0091630097D04DD0439540936700BD
:10008A005FBF0F915F914F9118950F930FB7B29B76 :10008A005FBF0F915F914F9118950F930FB7B29B76
:10009A0005C0B39B05C0B49B05C005C0019603C04B :10009A0005C0B39B05C0B49B05C005C0019603C04B
:1000AA000A9601C0CF960FBF0F9118950FED0DBF9D :1000AA000A9601C0CF960FBF0F9118950FED0DBF9D
:1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A :1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A
:1000CA000CE100BD02E000BF05E003BF09E106BF85 :1000CA000CE100BD02E000BF05E003BF09E106BF85
:1000DA0001E009BF11241092670080E090E026D069 :1000DA0001E009BF11241092670080E090E026D069
:1000EA0078943ED070FD969A70FF9698FACFEE24D7 :1000EA00789449D070FD969A70FF9698FACFEE24CC
:1000FA00FF1841E1001F111F4A9509F40895EE1CEB :1000FA00FF1841E1001F111F4A9509F40895EE1CEB
:10010A00FF1CE21AF30A20F4E20EF31E8894F2CFDF :10010A00FF1CE21AF30A20F4E20EF31E8894F2CFDF
:10011A000894F0CF0F930FB800E40EB90BE10DB9B4 :10011A000894F0CF0F930FB800E40EB90BE10DB9B4
:10012A00769BFDCFC09AC0980F91089503E80CBD45 :10012A00769BFDCFC09AC0980F910895F89400E08D
:10013A0001EC0ABD09EC08BD03E00EBDB99A08B787 :10013A000CBD0CE30ABD05E408BD03E00EBDB99A87
:10014A0006FFFCCFB99808B705FFFDCF03D00027FB :10014A0008B706FFFCCFB99808B705FFFDCF0DD059
:10015A000EBD0895B19B02C07E7F01C071600895F3 :10015A0000E00CBD04E30ABD08B706FFFDCF002787
:10016A005F9354E0A3E6B0E080936100909362004D :10016A000EBD0FEF08BF78940895B19B7160089592
:10017A0000916100109162002AE030E0B8DFED9250 :10017A00F894789408955F9354E0A3E6B0E08093EE
:10018A0000936100109362005A9591F75F91089568 :10018A0061009093620000916100109162002AE080
:10019A000F931F93E4EDF1E01127E00FF11F049094 :10019A0030E0ADDFED9200936100109362005A9552
:1001AA001F910F91089503EB0A95F1F708950F93A4 :1001AA0091F75F9108950F931F93EAEEF1E01127FB
:1001BA001F930FEF1FEF1A95000000000000D9F7F8 :1001BA00E00FF11F04901F910F91089503EB0A9528
:1001CA000A95C1F71F910F910895C0F9A4B09992A9 :1001CA00F1F708950F931F930FEF1FEF1A95000091
:0601DA0082F880909C00F9 :1001DA0000000000D9F70A95C1F71F910F91089501
:0C01EA00C0F9A4B0999282F880909C00AB
:00000001FF :00000001FF

View File

@ -1,20 +1,20 @@
AVRASM ver. 2.2.7 firmware.asm Sat Apr 29 03:25:47 2023 AVRASM ver. 2.2.7 firmware.asm Wed May 10 21:22:23 2023
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(257): Including file 'div16u.asm' firmware.asm(270): Including file 'div16u.asm'
div16u.asm(22): warning: Register r16 already defined by the .DEF directive div16u.asm(22): warning: Register r16 already defined by the .DEF directive
firmware.asm(257): 'div16u.asm' included form here firmware.asm(270): 'div16u.asm' included form here
div16u.asm(23): warning: Register r17 already defined by the .DEF directive div16u.asm(23): warning: Register r17 already defined by the .DEF directive
firmware.asm(257): 'div16u.asm' included form here firmware.asm(270): 'div16u.asm' included form here
div16u.asm(24): warning: Register r16 already defined by the .DEF directive div16u.asm(24): warning: Register r16 already defined by the .DEF directive
firmware.asm(257): 'div16u.asm' included form here firmware.asm(270): 'div16u.asm' included form here
div16u.asm(25): warning: Register r17 already defined by the .DEF directive div16u.asm(25): warning: Register r17 already defined by the .DEF directive
firmware.asm(257): 'div16u.asm' included form here firmware.asm(270): 'div16u.asm' included form here
firmware.asm(258): Including file 'usi.asm' firmware.asm(271): Including file 'usi.asm'
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(257): Including file 'div16u.asm' firmware.asm(270): Including file 'div16u.asm'
firmware.asm(258): Including file 'usi.asm' firmware.asm(271): Including file 'usi.asm'
; Project name: thermostat ; Project name: thermostat
@ -748,6 +748,19 @@ firmware.asm(258): Including file 'usi.asm'
.EQU ONE_WIRE_PIN = PINB .EQU ONE_WIRE_PIN = PINB
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия .EQU OWPRF = 0 ; 1-Wire Флаг присутствия
; **** КОМАНДЫ ДАТЧИКА *****************************************
.EQU DS18B20_CMD_CONVERTTEMP = 0x44
.EQU DS18B20_CMD_RSCRATCHPAD = 0xbe
.EQU DS18B20_CMD_WSCRATCHPAD = 0x4e
.EQU DS18B20_CMD_CPYSCRATCHPAD = 0x48
.EQU DS18B20_CMD_RECEEPROM = 0xb8
.EQU DS18B20_CMD_RPWRSUPPLY = 0xb4
.EQU DS18B20_CMD_SEARCHROM = 0xf0
.EQU DS18B20_CMD_READROM = 0x33
.EQU DS18B20_CMD_MATCHROM = 0x55
.EQU DS18B20_CMD_SKIPROM = 0xcc
.EQU DS18B20_CMD_ALARMSEARCH = 0xec
.EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS на 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
@ -826,7 +839,7 @@ firmware.asm(258): Including file 'usi.asm'
00001e 9895 cbi PORTD, DIGIT_4_PIN 00001e 9895 cbi PORTD, DIGIT_4_PIN
00001f 9a92 sbi PORTD, DIGIT_1_PIN 00001f 9a92 sbi PORTD, DIGIT_1_PIN
000020 9100 0066 lds TEMP_REG_A, DIGITS+3 000020 9100 0066 lds TEMP_REG_A, DIGITS+3
000022 d0aa rcall DISPLAY_DECODER 000022 d0b5 rcall DISPLAY_DECODER
000023 d06b rcall USI_TRANSMIT 000023 d06b rcall USI_TRANSMIT
_indicate_2: _indicate_2:
@ -838,7 +851,7 @@ firmware.asm(258): Including file 'usi.asm'
000028 9895 cbi PORTD, DIGIT_4_PIN 000028 9895 cbi PORTD, DIGIT_4_PIN
000029 9a93 sbi PORTD, DIGIT_2_PIN 000029 9a93 sbi PORTD, DIGIT_2_PIN
00002a 9100 0065 lds TEMP_REG_A, DIGITS+2 00002a 9100 0065 lds TEMP_REG_A, DIGITS+2
00002c d0a0 rcall DISPLAY_DECODER 00002c d0ab rcall DISPLAY_DECODER
00002d d061 rcall USI_TRANSMIT 00002d d061 rcall USI_TRANSMIT
_indicate_3: _indicate_3:
@ -850,7 +863,7 @@ firmware.asm(258): Including file 'usi.asm'
000032 9895 cbi PORTD, DIGIT_4_PIN 000032 9895 cbi PORTD, DIGIT_4_PIN
000033 9a94 sbi PORTD, DIGIT_3_PIN 000033 9a94 sbi PORTD, DIGIT_3_PIN
000034 9100 0064 lds TEMP_REG_A, DIGITS+1 000034 9100 0064 lds TEMP_REG_A, DIGITS+1
000036 d096 rcall DISPLAY_DECODER 000036 d0a1 rcall DISPLAY_DECODER
000037 d057 rcall USI_TRANSMIT 000037 d057 rcall USI_TRANSMIT
_indicate_4: _indicate_4:
@ -862,7 +875,7 @@ firmware.asm(258): Including file 'usi.asm'
00003c 9894 cbi PORTD, DIGIT_3_PIN 00003c 9894 cbi PORTD, DIGIT_3_PIN
00003d 9a95 sbi PORTD, DIGIT_4_PIN 00003d 9a95 sbi PORTD, DIGIT_4_PIN
00003e 9100 0063 lds TEMP_REG_A, DIGITS 00003e 9100 0063 lds TEMP_REG_A, DIGITS
000040 d08c rcall DISPLAY_DECODER 000040 d097 rcall DISPLAY_DECODER
000041 d04d rcall USI_TRANSMIT 000041 d04d rcall USI_TRANSMIT
_indicate_exit: _indicate_exit:
@ -946,12 +959,12 @@ firmware.asm(258): Including file 'usi.asm'
000072 e080 000072 e080
000073 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор 000073 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор
000074 d026 rcall ONE_WIRE_RESET ; проверяем наличие датчика на шине путем выполнения процедуры сброса 000074 d026 rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
000075 9478 sei 000075 9478 sei
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP: LOOP:
000076 d03e rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM 000076 d049 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
; usart_t: ; usart_t:
; sbis UCSRA, UDRE ; sbis UCSRA, UDRE
@ -1065,140 +1078,157 @@ firmware.asm(258): Including file 'usi.asm'
000098 98c0 cbi PORTB, USI_LATCH_PIN 000098 98c0 cbi PORTB, USI_LATCH_PIN
000099 910f pop r16 000099 910f pop r16
00009a 9508 00009a 9508
; **** ПРОВЕРКА ДАТЧИКА НА ШИНЕ *************************************************** ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
ONE_WIRE_RESET: _1_WIRE_DETECT_PRESENCE:
00009b 94f8 cli ; Шаг 1. выключаем глобальные прерывания
; 62 тика ; 62 тика
00009b e803 00009c e000
00009c bd0c outi r16, TCNT1L, 131 00009d bd0c outi r16, TCNT1L, 0
00009d ec01 00009e e30c
00009e bd0a outi r16, OCR1AL, 193 00009f bd0a outi r16, OCR1AL, 60 ; 480 мкс
00009f ec09 0000a0 e405
0000a0 bd08 outi r16, OCR1BL, 201 0000a1 bd08 outi r16, OCR1BL, 69 ; 72 мкс
; запуск таймера в режиме Normal ; предделитель 64
0000a1 e003 0000a2 e003
0000a2 bd0e outi r16, TCCR1B, (1<<CS11) | (1<<CS10) 0000a3 bd0e outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
0000a3 9ab9 s1: _1_wire_pull ; Шаг 1. притягиваем шину, ждем минимум 480мкс, отпускаем шину. 0000a4 9ab9 S1: _1_wire_pull ; Шаг 2. притягиваем шину
0000a4 b708 in r16, TIFR 0000a5 b708 in r16, TIFR
0000a5 ff06 sbrs r16, OCF1A 0000a6 ff06 sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
0000a6 cffc rjmp s1 0000a7 cffc rjmp S1
0000a7 98b9 _1_wire_release 0000a8 98b9 _1_wire_release ; Шаг 4. отпускаем шину
0000a8 b708 s2: in r16, TIFR ; Шаг 2. Ждем где то 60-70мкс и проверяем есть ли устройство на шине, и если есть то устанавливаем флаг. 0000a9 b708 S2: in r16, TIFR
0000a9 ff05 sbrs r16, OCF1B 0000aa ff05 sbrs r16, OCF1B ; Шаг 5. ждем +- 70мкс
0000aa cffd rjmp s2 0000ab cffd rjmp S2
0000ab d003 rcall OCF1B_occured 0000ac d00d rcall _1_WIRE_CHECK_PRESENCE ; Шаг 6. проверяем есть ли устройство на шине, и если есть то устанавливаем флаг
0000ac 2700 s3: clr r16 ; Шаг 3. Останавливаем таймер.
0000ad bd0e out TCCR1B, r16 0000ad e000
0000ae bd0c outi r16, TCNT1L, 0
0000af e304
0000b0 bd0a outi r16, OCR1AL, 52 ; 416 мкс
S3:
0000b1 b708 in r16, TIFR
0000b2 ff06 sbrs r16, OCF1A
0000b3 cffd rjmp S3
0000b4 2700 clr r16
0000b5 bd0e out TCCR1B, r16
0000b6 ef0f ser r16
0000b7 bf08 out TIFR, r16
; s3: in r16, TIFR ; s3: in r16, TIFR
; sbrs r16, TOV1 ; sbrs r16, TOV1
; rjmp s3 ; rjmp s3
; rcall TOV1_occured ; rcall TOV1_occured
; ser r16 ; ser r16
; out TIFR, r16 ; out TIFR, r16
0000ae 9508 ret 0000b8 9478 sei
0000b9 9508 ret
OCF1B_occured: ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА *******************************
0000af 9bb1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
0000b0 c002 rjmp _got_presence ;
_no_presence: _1_WIRE_CHECK_PRESENCE:
0000b1 7f7e cbr ONE_WIRE_FLAGS, (1<<OWPRF) 0000ba 9bb1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE
0000b2 c001 rjmp _ex 0000bb 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
_got_presence: 0000bc 9508 ret
0000b3 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
_ex: _1_WIRE_SEND_BIT:
0000b4 9508 ret 0000bd 94f8 cli
0000be 9478 sei
0000bf 9508 ret
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз ; путем деления этого числа несколько раз
DISPLAY_UPD_DIGITS: DISPLAY_UPD_DIGITS:
0000b5 935f push r21 0000c0 935f push r21
0000b6 e054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный 0000c1 e054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
0000b7 e6a3 ldi XL, LOW(DIGITS) 0000c2 e6a3 ldi XL, LOW(DIGITS)
0000b8 e0b0 ldi XH, HIGH(DIGITS) 0000c3 e0b0 ldi XH, HIGH(DIGITS)
.equ dividend = SRAM_TEMP_1 .equ dividend = SRAM_TEMP_1
.equ divisor = 10 .equ divisor = 10
; загружаем число которое хотим поделить в адрес SRAM делимого ; загружаем число которое хотим поделить в адрес SRAM делимого
0000b9 9380 0061 sts dividend, DISP_NUM_L 0000c4 9380 0061 sts dividend, DISP_NUM_L
0000bb 9390 0062 sts dividend+1, DISP_NUM_H 0000c6 9390 0062 sts dividend+1, DISP_NUM_H
; четыре раза производим деление для получения остатков ; четыре раза производим деление для получения остатков
DIV_LOOP: DIV_LOOP:
; заполняем нужные регистры ; заполняем нужные регистры
0000bd 9100 0061 lds dd16uL, dividend 0000c8 9100 0061 lds dd16uL, dividend
0000bf 9110 0062 lds dd16uH, dividend+1 0000ca 9110 0062 lds dd16uH, dividend+1
0000c1 e02a ldi dv16uL, LOW(divisor) 0000cc e02a ldi dv16uL, LOW(divisor)
0000c2 e030 ldi dv16uH, HIGH(divisor) 0000cd e030 ldi dv16uH, HIGH(divisor)
0000c3 dfb8 rcall div16u ; делим 0000ce dfad rcall div16u ; делим
0000c4 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю 0000cf 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю
; обновляем делимое ; обновляем делимое
0000c5 9300 0061 sts dividend, dres16uL 0000d0 9300 0061 sts dividend, dres16uL
0000c7 9310 0062 sts dividend+1, dres16uH 0000d2 9310 0062 sts dividend+1, dres16uH
0000c9 955a dec r21 ; декрементируем счетчик цикла 0000d4 955a dec r21 ; декрементируем счетчик цикла
0000ca f791 brne DIV_LOOP ; делим еще раз если не 0 0000d5 f791 brne DIV_LOOP ; делим еще раз если не 0
0000cb 915f pop r21 0000d6 915f pop r21
0000cc 9508 ret 0000d7 9508 ret
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER: DISPLAY_DECODER:
0000cd 930f push r16 0000d8 930f push r16
0000ce 931f push r17 0000d9 931f push r17
0000cf ede4 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 0000da eeea ldi ZL, LOW(2*DISPLAY_SYMBOLS)
0000d0 e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 0000db e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
0000d1 2711 clr TEMP_REG_B 0000dc 2711 clr TEMP_REG_B
0000d2 0fe0 add ZL, TEMP_REG_A 0000dd 0fe0 add ZL, TEMP_REG_A
0000d3 1ff1 adc ZH, TEMP_REG_B 0000de 1ff1 adc ZH, TEMP_REG_B
0000d4 9004 lpm r0, Z 0000df 9004 lpm r0, Z
0000d5 911f pop r17 0000e0 911f pop r17
0000d6 910f pop r16 0000e1 910f pop r16
0000d7 9508 ret 0000e2 9508 ret
DELAY_68us: DELAY_68us:
0000d8 eb03 ldi r16, 179 ; 1 0000e3 eb03 ldi r16, 179 ; 1
_d1_loop: _d1_loop:
0000d9 950a dec r16 ; 1 0000e4 950a dec r16 ; 1
0000da f7f1 brne _d1_loop ; 2/1 0000e5 f7f1 brne _d1_loop ; 2/1
0000db 9508 ret ; 4 0000e6 9508 ret ; 4
DELAY: DELAY:
0000dc 930f push r16 0000e7 930f push r16
0000dd 931f push r17 0000e8 931f push r17
0000de ef0f ldi r16, 255 0000e9 ef0f ldi r16, 255
_DELAY_1: _DELAY_1:
0000df ef1f ldi r17, 255 0000ea ef1f ldi r17, 255
_DELAY_2: _DELAY_2:
0000e0 951a dec r17 0000eb 951a dec r17
0000e1 0000 nop 0000ec 0000 nop
0000e2 0000 nop 0000ed 0000 nop
0000e3 0000 nop 0000ee 0000 nop
0000e4 f7d9 brne _DELAY_2 0000ef f7d9 brne _DELAY_2
0000e5 950a dec r16 0000f0 950a dec r16
0000e6 f7c1 brne _DELAY_1 0000f1 f7c1 brne _DELAY_1
0000e7 911f pop r17 0000f2 911f pop r17
0000e8 910f pop r16 0000f3 910f pop r16
0000e9 9508 ret 0000f4 9508 ret
DISPLAY_SYMBOLS: DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA ; HGFEDCBA HGFEDCBA
0000ea f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0000f5 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
0000eb b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0000f6 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
0000ec 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0000f7 9299 .DB 0b10011001, 0b10010010 ; 4, 5
0000ed f882 .DB 0b10000010, 0b11111000 ; 6, 7 0000f8 f882 .DB 0b10000010, 0b11111000 ; 6, 7
0000ee 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0000f9 9080 .DB 0b10000000, 0b10010000 ; 8, 9
firmware.asm(388): warning: .cseg .db misalignment - padding zero byte firmware.asm(416): warning: .cseg .db misalignment - padding zero byte
0000ef 009c .DB 0b10011100 ; ° 0000fa 009c .DB 0b10011100 ; °
; **** СЕГМЕНТ EEPROM ******************************************** ; **** СЕГМЕНТ EEPROM ********************************************
; .ESEG ; .ESEG
@ -1221,8 +1251,8 @@ counted separately from r26..r31 here.
"ATtiny2313A" register use summary: "ATtiny2313A" register use summary:
x : 1 y : 0 z : 1 r0 : 2 r1 : 2 r2 : 0 r3 : 0 r4 : 0 x : 1 y : 0 z : 1 r0 : 2 r1 : 2 r2 : 0 r3 : 0 r4 : 0
r5 : 0 r6 : 0 r7 : 0 r8 : 0 r9 : 0 r10: 0 r11: 0 r12: 0 r5 : 0 r6 : 0 r7 : 0 r8 : 0 r9 : 0 r10: 0 r11: 0 r12: 0
r13: 0 r14: 5 r15: 5 r16: 62 r17: 11 r18: 3 r19: 3 r20: 14 r13: 0 r14: 5 r15: 5 r16: 70 r17: 11 r18: 3 r19: 3 r20: 14
r21: 8 r22: 0 r23: 4 r24: 5 r25: 2 r26: 1 r27: 1 r28: 0 r21: 8 r22: 0 r23: 3 r24: 5 r25: 2 r26: 1 r27: 1 r28: 0
r29: 0 r30: 2 r31: 2 r29: 0 r30: 2 r31: 2
Registers used: 19 out of 35 (54.3%) Registers used: 19 out of 35 (54.3%)
@ -1232,25 +1262,25 @@ andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
brcc : 1 brcs : 0 break : 0 breq : 0 brge : 1 brhc : 0 brcc : 1 brcs : 0 break : 0 breq : 0 brge : 1 brhc : 0
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
brne : 9 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 brne : 9 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 15 cbr : 1 clc : 1 brvs : 0 bset : 0 bst : 0 cbi : 15 cbr : 0 clc : 1
clh : 0 cli : 0 cln : 0 clr : 5 cls : 0 clt : 0 clh : 0 cli : 2 cln : 0 clr : 5 cls : 0 clt : 0
clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 5 clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 5
cpse : 0 dec : 5 eor : 0 icall : 0 ijmp : 0 in : 4 cpse : 0 dec : 5 eor : 0 icall : 0 ijmp : 0 in : 5
inc : 1 ld : 0 ldd : 0 ldi : 29 lds : 7 lpm : 2 inc : 1 ld : 0 ldd : 0 ldi : 31 lds : 7 lpm : 2
lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3 lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3
or : 0 ori : 0 out : 20 pop : 10 push : 10 rcall : 12 or : 0 ori : 0 out : 23 pop : 10 push : 10 rcall : 12
ret : 8 reti : 2 rjmp : 18 rol : 4 ror : 0 sbc : 1 ret : 9 reti : 2 rjmp : 17 rol : 4 ror : 0 sbc : 1
sbci : 0 sbi : 7 sbic : 0 sbis : 5 sbiw : 0 sbr : 1 sbci : 0 sbi : 7 sbic : 0 sbis : 5 sbiw : 0 sbr : 1
sbrc : 1 sbrs : 3 sec : 1 seh : 0 sei : 1 sen : 0 sbrc : 1 sbrs : 4 sec : 1 seh : 0 sei : 3 sen : 0
ser : 0 ses : 0 set : 0 sev : 0 sez : 0 sleep : 0 ser : 1 ses : 0 set : 0 sev : 0 sez : 0 sleep : 0
spm : 0 st : 1 std : 0 sts : 7 sub : 2 subi : 0 spm : 0 st : 1 std : 0 sts : 7 sub : 2 subi : 0
swap : 0 tst : 0 wdr : 0 swap : 0 tst : 0 wdr : 0
Instructions used: 37 out of 105 (35.2%) Instructions used: 38 out of 105 (36.2%)
"ATtiny2313A" memory use summary [bytes]: "ATtiny2313A" memory use summary [bytes]:
Segment Begin End Code Data Used Size Use% Segment Begin End Code Data Used Size Use%
--------------------------------------------------------------- ---------------------------------------------------------------
[.cseg] 0x000000 0x0001e0 446 12 458 2048 22.4% [.cseg] 0x000000 0x0001f6 468 12 480 2048 23.4%
[.dseg] 0x000060 0x000068 0 8 8 128 6.3% [.dseg] 0x000060 0x000068 0 8 8 128 6.3%
[.eseg] 0x000000 0x000000 0 0 0 128 0.0% [.eseg] 0x000000 0x000000 0 0 0 128 0.0%

View File

@ -32,6 +32,19 @@
.EQU ONE_WIRE_PIN = PINB .EQU ONE_WIRE_PIN = PINB
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия .EQU OWPRF = 0 ; 1-Wire Флаг присутствия
; **** КОМАНДЫ ДАТЧИКА *****************************************
.EQU DS18B20_CMD_CONVERTTEMP = 0x44
.EQU DS18B20_CMD_RSCRATCHPAD = 0xbe
.EQU DS18B20_CMD_WSCRATCHPAD = 0x4e
.EQU DS18B20_CMD_CPYSCRATCHPAD = 0x48
.EQU DS18B20_CMD_RECEEPROM = 0xb8
.EQU DS18B20_CMD_RPWRSUPPLY = 0xb4
.EQU DS18B20_CMD_SEARCHROM = 0xf0
.EQU DS18B20_CMD_READROM = 0x33
.EQU DS18B20_CMD_MATCHROM = 0x55
.EQU DS18B20_CMD_SKIPROM = 0xcc
.EQU DS18B20_CMD_ALARMSEARCH = 0xec
.EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS на 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
@ -220,7 +233,7 @@ MCU_INIT:
sts CURRENT_DIGIT, r1 sts CURRENT_DIGIT, r1
display_load 0 ; загружаем число, которое нужно показать на индикатор display_load 0 ; загружаем число, которое нужно показать на индикатор
rcall ONE_WIRE_RESET ; проверяем наличие датчика на шине путем выполнения процедуры сброса rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
sei sei
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
@ -257,44 +270,59 @@ LOOP:
.INCLUDE "div16u.asm" .INCLUDE "div16u.asm"
.INCLUDE "usi.asm" .INCLUDE "usi.asm"
; **** ПРОВЕРКА ДАТЧИКА НА ШИНЕ *************************************************** ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
ONE_WIRE_RESET: _1_WIRE_DETECT_PRESENCE:
; 62 тика cli ; Шаг 1. выключаем глобальные прерывания
outi r16, TCNT1L, 131
outi r16, OCR1AL, 193
outi r16, OCR1BL, 201
; запуск таймера в режиме Normal ; 62 тика
outi r16, TCNT1L, 0
outi r16, OCR1AL, 60 ; 480 мкс
outi r16, OCR1BL, 69 ; 72 мкс
; предделитель 64
outi r16, TCCR1B, (1<<CS11) | (1<<CS10) outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
s1: _1_wire_pull ; Шаг 1. притягиваем шину, ждем минимум 480мкс, отпускаем шину. S1: _1_wire_pull ; Шаг 2. притягиваем шину
in r16, TIFR
sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
rjmp S1
_1_wire_release ; Шаг 4. отпускаем шину
S2: in r16, TIFR
sbrs r16, OCF1B ; Шаг 5. ждем +- 70мкс
rjmp S2
rcall _1_WIRE_CHECK_PRESENCE ; Шаг 6. проверяем есть ли устройство на шине, и если есть то устанавливаем флаг
outi r16, TCNT1L, 0
outi r16, OCR1AL, 52 ; 416 мкс
S3:
in r16, TIFR in r16, TIFR
sbrs r16, OCF1A sbrs r16, OCF1A
rjmp s1 rjmp S3
_1_wire_release clr r16
s2: in r16, TIFR ; Шаг 2. Ждем где то 60-70мкс и проверяем есть ли устройство на шине, и если есть то устанавливаем флаг.
sbrs r16, OCF1B
rjmp s2
rcall OCF1B_occured
s3: clr r16 ; Шаг 3. Останавливаем таймер.
out TCCR1B, r16 out TCCR1B, r16
ser r16
out TIFR, r16
; s3: in r16, TIFR ; s3: in r16, TIFR
; sbrs r16, TOV1 ; sbrs r16, TOV1
; rjmp s3 ; rjmp s3
; rcall TOV1_occured ; rcall TOV1_occured
; ser r16 ; ser r16
; out TIFR, r16 ; out TIFR, r16
sei
ret ret
OCF1B_occured: ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА *******************************
; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
;
_1_WIRE_CHECK_PRESENCE:
sbis ONE_WIRE_PIN, ONE_WIRE_LINE sbis ONE_WIRE_PIN, ONE_WIRE_LINE
rjmp _got_presence
_no_presence:
cbr ONE_WIRE_FLAGS, (1<<OWPRF)
rjmp _ex
_got_presence:
sbr ONE_WIRE_FLAGS, (1<<OWPRF) sbr ONE_WIRE_FLAGS, (1<<OWPRF)
_ex: ret
_1_WIRE_SEND_BIT:
cli
sei
ret ret
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************