Advertisement
rom4264

Untitled

May 4th, 2023
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  .include"m2560def.inc"
  2.  .def temp = r16
  3.  .equ freq = 0xff
  4.  .equ ConstCount = 60
  5.  .equ ListPhaseShift = (ConstCount-2)*2/3
  6.  .equ BAUD = 9600                       ; Скорость для UART в Бодах
  7.  .equ XTAL = 8000000                        ; Частота в герцах
  8.  .equ UBRR_value = (XTAL/(BAUD*16))-1   ; Расчитывание значения для регистра UBRR
  9.  .equ BUF_LEN =15                       ; Размер буфера для передачи данных
  10.  .def CRC = r22                          ; Регистр для расчёта CRC
  11.  .def msg = r21                         ; Регистр для чтения и записи сообщения (Буферный байт)
  12.  .def run = r23
  13.  .def lenght = r20
  14.  
  15.  // Название для пинов
  16.  .equ   Phase1Pl = 7
  17.  .equ   Phase1Mi = 6
  18.  
  19.  .equ   Phase2Pl = 5
  20.  .equ   Phase2Mi = 3
  21.  
  22.   .equ  Phase3Pl = 1
  23.  .equ   Phase3Mi = 0
  24.  
  25.  .equ   OCRnA = 1331
  26.  .equ OCRnBHigh = 0x04
  27.  .equ OCRnBLow = 0x8f
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  ///////////////////////////////////////Фунцкия обработки данных фрейма///////////////////////////////
  34. .macro Read_Func
  35.     push r16
  36.     in r16, SREG
  37.     push r16
  38.     push r17
  39.     push r19
  40.     //push r20
  41.     push r21
  42.     push r22
  43.  
  44.  
  45.     cpi @0, 0x01                    //Установка соединения
  46.     breq connection_command         //
  47.  
  48.     cpi @0, 0x26                    //Запрос настроек
  49.     breq check_settings_command     //
  50.  
  51.     cpi @0, 0x15                    //работа с текущими настройками
  52.     breq start_command              //
  53.  
  54.     cpi @0, 0x30                    //смнена настроек и начало/продолжение работы
  55.     breq change_settings            //
  56.  
  57.  
  58.     ldi r16,0
  59.     sts in_count, r16  
  60.     sts in_offset, r16
  61.     rjmp Read_Func_end
  62.  
  63.  
  64. //--------------------------Установка соединения-----------------------------------
  65.     connection_command:
  66.     ldi r17, 0x01
  67.     SendSet r17
  68.     rjmp Read_Func_end
  69. //--------------------------Запрос настроек----------------------------------------
  70.     check_settings_command:
  71.     push XH
  72.     push XL
  73.  
  74.     ldi XH, high(temperature_max)
  75.     ldi XL, low(temperature_max)
  76.  
  77.     ld r19, X+
  78.     //EERead 0x00
  79.     //lds r19, temperature_max
  80.     //EERead 0x01
  81.     ld r17, X
  82.  
  83.     lds r21, volt_max
  84.  
  85.     SendDataSet r19,r17,r21
  86.  
  87.     pop XL
  88.     pop XH
  89.     rjmp Read_Func_end
  90.  
  91. //--------------------------Работа с текущими настройками--------------------------
  92.     start_command:
  93.     ldi run, 1
  94.     rjmp Read_Func_end
  95.  
  96. //--------------------------смнена настроек и начало/продолжение работы------------
  97.     change_settings:
  98.     //пишем данные пока не закончились в еепром
  99.     push XH
  100.     push XL
  101.  
  102.     ldi XH, high(temperature_max)
  103.     ldi XL, low(temperature_max)
  104.     ld r17, Z+
  105.     EEWrite 0x00, r17
  106.     st X+, r17
  107.     ld r17, Z+
  108.     EEWrite 0x01, r17
  109.     st X, r17
  110.     //sts temperature_max, r17
  111.     ld r17, Z+
  112.     EEWrite 0x02, r17
  113.     sts volt_max, r17
  114.     //После записи отвечаем управляшке
  115.     ldi r19, 0x15
  116.     SendSet r19
  117.     ldi run, 1
  118.  
  119.     pop XL
  120.     pop XH
  121.  
  122.     rjmp Read_Func_end
  123. //--------------------------------------------------------------------------------
  124.     Read_Func_end:
  125.  
  126.     pop r22
  127.     pop r21
  128.     //pop r20
  129.     pop r19
  130.     pop r17
  131.     pop r16
  132.     out SREG, r16
  133.     pop r16
  134.  
  135. .endm
  136. ;_______________________________________________________________________________________;
  137.  
  138.  
  139. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  140. //Дятел кривой, не забывай про структуру своего же протокола, даун конченый!!!!!!!!!!!!!!!!!!!!!!!!
  141. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  142.  
  143. ////////////////////////////////////Функция сборки ответной команды///////////////////////
  144. .macro SendSet
  145.     push r16
  146.     in r16, SREG
  147.     push r16
  148.  
  149.     ldi r16, 0x81
  150.     st Y+, r16
  151.     inc lenght
  152.     st Y+, @0
  153.     inc lenght
  154.  
  155.     pop r16
  156.     out SREG, r16
  157.     pop r16
  158. .endm
  159. ;_______________________________________________________________________________________;
  160.  
  161. /////////////////////////////////////Запись в энергонезависимую память///////////////////
  162. .macro EEWrite  // @0 Адресс @1 Данные
  163.     push r16
  164.     in r16, SREG
  165.     push r16
  166.  
  167.     EEPR_write:
  168.     ; Ждём пока можно будет записать
  169.     sbic EECR, EEPE
  170.     rjmp EEPR_write
  171.     ldi r16, @0
  172.     out EEARL, r16
  173.     mov r16, @1
  174.     out EEDR, r16
  175.     sbi EECR,EEMPE
  176.     sbi EECR,EEPE
  177.  
  178.     pop r16
  179.     out SREG, r16
  180.     pop r16
  181. .endm
  182.  
  183. /////////////////////////////////////Запись в энергонезависимую память///////////////////
  184. //Читается в temp
  185. .macro EERead // @0 Адресс
  186.     EEPR_read:
  187.         sbic EECR, EEPE
  188.     rjmp EEPR_read
  189.     ldi temp, @0
  190.     out EEARL, temp
  191.     sbi EECR, EERE
  192.     in temp, EEDR
  193. .endm
  194.  
  195. ////////////////////////////////////Функция сборки пакета с настройками//////////////////////
  196. .macro SendDataSet
  197.     push r16
  198.     in r16, SREG
  199.     push r16
  200.  
  201.     ldi r16, 0x42
  202.     st Y+, r16
  203.     inc lenght
  204.     st Y+, @0
  205.     inc lenght
  206.     st Y+, @1
  207.     inc lenght
  208.     st Y+, @2
  209.     inc lenght
  210.  
  211.     pop r16
  212.     out SREG, r16
  213.     pop r16
  214. .endm
  215. ;_______________________________________________________________________________________;
  216.  
  217. ////////////////////////////////////Функция сборки пакета с данными//////////////////////
  218. .macro SendData
  219.     push r16
  220.     in r16, SREG
  221.     push r16
  222.  
  223.     ldi r16, 0x42
  224.     st Y+, r16
  225.     inc lenght
  226.     st Y+, @0
  227.     inc lenght
  228.     st Y, @1
  229.     inc lenght
  230.  
  231.     pop r16
  232.     out SREG, r16
  233.     pop r16
  234. .endm
  235. ;_______________________________________________________________________________________;
  236.  
  237. /////////////////////////////////////Передача одного байта////////////////////////////////
  238. .macro USART_Trancieve
  239.     push r16
  240.     in r16, SREG
  241.     push r16
  242.  
  243. trans_loop:
  244.     lds r16, UCSR0A
  245.     sbrs r16, UDRE0                 ; Проверяем, не занят ли буфер передачи USART
  246.     rjmp trans_loop
  247.     sts UDR0, @0   
  248.                     ; Передаём байт+
  249.     pop r16
  250.     out SREG, r16
  251.     pop r16
  252. .endm
  253. ;_______________________________________________________________________________________;
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  .dseg
  263.     .org $200
  264.     phase_register:    .BYTE 1
  265.     Constlist_L1shift: .BYTE 2
  266.     Constlist_L2shift: .BYTE 2
  267.     Constlist_L3shift: .BYTE 2
  268.  
  269.     in_data: .BYTE BUF_LEN              ; Буфер принятых данных
  270.     in_offset: .BYTE 1                  ; Смещение в буфере при принятии
  271.     in_count: .BYTE 1                   ; число принятых байтов
  272.     in_mes_count: .BYTE 1               ; число байт которые надо принять по информации из заголовка
  273.     in_flag: .BYTE 1                    ; флаг для чтения пакета (0 при конце пакета)
  274.  
  275.  
  276.     out_data: .BYTE BUF_LEN             ; Буфер данных для отправки
  277.     out_offset: .BYTE 1                 ; Смещение в буфере при передаче
  278.     out_flag: .BYTE 1                   ; Флаг по окончании передачи пакета
  279.  
  280.     temperature: .BYTE 2                ;температура с датчика
  281.     temperature_max: .BYTE 2            ;предельная температура
  282.     volt_max: .BYTE 1
  283.    
  284. .cseg
  285.  .org $0000
  286.  jmp Reset
  287.  
  288. .org $0024
  289. rjmp TIMER1_COMPB
  290.  
  291. .org $0026
  292. rjmp TIMER1_COMPC
  293.  
  294. .org $0028
  295. rjmp TIMER1_OVF
  296.  
  297. ; вектора адресов USART
  298. .org $0032
  299. jmp USART_RXC
  300.  
  301. ;вектор adc
  302. .org $003A
  303. rjmp ADC_Conv_Complete
  304.  
  305. .org $0042
  306. rjmp TIMER3_COMPB
  307.  
  308. .org $0044
  309. rjmp TIMER3_COMPC
  310.  
  311. .org $0046
  312. rjmp TIMER3_OVF
  313.  
  314. .org $0056
  315. rjmp TIMER4_COMPB
  316.  
  317. .org $0058
  318. rjmp TIMER4_COMPC
  319.  
  320. .org $005A
  321. rjmp TIMER4_OVF
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  Reset:
  329.  
  330.     cli
  331.     ldi temp, high(ramend)
  332.     out sph, temp
  333.     ldi temp, low(ramend)
  334.     out spl, temp
  335.  
  336.     ldi temp, 0xff
  337.     out ddrc, temp
  338.     ldi temp, 0x00
  339.     out PORTC, temp
  340.  
  341.     ldi temp, 0xff
  342.     out ddrg, temp
  343.     out ddrb, temp
  344.     cbi ddrb, 5
  345.     out ddre, temp
  346.     sts ddrh, temp
  347.     ldi temp, 0x00
  348.     out ddrf, temp
  349.     out PORTB, temp
  350.  
  351.     ldi temp, 0
  352.  
  353.     sts OCR1BH, temp
  354.     sts OCR1BL, temp
  355.     sts OCR1CH, temp
  356.     sts OCR1CL, temp
  357.     sts 0x8A, temp
  358.     sts 0x8B, temp
  359.     sts 0x8C, temp
  360.     sts 0x8D, temp
  361.     nop
  362.     nop
  363.     nop
  364.     nop
  365.  
  366.     sts OCR3BH, temp
  367.     sts OCR3BL, temp
  368.     sts OCR3CH, temp
  369.     sts OCR3CL, temp
  370.     nop
  371.     nop
  372.     nop
  373.     nop
  374.  
  375.     sts OCR4BH, temp
  376.     sts OCR4BL, temp
  377.     sts OCR4CH, temp
  378.     sts OCR4CL, temp
  379.     nop
  380.     nop
  381.     nop
  382.     nop
  383.  
  384.     ldi     r17,    high(OCRnA)
  385.     ldi     r16,    low(OCRnA)
  386.     sts     OCR1AH, r17
  387.     sts     OCR1AL, r16
  388.     sts     OCR3AH, r17
  389.     sts     OCR3AL, r16
  390.     sts     OCR4AH, r17
  391.     sts     OCR4AL, r16
  392.  
  393.     ldi     r18,    0x00
  394.     sts     Constlist_L1shift,      r18
  395.     sts     Constlist_L1shift+1,        r18
  396.  
  397.     ldi     r18,    high(ListPhaseShift)
  398.     ldi     r17,    low(ListPhaseShift)
  399.     sts     Constlist_L2shift,      r18
  400.     sts     Constlist_L2shift+1,        r17
  401.     sts     Constlist_L3shift,      r18
  402.     sts     Constlist_L3shift+1,        r17
  403.  
  404.     rcall PWM_PFC_Init
  405.  
  406.     ldi temp, 0b00111000
  407.     sts phase_register, temp
  408.  
  409.     //Для юсарта
  410.     ldi CRC,0x00
  411.  
  412.     rcall USART_Init
  413.  
  414.     ldi ZL, low(in_data)
  415.     ldi ZH, high(in_data)
  416.  
  417.     ldi YH, high(out_data)
  418.     ldi YL, low(out_data)
  419.  
  420.     //ldi temp, 0x00
  421.     //out EEARH, temp
  422.  
  423.     EERead 0x00
  424.     ldi XH, high(temperature_max)
  425.     ldi XL, low(temperature_max)
  426.     st X+, r16
  427.  
  428.     EERead 0x01
  429.     st X, r16
  430.  
  431.     EERead 0x02
  432.     sts volt_max, r16
  433.  
  434.     //Настройка ацп
  435.     clr temp
  436.     ldi temp, (1 << REFS1) | (1 <<  REFS0)// | (1 << ADLAR)
  437.     //ldi   temp,   0b11000000  //В качестве порта ставим ADC8 для работы без деления
  438.     sts ADMUX,  temp        //
  439.  
  440.     ldi temp, 0b11001111    //Разрешаем прерывания и прочую лабуду
  441.     sts ADCSRA, temp        ////////////////
  442.    
  443.     clr temp
  444.     sts in_offset, temp
  445.  
  446.     clr temp
  447.     sts out_offset, temp
  448. sei
  449.  
  450.  
  451.  Main:
  452.     lds temp, in_offset
  453.     cpi temp, 0
  454.     brne USARTMod_Communication
  455.     cpi run, 102
  456.     breq Main
  457.  
  458.     //rjmp Temp_check
  459.  
  460.     send_standart:
  461.     cpi run, 14
  462.     brlo main
  463.     ldi YH, high(out_data)
  464.     ldi YL, low(out_data)
  465.     ldi XH, high(temperature)
  466.     ldi XL, low(temperature)
  467.     ld r18, X+
  468.     ld r17, X
  469.     SendData r18, r17
  470.     ldi run, 1
  471.     rjmp sending
  472.  
  473.  rjmp Main
  474.  
  475.  SHIM_OFF:
  476.     clr temp
  477.     sts TIMSK1, temp
  478.     sts TIMSK3, temp
  479.     sts TIMSK4, temp
  480.     ldi run, 102
  481.     ldi r17, 0xf1
  482.     SendSet r17
  483.     rjmp sending
  484. rjmp Main
  485.  
  486.  //------------------------Обработка принятых данных------------------------------
  487. USARTMod_Communication:
  488.  
  489.     lds temp, in_flag
  490.     and temp, temp                  //дожидаемся конца приёма пакета
  491.     brne USARTMod_Communication    
  492.  
  493.     ldi ZH, high(in_data)           //берём ссылку на начало буфера с данными
  494.     ldi ZL, low(in_data)            /////////////////////////////////
  495.  
  496.     lds temp, in_offset             //берём смещение в буфере, для подсчёта CRC, если temp станет равным 0, то мы посчитали CRC для фрейма
  497.     dec temp                        /////////////////////////////////
  498.  
  499.     crc_check:                      //считаем и сравниваем CRC с данными из пакета
  500.     ld msg, Z+                      //если сошлось идём дальше, нет? не беда, дропаемся из функции
  501.     add CRC, msg                    //
  502.     dec temp                        //
  503.     brne crc_check                  //
  504.                                     //
  505.     ld msg, Z                       //
  506.     cpse CRC, msg                   //
  507.     rjmp USARTMod_Communication_end ////////////////////////////////////////
  508.  
  509.     ldi ZH, high(in_data)           //обновляем сслыки на начала буферов
  510.     ldi ZL, low(in_data)            //
  511.     ldi YH, high(out_data)          //
  512.     ldi YL, low(out_data)           ////////////////////////////////////
  513.  
  514.     ld msg, Z+                      //изменяем сдвиг в соответствии с данными из фрейма
  515.     ldi temp, 0x3f
  516.     and msg, temp                   //чтобы работать только с полем данных
  517.     dec msg
  518.     sts in_offset, msg              ///////////////////////////////////////////////////
  519.  
  520.     ld msg, Z+                      //считываем команду из первого байта поля данных
  521.     Read_Func msg                   //Вызываем функцию обработки поступивших данных и формирования ответа на них
  522.    
  523.     sending:
  524.     //------------------------Отправка данных----------------------------------------
  525.     ldi YH, high(out_data)
  526.     ldi YL, low(out_data)
  527.     clr CRC
  528.     //in temp, lenght
  529.     sts out_offset, lenght
  530.     lds temp, out_offset
  531.  
  532.     cpi temp, 0
  533.     breq Send_end
  534.  
  535.     ldi msg, 0xff
  536.     USART_Trancieve msg
  537.  
  538.     send_loop:
  539.     ld msg, Y+
  540.     add CRC, msg
  541.  
  542.     USART_Trancieve msg
  543.     dec temp
  544.     brne send_loop
  545.  
  546.     mov msg, CRC
  547.     USART_Trancieve msg
  548.  
  549.     ldi msg, 0xf0
  550.     USART_Trancieve msg
  551.  
  552. //-----------------Очистка буферов после ответа на запрос-------------------------
  553. USARTMod_Communication_end:
  554. Send_end:
  555.     clr temp
  556.     sts in_count, temp
  557.     sts in_offset, temp
  558.     ldi YL, low(out_data)
  559.     ldi YH, high(out_data)
  560.     ldi ZL, low(in_data)
  561.     ldi ZH, high(in_data)
  562.     clr CRC
  563.     ldi lenght, 0
  564. rjmp main
  565.  
  566.  
  567. Temp_check:
  568.     push r17
  569.     push r18
  570.     push r20
  571.     push r21
  572.     ldi XH, high(temperature)
  573.     ldi XL, low(temperature)
  574.     ld r17, X+
  575.     ld r18, X
  576.     ldi XH, high(temperature_max)
  577.     ldi XL, low(temperature_max)
  578.     ld r21, X+
  579.     ld r20, X
  580.     cp r17, r20
  581.     cpc r18, r21
  582.     brlo PC + 2
  583.     rjmp SHIM_OFF
  584.     pop r21
  585.     pop r20
  586.     pop r18
  587.     pop r17
  588. rjmp send_standart
  589.  
  590.  
  591. //---------------Настройка USART-----------------------------
  592. USART_Init:  
  593.     //1 Устанавливаем скорость передачи данных
  594.     ldi temp, high(UBRR_Value)
  595.     sts UBRR0H, temp
  596.     ldi temp, low(UBRR_Value)
  597.     sts UBRR0L, temp
  598.     //1 конец
  599.  
  600.     //2 настройка по даташиту
  601.     clr temp
  602.     sts UCSR0A, temp
  603.  
  604.     ldi temp, (1<<RXCIE0)|(0<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0)
  605.     sts UCSR0B, temp
  606.  
  607.     ldi r16, (0<<UMSEL0)|(3<<UCSZ00)
  608.     sts UCSR0C,r16
  609.     sei
  610. reti
  611.  
  612.  
  613. //------------------Прерывание по окончанию преобразования-------------------------//
  614. ADC_Conv_Complete:                  ; Прерывание по окончанию преобразования
  615.     push    XH
  616.     push    XL
  617.     push r16
  618.     in r16, SREG
  619.     push r16
  620.     push r17
  621.  
  622.     ldi XH, high(temperature)
  623.     ldi XL, low(temperature)
  624.  
  625.     lds r16, ADCL
  626.     st X+, r16
  627.     lds r16, ADCH
  628.     st X, r16
  629.  
  630.     pop r17
  631.     pop r16
  632.     out SREG, r16
  633.     pop r16
  634.     pop XL
  635.     pop XH
  636. reti
  637.  
  638.  
  639. //-------------Прерывание по приёму байта-----------------
  640. USART_RXC:
  641.  
  642.         push r17
  643.         in r17,SREG
  644.         push r17
  645.         push r20
  646.  
  647.         lds r17, UCSR0A
  648.         sbrs r17, RXC0
  649.         rjmp USART_RXC
  650.  
  651.         lds r20, in_flag                    //проверяем флаг приёма пакета,
  652.         cpi r20, 0                          //если 0 то это либо помеха либо начало пакета
  653.         brne in_get_byte
  654.  
  655.         lds r17, UDR0
  656.         cpi r17, 0xff                       //если флаг 0 то проверяем байт на начало пакета
  657.         brne RXC_end                        //если не начало пакета то пропускаем
  658.  
  659.         inc r20                             //если начало пакета то флаг в 1
  660.         sts in_flag, r20                    //и идём в конец чтобы не записывать лишнее в буфер
  661.         rjmp RXC_end
  662.  
  663.     in_get_byte:                           
  664.         lds r17, UDR0                       //читаем байт и проверяем на конец пакета
  665.         cpi r17, 0xf0                       //если не конец пакета идём записывать
  666.         brne in_set_byte
  667.  
  668.         ldi r20, 0                          //если конец то флаг в 0 и выходим из функции
  669.         sts in_flag, r20
  670.         rjmp RXC_end
  671.  
  672.     in_set_byte:
  673.         st Z+,r17                           //записываем пришедший байт в память
  674.         lds r20, in_offset                  //увеличиваем смещение в буфере
  675.         inc r20
  676.         sts in_offset, r20                  //инфа в буфере имеет вид (|HEADER| ||COMAND| |ELSE DATA|| |CRC|) без флагов начала и конца
  677.  
  678.     RXC_end:
  679.         pop r20
  680.         pop r17
  681.         out SREG, r17
  682.         pop r17
  683.  
  684. reti
  685.  
  686.  
  687.  
  688.  
  689. //Дальше идёт часть кода с ШИМОМ
  690.  constlist:.DW  128,  139,  250,  277,  345,  412,  478,  542,  605,  667, 726,  784,  839,  892,  943,  991,  1036, 1078, 1118, 1154, 1188, 1218, 1244, 1265, 1270, 1275, 1280, 1285, 1290, 1297
  691.  //Масси указателей на массивы
  692.  //constlist2: .DW constlist
  693.  
  694.  
  695.  PWM_PFC_Init:
  696.    
  697.     ldi temp, 0b00101001
  698.     sts TCCR1A, temp
  699.     sts TCCR3A, temp
  700.     sts TCCR4A, temp
  701.     ldi temp, 0b00010001
  702.     sts TCCR1B, temp
  703.     sts TCCR3B, temp
  704.     sts TCCR4B, temp
  705.  
  706.     ldi temp, (1<< TOIE1)|(1 <<OCIE1B)|(1 <<OCIE1C)
  707.     sts TIMSK1, temp
  708.     ldi temp, (1<< TOIE3)|(1 <<OCIE3B)|(1 <<OCIE3C)
  709.     sts TIMSK3, temp
  710.     ldi temp, (1<< TOIE4)|(1 <<OCIE4B)|(1 <<OCIE4C)
  711.     sts TIMSK4, temp
  712. ret
  713.  
  714.  
  715. TIMER1_COMPC:
  716. reti
  717.  
  718. // прерывание переполнения таймера (опустошение)
  719. TIMER1_OVF:
  720.     push    r16
  721.     in      r16,    SREG
  722.     push    r16
  723.     push    r17
  724.     push    XH
  725.     push    XL
  726.     push    ZH
  727.     push    ZL
  728.  
  729.     ;sei
  730.  
  731.     //  phase register отвечает за то, какая четвердь синусоиды сейчас идёт у каждой фазы
  732.     //  Он разбит на 3 блока по 2 бита, где 0бит - восходящая или нисхожящая четверть,
  733.     //  а 1бит - положительная или отрицательная полуволна синусоиды
  734.     lds     r16,    phase_register
  735.     //  сохраняем его в стек
  736.     push    r16
  737.     lds     XH, Constlist_L1shift
  738.     lds     XL, Constlist_L1shift+1
  739.     ldi     ZH, high(2*constlist)
  740.     ldi     ZL, low(2*constlist)
  741.    
  742.     //  Сбрасываем не нужные биты и сравниваем
  743.     cbr     r16,    0b11111110
  744.     cpi     r16,    0b00000000
  745.         breq    TIMER1_OVF_rising
  746.     cpi     r16,    0b00000001
  747.         breq    TIMER1_OVF_falling
  748.  
  749.         ;-------Восходящая четверть------;
  750.         TIMER1_OVF_rising: 
  751.  
  752.             //  Проверяем не равен ли наш сдвиг размерности массива
  753.             cpi     XL,     low(ConstCount)
  754.                 brne    TIMER1_OVF_rising_1
  755.             cpi     XH,     high(ConstCount)
  756.                 brne    TIMER1_OVF_rising_1
  757.                 // Если да, то переходим на нисходящую четверть, выставляя соответствующий бит в регистре
  758.                 pop     r16
  759.                 sbr     r16,    0b00000001
  760.                 sts     phase_register,     r16
  761.                 push    r16
  762.                 rjmp    TIMER1_OVF_falling_1
  763.  
  764.             TIMER1_OVF_rising_1:
  765.             //  Если мы не дошли до конца массива,
  766.             //  Сдвигаем указатель на массив на X
  767.             ADD     ZL,     XL
  768.             ADC     ZH,     XH
  769.  
  770.             //  Считываем необходимое значение из массива
  771.             LPM     r16,    Z+          //
  772.             LPM     r17,    Z
  773.            
  774.             //  Заносим полученное значение в регистр сравнения
  775.             sts     OCR1BH, r17
  776.             sts     OCR1BL, r16
  777.             //  Увеличиваем сдвиг
  778.             adiw    X2
  779.             sts     Constlist_L1shift,      XH
  780.             sts     Constlist_L1shift+1,    XL
  781.  
  782.             pop     r16
  783.             rjmp    TIMER1_OVF_End
  784.  
  785.         ;-------Нисходящая четверть------;
  786.         TIMER1_OVF_falling:
  787.  
  788.             //  Проверяем не равен ли наш сдвиг 0
  789.             cpi     XL,     0
  790.                 brne    TIMER1_OVF_falling_1
  791.             cpi     XH,     0
  792.                 brne    TIMER1_OVF_falling_1
  793.                 //  Если да, то преходим на восходящую четверть и меняем полуволну на противоположную,
  794.                 //  выставляя соответствующие биты в регистре
  795.                 pop     r16
  796.                 cbr     r16,    0b00000001
  797.                 sbrc    r16,    1
  798.                     rjmp    PC+3
  799.                 sbr     r16,    0b00000010
  800.                 rjmp    PC+2
  801.                 cbr     r16,    0b00000010
  802.  
  803.                 sts     phase_register,     r16
  804.                 push    r16
  805.  
  806.                 //Тема для отправки пакета
  807.                 cpi run, 0
  808.                 breq step_flag
  809.                 inc run
  810.                 step_flag:
  811.  
  812.                 rjmp    TIMER1_OVF_rising_1
  813.             TIMER1_OVF_falling_1:
  814.             //  Если мы не ушли за массив,
  815.             //  Сдвигаем указатель на массив на X
  816.             ADD     ZL,     XL
  817.             ADC     ZH,     XH
  818.             //  Считываем необходимое значение из массива
  819.             sbiw    Z,      1
  820.             LPM     r17,    Z
  821.             sbiw    Z,      1
  822.             LPM     r16,    Z
  823.             //  Заносим полученное значение в регистр сравнения
  824.             sts     OCR1BH, r17
  825.             sts     OCR1BL, r16
  826.             //  Уменьшаем сдвиг
  827.             sbiw    X2
  828.             sts     Constlist_L1shift,      XH
  829.             sts     Constlist_L1shift+1,    XL
  830.             pop     r16
  831.             rjmp    TIMER1_OVF_End
  832.            
  833.     TIMER1_OVF_End:
  834.     cli
  835.     pop     ZL
  836.     pop     ZH
  837.     pop     XL
  838.     pop     XH
  839.     pop     r17
  840.     pop     r16
  841.     out     SREG,   r16
  842.     pop     r16
  843. reti
  844.  
  845. //Прерывание по сравнению
  846. TIMER1_COMPB:
  847.     push    r16
  848.     in      r16,    SREG
  849.     push    r16
  850.     push    r17
  851.     push    XH
  852.     push    XL
  853.  
  854.     ;sei
  855.  
  856.     //считываем начальное значение счётчика,
  857.     //чтобы определить низходящий или восходящий таймер  
  858.     lds     r16,    0x84
  859.     lds     r17,    0x85
  860.     mov     XL,     r16
  861.     mov     XH,     r17
  862.  
  863.     // определяем какая полуволна положительная или отрицательная
  864.     lds     r16,    phase_register
  865.     cbr     r16,    0b11111101
  866.     cpi     r16,    0b00000000
  867.         breq    TIMER1_COMPB_pozitive
  868.     cpi     r16,    0b00000010
  869.         breq    TIMER1_COMPB_negative
  870.     rjmp    TIMER1_COMPB_End
  871.         TIMER1_COMPB_pozitive:
  872.             // снова считываем значение таймера счётчика
  873.             // для сравнения
  874.            
  875.  
  876.             cbi     PORTC,  Phase1Mi
  877.             lds     r16,    0x84
  878.             lds     r17,    0x85
  879.             sub     r16,    XL
  880.             sbc     r17,    XH
  881.             brmi    PC+3
  882.                 cbi     PORTC,  Phase1Pl
  883.                 rjmp    PC+2
  884.             sbi     PORTC,  Phase1Pl
  885.  
  886.             rjmp    TIMER1_COMPB_End
  887.  
  888.         TIMER1_COMPB_negative:
  889.             // считываем значение таймера для сравнения
  890.             /*cpi run, 1
  891.             brne step_flag
  892.             inc run
  893.             inc run
  894.             step_flag:*/
  895.             cbi     PORTC,  Phase1Pl
  896.             lds     r16,    0x84
  897.             lds     r17,    0x85
  898.             sub     r16,    XL
  899.             sbc     r17,    XH
  900.             brmi    PC+3
  901.                 cbi     PORTC,  Phase1Mi
  902.                 rjmp    PC+2
  903.             sbi     PORTC,  Phase1Mi
  904.     TIMER1_COMPB_End:
  905.     cli
  906.     pop     XL
  907.     pop     XH
  908.     pop     r17
  909.     pop     r16
  910.     out     SREG,   r16
  911.     pop     r16
  912. reti
  913.  
  914.  
  915.  
  916. TIMER3_COMPB:
  917.     push    r16
  918.     in      r16,    SREG
  919.     push    r16
  920.     push    r17
  921.     push    XH
  922.     push    XL
  923.     lds     r16,    0x84
  924.     lds     r17,    0x85
  925.     mov     XL,     r16
  926.     mov     XH,     r17
  927.     lds     r16,    phase_register
  928.     cbr     r16,    0b11110111
  929.     cpi     r16,    0b00000000
  930.         breq    TIMER3_COMPB_pozitive
  931.     cpi     r16,    0b00001000
  932.         breq    TIMER3_COMPB_negative
  933.     rjmp    TIMER3_COMPB_End
  934.         TIMER3_COMPB_pozitive:
  935.             cbi     PORTC,  Phase2Mi
  936.             lds     r16,    0x84
  937.             lds     r17,    0x85
  938.             sub     r16,    XL
  939.             sbc     r17,    XH
  940.             brmi    PC+3
  941.                 cbi     PORTC,  Phase2Pl
  942.                 rjmp    PC+2
  943.             sbi     PORTC,  Phase2Pl
  944.  
  945.             rjmp    TIMER1_COMPB_End
  946.  
  947.         TIMER3_COMPB_negative:
  948.             cbi     PORTC,  Phase2Pl
  949.             ;cbi        PORTC,  7
  950.             lds     r16,    0x84
  951.             lds     r17,    0x85
  952.             sub     r16,    XL
  953.             sbc     r17,    XH
  954.             brmi    PC+3
  955.                 cbi     PORTC,  Phase2Mi
  956.                 rjmp    PC+2
  957.             sbi     PORTC,  Phase2Mi
  958.     TIMER3_COMPB_End:
  959.     cli
  960.     pop     XL
  961.     pop     XH
  962.     pop     r17
  963.     pop     r16
  964.     out     SREG,   r16
  965.     pop     r16
  966. reti
  967.  
  968.  
  969.  
  970. TIMER3_COMPC:
  971. reti
  972.  
  973.  
  974. TIMER3_OVF:
  975.     push    r16
  976.     in      r16,    SREG
  977.     push    r16
  978.  
  979.     push    r17
  980.     push    XH
  981.     push    XL
  982.     push    ZH
  983.     push    ZL
  984.     lds     r16,    phase_register
  985.     push    r16
  986.  
  987.     lds     XH, Constlist_L2shift
  988.     lds     XL, Constlist_L2shift+1
  989.     ldi     ZH,     high(2*constlist)
  990.     ldi     ZL,     low(2*constlist)
  991.  
  992.     cbr     r16,    0b11111011
  993.     cpi     r16,    0b00000000
  994.         breq    TIMER3_OVF_rising
  995.     cpi     r16,    0b00000100
  996.         breq    TIMER3_OVF_falling
  997.  
  998.         TIMER3_OVF_rising: 
  999.             cpi     XL,     low(ConstCount)
  1000.                 brne    TIMER3_OVF_rising_1
  1001.             cpi     XH,     high(ConstCount)
  1002.                 brne    TIMER3_OVF_rising_1
  1003.                 pop     r16
  1004.                 ;sbrc   r16,    1
  1005.                 ;   cbr     r16,    1
  1006.                 sbr     r16,    0b00000100
  1007.                 sts     phase_register,     r16
  1008.                 push    r16;;;;;;
  1009.                 ;sbiw   X2
  1010.                 rjmp    TIMER3_OVF_falling_1;;TIMER1_OVF_End
  1011.  
  1012.             TIMER3_OVF_rising_1:
  1013.             ADD     ZL,     XL
  1014.             ADC     ZH,     XH
  1015.             LPM     r16,    Z+          //
  1016.             LPM     r17,    Z
  1017.             sts     OCR3BH, r17
  1018.             sts     OCR3BL, r16
  1019.             adiw    X2
  1020.             sts     Constlist_L2shift,      XH
  1021.             sts     Constlist_L2shift+1,    XL
  1022.             pop     r16
  1023.             rjmp    TIMER3_OVF_End
  1024.  
  1025.         ;*/
  1026.         TIMER3_OVF_falling:
  1027.             ;/*
  1028.             cpi     XL,     0
  1029.                 brne    TIMER3_OVF_falling_1
  1030.             cpi     XH,     0
  1031.                 brne    TIMER3_OVF_falling_1
  1032.                 pop     r16
  1033.                 cbr     r16,    0b00000100
  1034.                 ;cbr        r16,    0b11111101
  1035.                 sbrc    r16,    3
  1036.                     rjmp    PC+3
  1037.                 sbr     r16,    0b00001000
  1038.                 rjmp    PC+2
  1039.                 cbr     r16,    0b00001000
  1040.  
  1041.                 sts     phase_register,     r16
  1042.                 ;push   r17
  1043.                 push    r16;;;;;;
  1044.                 rjmp    TIMER3_OVF_rising_1;TIMER1_OVF_End
  1045.                 ;
  1046.             TIMER3_OVF_falling_1:
  1047.             ADD     ZL,     XL
  1048.             ADC     ZH,     XH
  1049.             sbiw    Z,      1
  1050.             LPM     r17,    Z           //
  1051.             sbiw    Z,      1
  1052.             LPM     r16,    Z
  1053.             sts     OCR3BH, r17
  1054.             sts     OCR3BL, r16
  1055.             sbiw    X,  2
  1056.             sts     Constlist_L2shift,      XH
  1057.             sts     Constlist_L2shift+1,    XL
  1058.             pop     r16
  1059.             rjmp    TIMER3_OVF_End;TIMER1_OVF_rising;
  1060.            
  1061.     TIMER3_OVF_End:
  1062.     cli
  1063.     pop     ZL
  1064.     pop     ZH
  1065.     pop     XL
  1066.     pop     XH
  1067.     pop     r17
  1068.     pop     r16
  1069.     out     SREG,   r16
  1070.     pop     r16
  1071. reti
  1072.  
  1073.  
  1074.  
  1075. TIMER4_COMPB:
  1076.     push    r16
  1077.     in      r16,    SREG
  1078.     push    r16
  1079.     push    r17
  1080.     push    XH
  1081.     push    XL
  1082.     lds     r16,    0x84
  1083.     lds     r17,    0x85
  1084.     mov     XL,     r16
  1085.     mov     XH,     r17
  1086.     lds     r16,    phase_register
  1087.     cbr     r16,    0b11011111
  1088.     cpi     r16,    0b00000000
  1089.         breq    TIMER4_COMPB_pozitive
  1090.     cpi     r16,    0b00100000
  1091.         breq    TIMER4_COMPB_negative
  1092.     rjmp    TIMER4_COMPB_End
  1093.         TIMER4_COMPB_pozitive:
  1094.             cbi     PORTC,  Phase3Mi
  1095.             ;cbi        PORTC,  6
  1096.             lds     r16,    0x84
  1097.             lds     r17,    0x85
  1098.             sub     r16,    XL
  1099.             sbc     r17,    XH
  1100.             brmi    PC+3
  1101.             ;cp     r16,    r17
  1102.             ;brsh   PC+3
  1103.                 cbi     PORTC,  Phase3Pl
  1104.                 rjmp    PC+2
  1105.             sbi     PORTC,  Phase3Pl
  1106.             rjmp    TIMER4_COMPB_End
  1107.  
  1108.         TIMER4_COMPB_negative:
  1109.             cbi     PORTC,  Phase3Pl
  1110.             ;cbi        PORTC,  7
  1111.             lds     r16,    0x84
  1112.             lds     r17,    0x85
  1113.             sub     r16,    XL
  1114.             sbc     r17,    XH
  1115.             brmi    PC+3
  1116.                 cbi     PORTC,  Phase3Mi
  1117.                 rjmp    PC+2
  1118.             sbi     PORTC,  Phase3Mi
  1119.     TIMER4_COMPB_End:
  1120.     cli
  1121.     pop     XL
  1122.     pop     XH
  1123.     pop     r17
  1124.     pop     r16
  1125.     out     SREG,   r16
  1126.     pop     r16
  1127. reti
  1128.  
  1129.  
  1130. TIMER4_COMPC:
  1131. reti
  1132.  
  1133.  
  1134. TIMER4_OVF:
  1135.     push    r16
  1136.     in      r16,    SREG
  1137.     push    r16
  1138.  
  1139.     push    r17
  1140.    
  1141.     ;push   r18
  1142.     push    XH
  1143.     push    XL
  1144.     push    ZH
  1145.     push    ZL
  1146.  
  1147.     ;sei
  1148.  
  1149.     lds     r16,    phase_register
  1150.     push    r16
  1151.  
  1152.     lds     XH,     Constlist_L3shift
  1153.     lds     XL,     Constlist_L3shift+1
  1154.     ldi     ZH,     high(2*constlist)
  1155.     ldi     ZL,     low(2*constlist)
  1156.  
  1157.     cbr     r16,    0b11101111
  1158.     cpi     r16,    0b00000000
  1159.         breq    TIMER4_OVF_rising
  1160.     cpi     r16,    0b00010000
  1161.         breq    TIMER4_OVF_falling
  1162.  
  1163.         TIMER4_OVF_rising: 
  1164.             cpi     XL,     low(ConstCount)
  1165.                 brne    TIMER4_OVF_rising_1
  1166.             cpi     XH,     high(ConstCount)
  1167.                 brne    TIMER4_OVF_rising_1
  1168.                 pop     r16
  1169.                 ;sbrc   r16,    1
  1170.                 ;   cbr     r16,    1
  1171.                 sbr     r16,    0b00010000
  1172.                 sts     phase_register,     r16
  1173.                 push    r16;;;;;;
  1174.                 ;sbiw   X,  2
  1175.                 rjmp    TIMER4_OVF_falling_1;;TIMER1_OVF_End
  1176.             TIMER4_OVF_rising_1:
  1177.             ADD     ZL,     XL
  1178.             ADC     ZH,     XH
  1179.  
  1180.            
  1181.             LPM     r16,    Z+          //
  1182.             LPM     r17,    Z
  1183.            
  1184.             sts     OCR4BH, r17
  1185.             sts     OCR4BL, r16
  1186.             adiw    X,  2
  1187.             sts     Constlist_L3shift,      XH
  1188.             sts     Constlist_L3shift+1,    XL
  1189.  
  1190.             pop     r16
  1191.             rjmp    TIMER4_OVF_End
  1192.         TIMER4_OVF_falling:
  1193.             cpi     XL,     0
  1194.                 brne    TIMER4_OVF_falling_1
  1195.             cpi     XH,     0
  1196.                 brne    TIMER4_OVF_falling_1
  1197.                 pop     r16
  1198.                 cbr     r16,    0b00010000
  1199.                 ;cbr        r16,    0b11111101
  1200.                 sbrc    r16,    3
  1201.                     rjmp    PC+3
  1202.                 sbr     r16,    0b00100000
  1203.                 rjmp    PC+2
  1204.                 cbr     r16,    0b00100000
  1205.  
  1206.                 sts     phase_register,     r16
  1207.                 ;push   r17
  1208.                 push    r16;;;;;;
  1209.                 rjmp    TIMER4_OVF_rising_1;TIMER1_OVF_End
  1210.                 ;
  1211.             TIMER4_OVF_falling_1:
  1212.  
  1213.             ADD     ZL,     XL
  1214.             ADC     ZH,     XH
  1215.             sbiw    Z,      1
  1216.             LPM     r17,    Z           //
  1217.             sbiw    Z,      1
  1218.             LPM     r16,    Z
  1219.            
  1220.             sts     OCR4BH, r17
  1221.             sts     OCR4BL, r16
  1222.             sbiw    X,  2
  1223.             sts     Constlist_L3shift,      XH
  1224.             sts     Constlist_L3shift+1,    XL
  1225.             pop     r16
  1226.  
  1227.             rjmp    TIMER4_OVF_End;TIMER1_OVF_rising;      
  1228.     TIMER4_OVF_End:
  1229.     cli
  1230.     pop     ZL
  1231.     pop     ZH
  1232.     pop     XL
  1233.     pop     XH
  1234.     pop     r17
  1235.     pop     r16
  1236.     out     SREG,   r16
  1237.     pop     r16
  1238. reti
  1239.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement