.include "m328pdef.inc" // для сердечника из твс на 3 .equ fck = 16000000 ;частота в герцах .equ BAUD = 9600 ;скорость .equ UBRR_value = (fck/(BAUD*16))-1 ;значение для регистра .equ OneSec = fck/256 ;счетчик 1 секунда предделитель 256 .equ OneSecL = low(fck/256) ;мл.б. счетчик 1 секунда предделитель 256 .equ OneSecH = high(fck/256) ;ст.б. .equ MSecL = low(fck/256/250) ;мл.б. кол.циклов часов для частоты импульсов 50Гц .equ MSecH = high(fck/256/250) ;ст.б. (было 130) .equ PlsWthIni = low(fck/128*0.0010);мл.б. начальная ширина имульса 400мкс (минимальная) .equ PlsWthMax = low(fck/128*0.001030);мл.б. разрешенная ширина имульса накачки 1030мкс (максимальная) .equ PWPin = 0x02 ;ножка для импульсов порта B (0b00000010 не номер а маска ) .equ StopTemp = 0x4A ;до какой температуры можно расширять импульс 74 град 4Ah .equ MaxTemp = 0x50 ;температура отключения импульсов 80град 50h .equ TCntr = 0x04 ;количество секунд ожидания ответа нагрева на увеличение импульса .equ DPuls = 0x01 ;шаг увеличения импульса .DSEG //0x0100 CntrSec: .BYTE 1 ;счетчик секунд на изменение длины импульса VeryHot: .BYTE 1 ;признак "горячий" .cseg //0x0000 Label_01: jmp Label_03 ; Reset jmp Label_02 ; External Interrupt Request 0 jmp Label_02 ; External Interrupt Request 1 jmp Label_02 ; Pin Change Interrupt Request 0 jmp Label_02 ; Pin Change Interrupt Request 0 jmp Label_02 ; Pin Change Interrupt Request 1 jmp Label_02 ; Watchdog Time-out Interrupt jmp Int_T2MA_01 ; Timer/Counter2 Compare Match A jmp Label_02 ; Timer/Counter2 Compare Match B jmp Label_02 ; Timer/Counter2 Overflow jmp Label_02 ; Timer/Counter1 Capture Event jmp Int_T1MA_01 ; Timer/Counter1 Compare Match A jmp Int_T1MB_01 ; Timer/Counter1 Compare Match B jmp Label_02 ; Timer/Counter1 Overflow jmp Label_02 ; TimerCounter0 Compare Match A jmp Label_02 ; TimerCounter0 Compare Match B jmp Label_02 ; Timer/Couner0 Overflow jmp Int_SPI_01 ; SPI Serial Transfer Complete jmp Label_02 ; USART Rx Complete jmp Label_02 ; USART, Data Register Empty jmp Label_02 ; USART Tx Complete jmp Label_02 ; ADC Conversion Complete jmp Label_02 ; EEPROM Ready jmp Label_02 ; Analog Comparator jmp Label_02 ; Two-wire Serial Interface jmp Label_02 ; Store Program Memory Read Label_02: cli jmp Label_01 ;поле констант ;таблица значений ацп для термопары с 10 до 100 град с шагом 1 град tmprgrid: .dw 0x0152 ; 338 10 .dw 0x015D ; 349 .dw 0x0168 ; 360 .dw 0x0174 ; 372 .dw 0x017F ; 383 .dw 0x018B ; 395 .dw 0x0196 ; 406 .dw 0x01A2 ; 418 .dw 0x01AE ; 430 .dw 0x01BA ; 442 .dw 0x01C5 ; 453 20 .dw 0x01D1 ; 465 1 .dw 0x01DD ; 477 2 .dw 0x01E8 ; 488 3 .dw 0x01F4 ; 500 4 .dw 0x0200 ; 512 25 10кОм .dw 0x020B ; 523 .dw 0x0216 ; 534 .dw 0x0221 ; 545 .dw 0x022C ; 556 .dw 0x0237 ; 567 30 .dw 0x0242 ; 578 .dw 0x024D ; 589 .dw 0x0257 ; 599 .dw 0x0262 ; 610 .dw 0x026C ; 620 .dw 0x0276 ; 630 .dw 0x0280 ; 640 .dw 0x028A ; 650 .dw 0x0293 ; 659 .dw 0x029D ; 669 40 .dw 0x02A6 ; 678 .dw 0x02AF ; 687 .dw 0x02B8 ; 696 .dw 0x02C1 ; 705 .dw 0x02C9 ; 713 .dw 0x02D1 ; 721 .dw 0x02DA ; 730 .dw 0x02E2 ; 738 .dw 0x02E9 ; 745 .dw 0x02F1 ; 753 50 .dw 0x02F8 ; 760 .dw 0x0300 ; 768 .dw 0x0307 ; 775 .dw 0x030E ; 782 .dw 0x0314 ; 788 .dw 0x031B ; 795 .dw 0x0321 ; 801 .dw 0x0328 ; 808 .dw 0x032E ; 814 .dw 0x0333 ; 819 60 .dw 0x0339 ; 825 .dw 0x033F ; 831 .dw 0x0344 ; 836 .dw 0x0349 ; 841 .dw 0x034F ; 847 .dw 0x0354 ; 852 .dw 0x0358 ; 856 .dw 0x035D ; 861 .dw 0x0362 ; 866 .dw 0x0366 ; 870 70 .dw 0x036B ; 875 .dw 0x036F ; 879 .dw 0x0373 ; 883 .dw 0x0377 ; 887 .dw 0x037B ; 891 .dw 0x037E ; 894 .dw 0x0382 ; 898 .dw 0x0385 ; 901 .dw 0x0389 ; 905 .dw 0x038C ; 908 80 .dw 0x038F ; 911 .dw 0x0392 ; 914 .dw 0x0395 ; 917 .dw 0x0398 ; 920 .dw 0x039B ; 923 .dw 0x039E ; 926 .dw 0x03A1 ; 929 .dw 0x03A3 ; 931 .dw 0x03A6 ; 934 .dw 0x03A8 ; 936 90 .dw 0x03AB ; 939 .dw 0x03AD ; 941 .dw 0x03AF ; 943 .dw 0x03B1 ; 945 .dw 0x03B3 ; 947 .dw 0x03B5 ; 949 .dw 0x03B7 ; 951 .dw 0x03B9 ; 953 .dw 0x03BB ; 955 tmprgridend: .dw 0x03BD ; 957 100 ;старт программы - инициализация Label_03: eor r1, r1 ;r1 в ноль out SREG, r1 ;в SREG ноль ldi r28,low(RAMEND) ; ldi r29,high(RAMEND) ;конец рамы out SPH, r29 ; out SPL, r28 ;загрузить стек ;начальная инициализация таймеров и порта (из дизассемблированного примера Fade) /* in r24, TCCR0A ;читать Timer/Counter Control Register A sbr r24, 0x02 ;установить регистр WGM01: Waveform Generation Mode out TCCR0A, r24 ;записать Timer/Counter Control Register A in r24, TCCR0A ;читать Timer/Counter Control Register A sbr r24, 0x01 ;установить регистр WGM00: Waveform Generation Mode out TCCR0A, r24 ;записать Timer/Counter Control Register A - Fast PWM in r24, TCCR0B ;читать TCCR0B – Timer/Counter Control Register B sbr r24, 0x02 ; out TCCR0B, r24 ;бит1 в единицу in r24, TCCR0B ;читать TCCR0B – Timer/Counter Control Register B sbr r24, 0x01 ; out TCCR0B, r24 ;бит0 в единицу clkI/O/64 (From prescaler) lds r24, TIMSK0 ;читать TIMSK0 – Timer/Counter Interrupt Mask Register sbr r24, 0x01 ; ;sts TIMSK0, r24 ;разрешить прерывание Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable sts TCCR1B, r1 ;TCCR1B – Timer/Counter1 Control Register B - в ноль lds r24, TCCR1B ;читать TCCR1B – Timer/Counter1 Control Register B sbr r24, 0x02 sts TCCR1B, r24 ;clkI/O/8 (From prescaler) lds r24, TCCR1B ;читать TCCR1B – Timer/Counter1 Control Register B sbr r24, 0x01 sts TCCR1B, r24 ;теперь clkI/O/64 (From prescaler) lds r24, TCCR1A ;читать TCCR1A – Timer/Counter1 Control Register A sbr r24, 0x01 sts TCCR1A, r24 ;до 00ff lds r24, TCCR2B ;TCCR2B – Timer/Counter Control Register B sbr r24, 0x04 sts TCCR2B, r24 ;clkT2S/64 (From prescaler) lds r24, TCCR2A ;TCCR2A – Timer/Counter Control Register A sbr r24, 0x01 sts TCCR2A, r24 ;0xFF TOP BOTTOM lds r24, ADCSRA ; ADCSRA – ADC Control and Status Register A sbr r24, 0x04 sts ADCSRA, r24 ;бит2 в 1 lds r24, ADCSRA sbr r24, 0x02 sts ADCSRA, r24 ;бит1 в 1 lds r24, ADCSRA sbr r24, 0x01 sts ADCSRA, r24 ;бит0 в 1 Division Factor 128 lds r24, ADCSRA sbr r24, 0x80 sts ADCSRA, r24 ;бит7 в 1 Bit 7 – ADEN: ADC Enable sts UCSR0B, r1 ;статусный регистр порта в ноль */ ;настройка уарта ldi R16,high(UBRR_value) ;устанавливаем скорость 9600 бод sts UBRR0H,R16 ldi R16,low(UBRR_value) sts UBRR0L,R16 ldi R16,0x08 ;только передатчик без прерываний sts UCSR0B,R16 ldi R16, 0x06 ;8 бит без контроля чет 1 стоп sts UCSR0C,R16 ;Т1 настроить на 1 секунду ldi r24, 0b00000000 ; sts TCCR1A, r24 ;0xFFFF TOP BOTTOM ldi r24, 0b00001100 ;clk/256, wgm12-1 sts TCCR1B, r24 ;предделитель ldi r24, 0b00000000 ;clk/256 sts TCCR1C, r24 ;предделитель ldi r24, OneSecH ; sts OCR1AH, r24 ;задать частоту 1гц ldi r24, OneSecL ; sts OCR1AL, r24 ;задать частоту ldi r24,OneSecH/100 ; sts OCR1BH, r24 ;задать начальное срабатывание T2 ldi r24, OneSecL/100 ; sts OCR1BL, r24 ;задать частоту ldi r24, 0x06 ; sts TIMSK1, r24 ;прерывание по совпадению А и В ;Т2 настроить на импульс ldi r24, 0x02 ;WGM21-WGM20 10 CTC сброс по совпадению sts TCCR2A, r24 ;0xFF TOP BOTTOM ldi r24, 0x00 ;пока таймер останавливаем sts TCCR2B, r24 ; ldi r24, PlsWthIni sts OCR2A, r24 ;задать начальную ширину импульса 20мкс ldi r24, 0x02 ; sts TIMSK2, r24 ;прерывание на сравнение A sei ;разрешить прерывание глобально // настроить порт B ldi r24, PWPin out DDRB, r24 ; ножку PWPin испльзовать как выход // настроить порт C ldi r24, 0b00000000 ; out DDRC, r24 ; все ножки как вход out PORTC, r24 ; не подтягивать // начальные значения ldi r24, 0x00 ;таймер ожидания увеличения длины импульса в ноль sts CntrSec,r24 ;в режим ожидания ldi r24, 0x01 out SMCR, r24 ;режим ожидания Idle ;jmp Int_T1MA_01 Label_End: sleep nop nop rjmp Label_End // обработчик конца импульса Int_T2MA_01: push r24 ldi r24, 0x00 ;пока таймер останавливаем sts TCCR2B, r24 ; //ldi r24, 0x00 ; //sts TIMSK2, r24 ;прерывание Т2 по совпадению А запретить in r24,PINB cbr r24, PWPin ;в ноль ножку out PORTB, r24 pop r24 reti // обработчик запуска импульса Int_T1MB_01: push r24 lds r2,TCNT1L lds r3,TCNT1H //прибавить интервал ldi r24,MSecL add r2,r24 ldi r24,MSecH adc r3,r24 brcc Int_T1MB_05 ;если не за FFFF переход // выход за пределы FFFF - прибавить разницу 10000h-OneSec ldi r24,low(0x10000-OneSec) add r2,r24 ldi r24,high(0x10000-OneSec) adc r3,r24 jmp Int_T1MB_07 Int_T1MB_05: // сравнить с границей одной секунды push r2 push r3 ldi r24,low(OneSec) sub r2,r24 ldi r24,high(OneSec) sbc r3,r24 brcc Int_T1MB_06;если за OneSec переход pop r3 pop r2 jmp Int_T1MB_07 Int_T1MB_06: pop r24 ;освободить стек pop r24 ;освободить стек Int_T1MB_07: // записать новой значение для сравнения sts OCR1BH, r3 ;задать значение на совпадение B таймера T1 sts OCR1BL, r2 ;задать частоту // проверка напряжения на входе ldi r24,0b01000000 ;по внешн питанию, мерить ADC0 - ножка А0 sts ADMUX,R24 ldi r24,0b11000100 ;включить, без прерывания, делитель на 16 sts ADCSRA,R24 Int_T1MB_11: lds r24,ADCSRA sbrc r24,ADSC jmp Int_T1MB_11 ;ждем окончания расчета ldi r24,0b00000000 ;ADC выключен sts ADCSRA,R24 lds r24,ADCL ;считали значение ADC lds r2,ADCH subi r24,0xD0 ; mov r24,r2 sbci r24, 0x01 ;сравниваем с brcs Int_T1MB_19 ;если на входе меньше 11.5 вольт ;проверка на перегрев lds r24,VeryHot ;смотрим флаг перегрева cpi r24,0xFF breq Int_T1MB_19 ;если был перегрев не запускать импульс // дать начало импульсу ;lds r24,OCR2A ;cpi r24,0 ;breq Int_T1MB_19 ;если был перегрев не запускать импульс in r24,PINB sbr r24, PWPin ;ножку вверх out PORTB, r24 ldi r24, 0x05 ;clk/128 = шаг таймера 4мкс sts TCCR2B, r24 ;запуск Int_T1MB_19: pop r24 reti // обработчик прерывания 1 СЕКУНДА Int_T1MA_01: ;Timer/Counter1 A Overflow /* ;моргалка in r24,PINB mov r25,r24 andi r25, 0x02 brne Int_T1MA_02 sbr r24, 0x02 jmp Int_T1MA_03 Int_T1MA_02: cbr r24, 0x02 Int_T1MA_03: out PORTB, r24 in r24,DDRB sbr r24, 0x02 out DDRB, r24 */ // померить температуру датчик 103 (10кОм при 24С), резистр 10кОм ldi r24,0b01000100 ;по внешн питанию, мерить ADC4 - ножка А4 sts ADMUX,R24 ldi r24,0b11000100 ;включить, запустить, делитель на 16 sts ADCSRA,R24 Int_T1MA_04: lds r24,ADCSRA sbrc r24,ADSC jmp Int_T1MA_04 ;ждем окончания расчета ldi r24,0b00000000 ;ADC выключен sts ADCSRA,R24 lds r18,ADCL ;считали значение ADC lds r19,ADCH sei ;разрешить прерывания ldi r16,10 ;начальный градус ldi r17,low(tmprgridend-tmprgrid+10);последний градус ldi r24,low(tmprgrid*2) ; ldi r25,high(tmprgrid*2) ;загрузить в Z адрес начала температурной таблицы movw r31:r30, r25:r24 ;загрузка Z-регистра входными данными lpm r0,Z+ lpm r1,Z+ push r0 push r1 sub r0,r18 sbc r1,r19 brcc Int_T1MA_14 ;меньше равно 10 градусов Int_T1MA_07: lpm r0,Z+ lpm r1,Z+ push r0 push r1 sub r0,r18 sbc r1,r19 pop r1 pop r0 ;восстановить значение текущего интервала pop r25 pop r24 ;восстановить предидущее значение brcc Int_T1MA_09 ;попали в интервал push r0 push r1 ;сохранить текущее в качестве предидущего inc r16 ;увеличить градус cpse r16,r17 ;если дошли до последнего градуса пропустить jmp Int_T1MA_07 jmp Int_T1MA_14 ;выше 70 градусов Int_T1MA_09: sub r0,r24 sbc r1,r25 ;значение в итервале которое равно 1градусу sub r18,r24 sbc r19,r25 ;значение от прошлого интервала movw r25:r24, r1:r0 ;значение в итервале которое равно 1градусу ldi r19,100 mul r19,r18 ;умножить на 100 ldi r17,0 Int_T1MA_10: sub r0,r24 sbc r1,r25 ;значение в итервале которое равно 1градусу brcs Int_T1MA_16 ;целое кончилось выход inc r17 jmp Int_T1MA_10 Int_T1MA_14: pop r1 pop r0 ldi r17,0 ;десятую часть в ноль Int_T1MA_16: ;выдать измеренную температуру в порт без контроля по прерыванию sts UDR0,R16 //sts UDR0,R17 ;управление шириной импульса в зависимости от температуры cpi r16,MaxTemp ;сравнить с температурой перегрева brcs Int_T1MA_22 ;нет перегрева перейти ;пеергрев - отключить импульсы ldi r24, 0xFF ;установить признак перегрева sts VeryHot,r24 ;ldi r24, 0 ;sts OCR2A,r24 jmp Int_T1MA_76 Int_T1MA_22: ;нет перегрева ldi r24, 0 sts VeryHot,r24 ;снять флаг перегрева lds r24, OCR2A ;cpi r24,0 ;breq Int_T1MA_76 ;если был перегрев cpi r24, PlsWthMax brcc Int_T1MA_76 ;если размер импульса максимальный не анализировать cpi r16, StopTemp ;сравнить с X градусов brcc Int_T1MA_76 ;достигли x градусов не прибавлять lds r24,CntrSec inc r24 sts CntrSec,r24 cpi r24,TCntr brcs Int_T1MA_76 ;еще ждем ldi r24,0 sts CntrSec,r24 ;счетчик ожидания в ноль ldi r17,DPuls lds r24,OCR2A add r24,r17 sts OCR2A,r24 ;увеличить импульс Int_T1MA_76: lds r24, OCR2A sts UDR0,R24 ret /* для телека по достижение 70 градусов включить светодиод subi r16, 0x45 brcs Int_T1MA_19 ;моргалка in r24,PINB mov r25,r24 andi r25, 0x02 brne Int_T1MA_02 sbr r24, 0x02 jmp Int_T1MA_03 Int_T1MA_02: cbr r24, 0x02 Int_T1MA_03: out PORTB, r24 in r24,DDRB sbr r24, 0x02 out DDRB, r24 jmp Int_T1MA_20 Int_T1MA_19: in r24,PINB mov r25,r24 andi r25, 0x02 breq Int_T1MA_20 cbr r24, 0x02 out PORTB, r24 Int_T1MA_20: ret */ /* ldi r24, 0x09 ;в r24 = 9 call Label_28 ;вызов процедурки 2 ldi r16, 0x71 ldi r17, 0x00 ;r16r17 = 0071 ldi r25, 0x00 mov r14, r25 ;r14=0 ldi r25, 0x00 mov r15, r25 ;r15=0 Label_48: lds r28, 0x010B ;из sram lds r29, 0x010C ;из sram ldi r24, 0x09 call Label_28 ;второй вызов процедурки 2 так же на входе r24=9 sbiw r29:r28, 0x00 ;минус ноль brne Label_29 ;если Y регистр не ноль Label_42: ldi r22, 0x00 rjmp Label_30 Label_29: cpi r28, 0xFF cpc r29, r1 brne Label_31 Label_41: ldi r22, 0x01 Label_30: ldi r24, 0x09 call Label_32 rjmp Label_33 Label_31: movw r31:r30, r17:r16 lpm r24, Z cpi r24, 0x03 breq Label_34 brsh Label_35 cpi r24, 0x01 breq Label_36 cpi r24, 0x02 brne Label_37 in r24, TCCR0A sbr r24, 0x20 out TCCR0A, r24 out OCR0B, r28 rjmp Label_33 Label_35: cpi r24, 0x07 breq Label_38 cpi r24, 0x08 breq Label_39 cpi r24, 0x04 brne Label_37 lds r24, TCCR1A sbr r24, 0x20 sts TCCR1A, r24 sts OCR1BH, r29 sts OCR1BL, r28 rjmp Label_33 Label_36: in r24, TCCR0A sbr r24, 0x80 out TCCR0A, r24 out OCR0A, r28 rjmp Label_33 Label_34: lds r24, TCCR1A sbr r24, 0x80 sts TCCR1A, r24 sts OCR1AH, r29 sts OCR1AL, r28 rjmp Label_33 Label_38: lds r24, TCCR2A sbr r24, 0x80 sts TCCR2A, r24 sts OCR2A, r28 rjmp Label_33 Label_39: lds r24, TCCR2A sbr r24, 0x20 sts TCCR2A, r24 sts OCR2B, r28 rjmp Label_33 Label_37: cpi r28, 0x80 cpc r29, r1 brlt Label_40 rjmp Label_41 Label_40: rjmp Label_42 Label_33: lds r18, 0x0100 lds r19, 0x0101 lds r24, 0x010B lds r25, 0x010C add r24, r18 adc r25, r19 sts 0x010C, r25 sts 0x010B, r24 sbiw r25:r24, 0x01 cpi r24, 0xFE cpc r25, r1 brlo Label_43 neg r19 neg r18 sbc r19, r1 sts 0x0101, r19 sts 0x0100, r18 Label_43: call Label_44 movw r5:r4, r23:r22 movw r7:r6, r25:r24 ldi r24, 0x1E mov r8, r24 mov r9, r1 mov r10, r1 mov r11, r1 Label_46: call Label_44 movw r27:r26, r25:r24 movw r25:r24, r23:r22 sub r24, r4 sbc r25, r5 sbc r26, r6 sbc r27, r7 cpi r24, 0xE8 sbci r25, 0x03 cpc r26, r1 cpc r27, r1 brlo Label_45 ldi r31, 0x01 sub r8, r31 sbc r9, r1 sbc r10, r1 sbc r11, r1 ldi r18, 0xE8 add r4, r18 ldi r18, 0x03 adc r5, r18 adc r6, r1 adc r7, r1 Label_45: cp r8, r1 cpc r9, r1 cpc r10, r1 cpc r11, r1 brne Label_46 cp r14, r1 cpc r15, r1 brne Label_47 rjmp Label_48 Label_47: call Label_09 rjmp Label_48 Label_8: cli ;запрет прерываний Label_49: rjmp Label_49 */ /* ;процедурка 2 на входе r24 (вызов из процедурки1 r24=09) манипуляции с константами Label_28: ldi r25, 0x00 movw r31:r30, r25:r24 ;загрузка Z-регистра входными данными subi r30, 0x5C ; sbci r31, 0xFF ;Z минус FF5C (z = 0009 - ff5c = 00ad (/2=56) ) lpm r18, Z ;чтение из программной памяти по адресу Z (01) movw r31:r30, r25:r24 ;загрузка Z-регистра входными данными subi r30, 0x70 ; sbci r31, 0xFF ;Z минус FF70 (z = 0009 - ff70 = 0099 (/2=4c старший байт) ) lpm r24, Z ;чтение из программной памяти по адресу Z (02) and r24, r24 ;финт с флагами breq Label_10 ;если r24=0 переход на выход ldi r25, 0x00 ;r25=0 add r24, r24 ; adc r25, r25 ; movw r31:r30, r25:r24 subi r30, 0x7A sbci r31, 0xFF ;0004 - FF7A = 008A (WORD 0045) lpm r26, Z+ lpm r27, Z ;в X = 0024 movw r31:r30, r25:r24 subi r30, 0x84 sbci r31, 0xFF ;0004 - FF84 = 0080 (WORD 0040) lpm r24, Z+ lpm r25, Z ;в r24r25 = 0025 in r24, SREG ;сохранить в r24 регистр флагов cli ;запретить прерывания ld r30, X or r30, r18 ;в r18 01 st X, r30 ;ddrb0 в 1 out SREG, r24 ;восстановить из r24 регистр флагов Label_10: ret Label_32: ldi r25, 0x00 movw r31:r30, r25:r24 subi r30, 0x98 sbci r31, 0xFF lpm r19, Z movw r31:r30, r25:r24 subi r30, 0x5C sbci r31, 0xFF lpm r18, Z movw r31:r30, r25:r24 subi r30, 0x70 sbci r31, 0xFF lpm r30, Z and r30, r30 brne Label_11 rjmp Label_12 Label_11: and r19, r19 breq Label_13 cpi r19, 0x03 breq Label_14 brsh Label_15 cpi r19, 0x01 breq Label_16 cpi r19, 0x02 brne Label_13 in r24, TCCR0A andi r24, 0xDF rjmp Label_17 Label_15: cpi r19, 0x07 breq Label_18 cpi r19, 0x08 breq Label_19 cpi r19, 0x04 brne Label_13 lds r24, TCCR1A andi r24, 0xDF rjmp Label_20 Label_14: lds r24, TCCR1A andi r24, 0x7F Label_20: sts TCCR1A, r24 rjmp Label_13 Label_16: in r24, TCCR0A andi r24, 0x7F Label_17: out TCCR0A, r24 rjmp Label_13 Label_18: lds r24, TCCR2A andi r24, 0x7F rjmp Label_21 Label_19: lds r24, TCCR2A andi r24, 0xDF Label_21: sts TCCR2A, r24 Label_13: ldi r31, 0x00 add r30, r30 adc r31, r31 subi r30, 0x84 sbci r31, 0xFF lpm r26, Z+ lpm r27, Z in r24, SREG cli ld r30, X cpse r22, r1 rjmp Label_22 com r18 and r18, r30 rjmp Label_23 Label_22: or r18, r30 Label_23: st X, r18 out SREG, r24 Label_12: ret Label_44: in r19, SREG cli lds r24, 0x0107 lds r25, 0x0108 lds r26, 0x0109 lds r27, 0x010A in r18, TCNT0 sbis TIFR0, TOV0 rjmp Label_24 cpi r18, 0xFF breq Label_24 adiw r25:r24, 0x01 adc r26, r1 adc r27, r1 Label_24: out SREG, r19 mov r27, r26 mov r26, r25 mov r25, r24 eor r24, r24 add r24, r18 adc r25, r1 adc r26, r1 adc r27, r1 movw r23:r22, r25:r24 movw r25:r24, r27:r26 ldi r20, 0x02 Label_25: add r22, r22 adc r23, r23 adc r24, r24 adc r25, r25 dec r20 brne Label_25 ret */ ;обработка прерывания spi Int_SPI_01: push r1 push r0 in r0, SREG push r0 eor r1, r1 push r18 push r19 push r24 push r25 push r26 push r27 lds r24, 0x0103 lds r25, 0x0104 lds r26, 0x0105 lds r27, 0x0106 lds r19, 0x0102 ldi r18, 0x03 add r18, r19 cpi r18, 0x7D brsh Int_SPI_02 adiw r25:r24, 0x01 adc r26, r1 adc r27, r1 rjmp Int_SPI_03 Int_SPI_02: ldi r18, 0x86 add r18, r19 adiw r25:r24, 0x02 adc r26, r1 adc r27, r1 Int_SPI_03: sts 0x0102, r18 sts 0x0103, r24 sts 0x0104, r25 sts 0x0105, r26 sts 0x0106, r27 lds r24, 0x0107 lds r25, 0x0108 lds r26, 0x0109 lds r27, 0x010A adiw r25:r24, 0x01 adc r26, r1 adc r27, r1 sts 0x0107, r24 sts 0x0108, r25 sts 0x0109, r26 sts 0x010A, r27 pop r27 pop r26 pop r25 pop r24 pop r19 pop r18 pop r0 out SREG, r0 pop r0 pop r1 reti