Razreshenie_IVOkno:;============== Проверка переполнения (1F FF FE)
ldi r16,0xfe cp r4,r16
ldi r16,0xff cpc r5,r16
ldi r16,0x1f cpc r6,r16
brlo Net_perepolneniya ;-- Не переполнилось!! :)
sbr Flagi,0b00000011 ; *!!-Ошибка-!!*
rcall Margni_Svetik
ret ;---- Ошибка, вернуться и, на рестартую
Net_perepolneniya:;============== Проверка отклонени 1/4
lds R7,Perezapusk_L
lds R8,Perezapusk_H
lds R9,Perezapusk_HH ;Загрузил новое, сохранил старое
sts Perezapusk_L,R4
sts Perezapusk_H,R5
sts Perezapusk_HH,R6
cp r4,r7 cpc r5,r8 cpc r6,r9
brsh Novoe_bolshe1
;-------- Старое больше Поменять местами-----------
push r4 push r5 push r6
mov r4,r7 mov r5,r8 mov r6,r9 ;--- -
pop r9 pop r8 pop r7
;-------- Новое больше -----------
Novoe_bolshe1:
sub r4,r7 sbc r5,r8 sbc r6,r9 ;--- Получить разность -
lsr r9 ror r8 ror r7 ;-----
lsr r9 ror r8 ror r7 ;----- Разделил на 4 меньшее
cp r4,r7 cpc r5,r8 cpc r6,r9
brlo Zapih_V_Okno
sbr Flagi,0b00000011 ; *!!-Ошибка-!!*
rcall Margni_Svetik
ret ;---- Ошибка, вернуться и, на рестартую
Zapih_V_Okno:
lds R4,Perezapusk_L
lds R5,Perezapusk_H ; Восстановил что вычислениями покарябал
lds R6,Perezapusk_HH
;----------- Вычислить адрес окна
dec r25
brne XXX_ne_revers_okna
ldi r25,8
XXX_ne_revers_okna:
;-----------Загрузка предыдущего значения ;-----------Сохранить на его место свежеизмеренное
ldi ZL,low(OKNO_8_x_3) ldi ZH,high(OKNO_8_x_3)
mov r16,r25
lsl r16 ; потом умножил на 2, и прибавил 1 = 3 :)
add r16,r25
add ZL,r16 ;adc ZH,Nolik
;----------- Выгружаю - загружаю...
ld r9,Z st Z+,R6
ld r8,Z st Z+,R5
ld r7,Z st Z,R4
;----------- Отнять устарелое из суммы
sub R1,R7
sbc R2,R8
sbc R3,R9
;----------- Добавить к сумме новое
add R1,R4
adc R2,R5
adc R3,R6
ret ;---- Благополучно отработали :)
Margni_Svetik:;ОООООООООООО -Индикация ошибки- ООООООООООО
out tcnt0,Nolik
ldi r16,0b00000001
out TIFR,r16 ; Флаг злаебучка, сбрасывайте его понимаеш... :-/
in r16,TIMSK
sbr r16,0b00000001; Включит таймер чтоб выключить пропуск
out TIMSK,r16
sbi portB,3
ret ;ОООООООООООООООООООООООООООООООООООООООООООООООООООООООО
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -Обработка пропусков- ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
Obrabotka_Propuskov: ;0 - Глобальный флаг состояние пропуска!!
;1 - Первый замер *Заведомо ошибочный*, пропустить его!
;2 -Пришло первое - сомнительное
;3 -Пришло второе(на проверку)
rcall Margni_Svetik
sbrc Flagi,1
rjmp Oshibo4niy_zamer
sbrc Flagi,2
rjmp Perviy_neuverenn
sbrc Flagi,3
rjmp Vtoroy_proverim
;ООООООООООООООООООООООООООООООООООООООООООО
Oshibo4niy_zamer: ;------ Переполнилось окно?
cbr Flagi,0b00000010 sbr Flagi,0b00000100 ; - Запуск патранажа!!
ret ;=== Закончил
Perviy_neuverenn:
cbr Flagi,0b00000100 sbr Flagi,0b00001000 ; - Запомни для сверения!!
sts Perezapusk_L,R4
sts Perezapusk_H,R5
sts Perezapusk_HH,R6
ret ;=== Закончил
Vtoroy_proverim:
lds R7,Perezapusk_L
lds R8,Perezapusk_H
lds R9,Perezapusk_HH ;Загрузил новое, сохранил старое
sts Perezapusk_L,R4
sts Perezapusk_H,R5
sts Perezapusk_HH,R6
cp r4,r7 cpc r5,r8 cpc r6,r9
brsh Novoe_bolshe
;-------- Старое больше Поменять местами-----------
push r4 push r5 push r6
mov r4,r7 mov r5,r8 mov r6,r9 ;--- -
pop r9 pop r8 pop r7
;-------- Новое больше -----------
Novoe_bolshe:
sub r4,r7 sbc r5,r8 sbc r6,r9 ;--- Получить разность -
lsr r9 ror r8 ror r7 ;-----
lsr r9 ror r8 ror r7 ;----- Разделил на 4 меньшее
cp r4,r7 cpc r5,r8 cpc r6,r9
brlo Doble_Save_okk
ret ;=== Неудачко... Буду ловить снова (флаг не сбрасываю)
Doble_Save_okk:
cbr Flagi,0b00000001 ; Завершить обраб. ошибки
; lds R4,Perezapusk_L
; lds R5,Perezapusk_H ; Восстановил что вычислениями покарябал
; lds R6,Perezapusk_HH
rcall Zapih_V_Okno
rcall Zapih_V_Okno ;Три!!! (а четвертый на выходе сохранит)
rcall Zapih_V_Okno
ret ;== УРА!! Все заработало...
Oper_Zajig:
;VVVVVVVVVVVVVVVVVVVVVVV -Поиск оборотов из таблицы- VVVVVVVVVVVVVVVVVVVVVVVVVVVV
ldi r16,13
ldi ZL,Low(PMR_tab*2) ldi ZH,High(PMR_tab*2) adiw ZL,51 ;- **Там как-то хитро сохраняет, кратно х2.. посему 12х4
Sled_tab_1000:
;------- Сохранение копии (для последующего вычитаня "промежутка")
mov r20,r17 mov r21,r18 mov r22,r19
;------- Извлек следующее...
dec ZL
lpm mov r17,r0 dec ZL
lpm mov r18,r0 dec ZL ;
lpm mov r19,r0 dec ZL ;
;------- Сверил с текущей скоростью
cp r17,r1 cpc r18,r2 cpc r19,r3
brsh Nashol_1000 ;-Если табличное уже меньше, переходим к вычисл.
dec r16
rjmp Sled_tab_1000;-----------------цикл
Nashol_1000:
;------- Получил между 1000/2 (поделил и прибавил)
sub r17,r20 sbc r18,r21 sbc r19,r22
lsr r19 ror r18 ror r17
add r20,r17 adc r21,r18 adc r22,r19
;VVVVVVVVVVVVVVVVVVVVVVV -Подгрузка соотв. градусов- VVVVVVVVVVVVVVVVVVVVVVVVVVVV
ldi ZL,low(Work_Grad_Tab) ldi ZH,high(Work_Grad_Tab)
inc r16 lsl r16 add ZL,r16
ld r14,-Z ld r15,-Z
ld r12,-Z ld r13,-Z
;------- Получил между гр./2 (поделил и прибавил)
sub r12,r14 sbc r13,r15
lsr r13 ror r12
add r14,r12 adc r15,r13
;VVVVVVVVVVVVVVVVVVVVVVV -Иттерации- VVVVVVVVVVVVVVVVVVVVVVVVVVVV
ldi r16,8
Nev_IteRR:;
dec r16 breq End_IteRR
lsr r19 ror r18 ror r17
lsr r13 ror r12
cp r20,r1 cpc r21,r2 cpc r22,r3
brsh Umensh_IteRR
;Uveli4:
add r20,r17 adc r21,r18 adc r22,r19
add r14,r12 adc r15,r13
rjmp Nev_IteRR
Umensh_IteRR:
sub r20,r17 sbc r21,r18 sbc r22,r19
sub r14,r12 sbc r15,r13
rjmp Nev_IteRR
End_IteRR:;AAAAAAAAAAAA -Иттерации- AAAAAAAAAAAAAAAAAAAAAAAAA
ret
; ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
; ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -ПРОЧЕЕ- ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
; ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
; ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
Taymaut_termo:;---------------------------
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -Время старта сеансов общения(термометр, УСАРТ)- ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
;---------- Вычислить +45 градуса -------
mov r12,r1 mov r13,r2 mov r14,r3 clr r15 ; Копи для работы
lsl r12 rol r13 rol r14 rol r15
mov r9,r13 mov r10,r14 mov r11,r15 ;хитро так вывернулся, чтоб снова не двигать назад.
lsl r12 rol r13 rol r14 rol r15 ; Получил 13-14-15 45гр.
add r13,r9 adc r14,r10 adc r15,r11 ; Добавил то, хитровычесленное 22,5 гр.
;--------------- Установить ВКЛючатель замеров -----------
out OCR1bH,r14 out OCR1bL,r13 ;--- Там у нас переполнение запланировано... пака тут ничего
sts Termo_3_bayt,r15
;sbr Flagi,0b10000000
ret;--------------------------------------
;--- 65536-пауза
PAUZA_65536: ;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ - R16 X 777 - ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
clr r17
EXT_PAUZA: dec r17
brne EXT_PAUZA
dec r16
brne EXT_PAUZA
ret ;=========================================================================
ANA_COMP:;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ 1*-Поймал падающи фронт- ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
push r16 push r17 push r18 ;=============================
;------------------- Определить, вырастание или спадание фронта
in r16,ACSR
sbrs r16,0
rjmp Spad_Fronta ;******полярность?******
;===========
;VVVVVVVVVVVVVVVVV
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
in r7,ICR1L
in r8,ICR1H ; Истинное значение 444 -(222+222)
mov r9,r6
cbi portB,2 ;------------ Вкл. светик
;--------------- инвертировать прием анала, ....-----------------------------------------------------
Ldi r16,0b01011110 ; 1-0 - "10"(переход на меньшее) "11"(Переход на большее)
out ACSR,r16 ;
ldi r16,0b10000001
out tccr1B,r16 ;--- СК/0
pop r18 pop r17 pop r16;===================================
reti;--------------------------------
; VVVVVVVVVVVVVVVVVVVVVVVVV
; VVVVVV Spad_Fronta VVVVVV
; VVVVVVvvvvvvvvvvvvvVVVVVV
Spad_Fronta:
sbi portB,2 ; Вкл. светик
;--------------- инвертировать, ....-----------------------------------------------------
Ldi r16,0b01011111 ; 1-0 - "10"(переход на меньшее) "11"(Переход на большее)
out ACSR,r16 ;
ldi r16,0b11000001
out tccr1B,r16 ;--- СК/0
;------ Выгрузил замер ------------------------------------------------------------------
in r4,ICR1L
in r5,ICR1H ; Истинное значение 888 *** достанется как операнд второму фронту ***
; r6
sts Zapomni_r6,r6 ; т.к. далее оно покарябается, а оно еще пригодится!
;------- Вычислениее ГЛАВНОГО результата! -------------------------------------------
sub r4,r7 sbc r5,r8 sbc r6,r9 ; 888-444=444(456) -Полная ширина второго фронта
lsr r6 ror r5 ror r4 ;----- 444/2=222 -Половинка ширины второго фронта
push r4 push r5 push r6 ; (палавинка второго фронта 222)... !!! Мне это нужно для вычисления коректировки TCNT
add r4,r7 adc r5,r8 adc r6,r9 ;-- 222+444 =666 -(456)- ;8-D~.
; корректировка таймера
;=========================----------------------------------------------------------------
in r7,tcnt1L
in r8,tcnt1H ; 890
lds r9,Zapomni_r6 ;
; ****** И на забывай, возможно переполнение!! (но это уже как заработает...)
in r10,ICR1L
in r11,ICR1H ; 888 -(222+222)
lds r12,Zapomni_r6 ;
sub r7,r10 sbc r8,r11 sbc r9,r12 ; 890-888= 2 (789) Погрешность от захвата.
ldi r16,27 ;(по идее 26!(но 27 работает совпадение лучше) 8-/) Поднонка моделингоь
add r7,r16 adc r8,Nolik adc r9,Nolik ;-- (789)+16
pop r12 pop r11 pop r10
add r7,r10 adc r8,r11 adc r9,r12 ;-- ((789(2))+16) + 222
out tcnt1H,r8 ; 8
out tcnt1L,r7
sts Zapomni_r6,r9
; орректировка таймера
;=========================-----------------------------------------------------------------
;ООООООООООООООООООООО *-обработка ошибки- ООООООООООООООООООООООООООООООООО
sbrc Flagi,0
rcall Obrabotka_Propuskov ; "предыдущее знаяение" будет в ячейке после выхода...
sbrc Flagi,0
rjmp END_intt_0
;ООООООООООООООООООООООО *-(проверка разрешения, и запихнуть в окно)- ООООООООООООООООООООО
rcall Razreshenie_IVOkno
END_intt_0:
lds r6,Zapomni_r6 ; *** Т.е. если допустим дожидаясь, стробонуло в "р6" 4 раза, то 2 раза на этой стороне.. вот я их и восстановил!
; rcall Taymaut_termo
rcall Oper_Zajig
pop r18 pop r17 pop r16;===================================
reti;--------------------------------
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -TIM1_COMP(A)- 1 ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
TIM1_COMPA:; out tcnt1H,Nolik out tcnt1L,Nolik
Push r16
inc r6
;---------------- (Счетчик для ТЕРМОМЕТРА )
lds r16,Dopoln_r6_60
inc r16
sts Dopoln_r6_60,r16
;----------------
pop r16
reti ;=====================================================
; ИСКРЫ!!! 8).. **** В файле "хлам" лежит РАБОЧИЙ код для сеансов общения!!!************
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -TIM1_COMP(B)- 1 ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
TIMER1_COMPB:
push r16
push r17
;--- Проверка на "Уже прошло 45гр"? ---
lds r16,Termo_3_bayt
cp r6,r16
brne Zavershi_45gr ; Не прошло еще 45 гр.(выйти без действий)
;------- Если 45гр. тогда проверка "Созрел термометр?"
lds r16,Dopoln_r6_60
cpi r16,60
brLO Togda_USART_proveru ; не созрел.. (Значит опросить RX )
rcall Termo_Seans ;-прочесть температуру
rjmp Zavershi_45gr
;------- USART-opros
Togda_USART_proveru:
; in r16,UCSRA
; sbrc r16,7
rcall USART_seans ;-Сеанс USART
; ---
Zavershi_45gr:
pop r17
pop r16
reti ;=====================================================
; Выключить "пропуск"
;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ -TIM-0_A- ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
TIMER0_COMPA: ;out tcnt1L,Nolik out tcnt1H,Nolik
push r16
in r16,TIMSK
cbr r16,0b00000001; вЫлючит таймер чтоб выключить пропуск
out TIMSK,r16
cbi portB,3
pop r16
reti ;=====================================================
;=====================================================
;=====================================================
USART_seans: ;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
Otpr_okno_x8:;--------------
;--------------------; Скорость
mov r16,r1
rcall uart_snt_9 ;**** Пака так.. Тупо ФЛАГ НАЧАЛА ПАКЕТА.
mov r16,r2
rcall uart_snt
mov r16,r3
rcall uart_snt
;------------------- Температура
lds r16,TERMO_L_1
rcall uart_snt
lds r16,TERMO_H_1
rcall uart_snt
lds r16,TERMO_L_2
rcall uart_snt
lds r16,TERMO_H_2
rcall uart_snt
RET;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
uart_INIT: ;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
lDI R16, low(bauddivider)
OUT UBRRL,R16
LDI R16, high(bauddivider)
OUT UBRRH,R16
LDI R16,0
OUT UCSRA, R16
; - приём, + разрешение прием-передача
LDI R16,0b00011100 ;(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<UCSZ1)
OUT UCSRB, R16
; Формат кадра - *9* бит, пишем в регистр UCSRC,
LDI R16,0b10000110 ;(1<<UMSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC, R16
RET;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
;-------------------------------------------
uart_snt_9: ;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
SBIS UCSRA,UDRE ; Пропуск если нет флага готовности
RJMP uart_snt_9 ;
ldi r17,0b10011101 ; Это как и в инициализации, + битик девятый бит
out UCSRB,r17
OUT UDR, R16 ; шлем! :)
RET;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
;-------------------------------------------
uart_snt:;ххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
SBIS UCSRA,UDRE ; Пропуск если нет флага готовности
RJMP uart_snt ;
ldi r17,0b10011100 ;
out UCSRB,r17
OUT UDR, R16 ; шлем! :)
RET;ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
Termo_Seans:
;================================= Прочесть первый раз ===============================
sts Dopoln_r6_60,Nolik ; Обнулил счетчик "созрел термометр"
;--4--------- RESET
rcall RESSET_t
;--5--------- SKIP ROM (адресовано прочитавшему)
ldi r17,$CC rcall COMAND_t ;----SKIP ROM-команда(Пропускание инициализации) (0xCC)
;--6--------- READ ROM (Запрос на чтение памяти)
ldi r17,$BE rcall COMAND_t ;----Чтение памяти..
;--7--------- Чтение
rcall READ_BAYT sts TERMO_L_1,r20 ;Сохранил младший
sts TERMO_L_2,r21
rcall READ_BAYT sts TERMO_H_1,r20 ;Сохранил старший
sts TERMO_H_2,r21
;ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
rcall RESSET_t
;--2--------- SKIP ROM (адресовано прочитавшему)
ldi r17,$CC rcall COMAND_t ;----SKIP ROM-команда(Пропускание инициализации) (0xCC)
;--3--------- tCONV (замера температуры (для 12-bit 750 ms!))
ldi r17,$44 rcall COMAND_t
;VVVVVVVVVVVVVVV
ret;=======================================
READ_BAYT: ;________________Прочесть 1 байт_____возврат в r2__________________
ldi r17,8
READ_BIT_DEC:
in r16,ddrD sbr r16,0b00110000 out ddrD,r16 ;ВыКЛ напругу на проводе
nop nop ;Таймлот, опрос бита 4 уса
in r16,ddrD cbr r16,0b00110000 out ddrD,r16 ;ВыКЛ напругу на проводе
;-----------------
ldi r16,15 ;Там я чего-то по тактам насчитал... вобщем это ~14 микрасек
ggghhhggg: dec r16 brne ggghhhggg
lsr r20 lsr r21
in r16,pinD
sbrc r16,4 sbr r20,0b10000000
sbrc r16,5 sbr r21,0b10000000
ldi r16,7 rcall __US ;**** Было 40 (на 4 нет, на 7 работает) ;завершение таймслота
;-----------------
dec r17
brne READ_BIT_DEC
ldi r16,2 rcall __US ;************ 200 отрубил сразу до 2-х.. Всё Ок!!
ret;============= Tempo4ka ==========================
COMAND_t: ;_____________ reg ______________________Послать команду________________________________________
ldi r16,8 mov r15,r16 ;Счётчик в R15
BIT_COMPLIT_DEC:
lsr r17 ; Изввлечь бит
brsh OUT_NOLL ;(Переход на вывод нолика(по состоянию регистра, куда вываливается бит))
;OUT_ADIN: ;-------------------------------------- Вывод еденички
;Передача "1" осуществляется путем "отпускания" шины 1-Wire со стороны МК не ранее чем
;через 1 микросекунду после начала тайм-слота, но не позже чем через 15 микросекунд.
in r16,ddrD sbr r16,0b00110000 out ddrD,r16 ;ВыКЛ напругу на проводе
ldi r16,1 rcall __US ; Размер паузы ---Х2 !!!
in r16,ddrD cbr r16,0b00110000 out ddrD,r16 ;ВКЛ напругу на проводе
ldi r16,10 rcall __US ;****** Было 79... 10 минимум, на 9 уже не хочет :-/!!
rjmp BIT_COMPLIT
OUT_NOLL: ;-------------------------------------- Вывод нолика
;передачи "0" заключается просто в удержании шины 1-Wire
;в низком уровне в течение всей длительности тайм-слота.
in r16,ddrD sbr r16,0b00110000 out ddrD,r16 ;ВыКЛ напругу на проводе
ldi r16,20 rcall __US ; *** Было 50.. 10-нет, 20-ок !!
in r16,ddrD cbr r16,0b00110000 out ddrD,r16 ;ВКЛ напругу на проводе
ldi r16,1 rcall __US ;******** Ха-ха х 3!!! (было кажись 30!! Догнал до *1* и всё ок!! :).)
BIT_COMPLIT:
dec r15
brne BIT_COMPLIT_DEC
ldi r16,2 rcall __US ;******** было 200, догнал до 2!! всё ок :). ;----Пауза 10, на обработку команты(незнаю, нужна-ли ана...)
ret;=======================================
RESSET_t: ;_______________________________________ресет__________________
in r16,ddrD sbr r16,0b00110000 out ddrD,r16 ;ВыКЛ(опустить) напругу на проводе
ldi r16,120 rcall __US ;*** 240 правильно, 110 минимум работает 100 нет...****; Размер паузы ---Х2 !!!
in r16,ddrD cbr r16,0b00110000 out ddrD,r16 ;ВКЛ напругу на проводе
;--2----------- PRESENCE, как следует из рисунка - не позже 60 микросекунд после завершения импульса RESET.
;Для этого устройство переводит в низкий уровень линию DQ и удерживает ее в этом состоянии от 60 до 240
;микросекунд.
;....т.е. 61(после долгих размышлений я решил...)
ldi r16,2 rcall __US ;*** Ха-ха!! У меня тут 50!! было.. (может оно и меньше 2-х работает,не проверял, сойдет) ; Тестами выявил что пресенс подается
in r16,pinD
sbrc r16,6 ; Считывание PRESRNSE....?
rjmp NO_PRESRNSE ; Низачот
sbrc r16,7 ; Считывание PRESRNSE....?
rjmp NO_PRESRNSE ; Низачот
;----------- PRESENSE
ldi r16,70 rcall __US ;*** Было аж 200.. При 50 аут, а 70 заработала :)
rjmp END_RESET
NO_PRESRNSE:
ldi r16,0x00 sts Error_bit,r16
ret;=======================================
END_RESET:
ldi r16,0xff sts Error_bit,r16
ret;=======================================
__US: ;_________ >reg_ _____________________Пауза по микрасекунде___________________
dec r16 nop nop nop nop nop brne __US
ret;=======================================