Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created:   Вт окт 25 2016
  5. ; Processor: ATmega8535
  6. ; Compiler:  AVRASM (Proteus)
  7. ;====================================================================
  8.  
  9. ;====================================================================
  10. ; DEFINITIONS
  11. ;====================================================================
  12.  
  13. ;====================================================================
  14. ; VARIABLES
  15. ;====================================================================
  16.  
  17.       .DSEG
  18.       .equ  XTAL = 8000000      ; частота ОМК
  19.       .equ  baudrate = 4800     ; скорость передачи в RS-485
  20.       .equ  bauddivider = XTAL/(16*baudrate) - 1
  21.      
  22.       ; Адрес результата
  23.       .equ  resAddrL = $70
  24.       .equ  resAddrH = 0
  25.       ; Адрес посчитанной нормальной частоты
  26.       .equ  buffAddrL = $0A0
  27.       .equ  buffAddrH = 0
  28.      
  29.       .def  A = r2
  30.       .def  B = r3
  31.       .def  Ql = r4
  32.       .def  Qh = r5
  33.       .def  Qdopl = r6
  34.       .def  Qdoph = r7
  35.      
  36.       .def  tmp0 = r6    ; множимое мл. байт
  37.       .def  tmp1 = r7    ; множимле ст. байт
  38.       .def  tmp2 = r8    ; множитель мл. байт
  39.       .def  tmp3 = r9    ; множитель ст. байт
  40.       ; частное деления 32 на 32 или произведение 16 на 16
  41.       .def  res1 = r10
  42.       .def  res2 = r11
  43.       .def  res3 = r12
  44.       .def  res4 = r13
  45.       ; остаток от деления 32 на 32
  46.       .def  res5 = r17
  47.       .def  res6 = r18
  48.       .def  res7 = r19
  49.       .def  res8 = r20
  50.      
  51.       .def  AAddr = r14  ; Адрес константы А
  52.       .def  BAddr = r15  ; Адрес константы B
  53.       .def  NdopAddr = r23   ; Адрес константы N допустимая
  54.       .def  SensorAddr = r24 ; Адрес датчика
  55.       .def  Index = r25      ; Номер ветви
  56.      
  57.  
  58. ;====================================================================
  59. ; RESET and INTERRUPT VECTORS
  60. ;====================================================================
  61.       .CSEG
  62.       ; Reset Vector
  63.       rjmp  Start
  64.       .org $01 rjmp INT0Handler
  65.       .org $02 rjmp INT1Handler
  66.       .org $08 rjmp TOV1Handler
  67.  
  68. ;====================================================================
  69. ; CODE SEGMENT
  70. ;====================================================================
  71.  
  72.       .org $80
  73.      QdopAddr:  .db $06, $36
  74.       .org $82
  75.      StartNdop: .db $14, $0A, $0A, $0A
  76.       .org $86
  77.      StartA:    .db $03, $03, $01, $01, $01, $01, $01, $01
  78.       .org $8E
  79.      StartB:    .db $5A, $5A, $5A, $5A, $5A, $5A, $5A, $5A
  80.  
  81.  
  82. Start:
  83.       ; Инициализация стека
  84.       ldi   r16,      high(ramend)
  85.       out   sph,      r16
  86.       ldi   r16,      low(ramend)
  87.       out   spl,      r16  
  88.       ; Разрешение прерываний INT0 и INT1
  89.       ldi   r16,      $0C0
  90.       out   gicr,     r16
  91.       ldi   r16,      $0A
  92.       out   mcucr,    r16
  93.       clr   r16
  94.       out   gifr,     r16
  95.       ; Настраиваем порт на вывод
  96.       ldi   r16,      $0FF
  97.       out   DDRA,     r16
  98.       ldi   r16,      $0C0
  99.       out   PORTA,    r16
  100.       ; Разрешаем прерывания
  101.       sei
  102.      
  103.       rjmp Loop
  104.      
  105.       ; Накапливаем переполнения таймера T1
  106.       TOV1Handler:
  107.         in    r16,  sreg
  108.         push  r16
  109.           inc   r3
  110.         pop   r16
  111.         out   sreg, r16
  112.         reti
  113.          
  114.       TOV0Handler:
  115.         brts  clrBit
  116.         rjmp  setBit
  117.         rjmp  clrBit  
  118.         clrBit:
  119.           clt
  120.           rjmp finish
  121.         setBit:
  122.           set
  123.         finish:
  124.         reti
  125.        
  126.        
  127.       ; По приходу запроса INT0 подготавливаем      
  128.       ; ресурсы и запускаем алгоритм подсчета Q
  129.       INT0Handler:
  130.         in    r16,  sreg
  131.         push  r16
  132.           rcall init_task
  133.           rcall DoTask
  134.         pop   r16
  135.         out   sreg, r16
  136.         reti
  137.      
  138.      
  139.       ; По приходу запроса INT1 подготавливаем      
  140.       ; ресурсы и запускаем алгоритм передачи данных
  141.       INT1Handler:
  142.         in    r16, sreg
  143.         push  r16
  144.           wait_task_end:
  145.             sbrs  r19, 0
  146.             rjmp  wait_task_end
  147.             ldi   yl,       resAddrL
  148.             ldi   yh,       resAddrH
  149.           rcall Transmit
  150.         pop   r16
  151.         out   sreg, r16
  152.         reti
  153.        
  154.        
  155.       ; Подготавливаем ресурсы
  156.       ; для подсчета Q
  157.       init_task:
  158.         in    r16,  sreg
  159.         push  r16
  160.           clr   r16
  161.           out   PORTA,     r16
  162.           ldi   NdopAddr,  StartNdop
  163.           clr   SensorAddr
  164.           ldi   yl,        resAddrL
  165.           ldi   yh,        resAddrH  
  166.           ldi   xl,        buffAddrL
  167.           ldi   xh,        buffAddrH
  168.           clr   r18
  169.           out   PORTA, r18   
  170.           clr   Index
  171.         pop   r16
  172.         out   sreg, r16
  173.         ret
  174.        
  175.        
  176.       mul16x16_32:
  177.         in    r16,  sreg
  178.         push  r16
  179.         push  r20
  180.         push  tmp0
  181.         push  tmp1
  182.         push  tmp2
  183.         push  tmp3
  184.           ; Очистка результата
  185.           clr   res1
  186.           clr   res2
  187.           clr   res3
  188.           clr   res4
  189.           ; Умножение
  190.           clr   r20
  191.           mul   tmp0, tmp2
  192.           movw  res1, r0
  193.           mul   tmp1, tmp3
  194.           movw  res3, r0
  195.           mul   tmp1, tmp2
  196.           add   res2, r0
  197.           adc   res3, r1
  198.           adc   res4, r20
  199.           mul   tmp0, tmp3
  200.           add   res2, r0
  201.           adc   res3, r1
  202.           adc   res4, r20        
  203.         pop   tmp3
  204.         pop   tmp2
  205.         pop   tmp1
  206.         pop   tmp0
  207.         pop   r20
  208.         pop   r16
  209.         out   sreg, r16
  210.         ret
  211.        
  212.        
  213.       ; ------------------------------------------------------------------------------
  214.       ; Деление двойного слова на двойное слово (32 / 32 -> 32.32) ///////////////////
  215.       ; ------------------------------------------------------------------------------
  216.       ; --> res1, res2 -- делимое младшие два байта,
  217.       ;     res3, res4 -- делимое старшие два байта;
  218.       ;     tmp0, tmp1 -- делитель младшие два байта,
  219.       ;     tmp2, tmp3 -- делитель старшие два байта;
  220.       ; <-- res1, res2 -- частное младшие два байта,
  221.       ;     res3, res4 -- частное старшие два байта;
  222.       ;     res5, res6 -- остаток младшие два байта,
  223.       ;     res7, res8 -- остаток старшие два байта.
  224.       div32to32:
  225.         in    r16,  sreg
  226.         push  r16
  227.           ldi        r16, 33                  ; Количество разрядов + бит C
  228.           clr        res5                    ; Остаток мл.слово мл.байт
  229.           clr        res6                    ; Остаток мл.слово ст.байт
  230.           clr        res7                    ; Остаток ст.слово мл.байт
  231.           clr        res8                    ; Остаток ст.слово ст.байт
  232.           clc
  233.           S_Div_DWordDWord_Loop:
  234.             rol        res5
  235.             rol        res6
  236.             rol        res7
  237.             rol        res8
  238.             sub        res5, tmp0            ; Остаток минус делитель
  239.             sbc        res6, tmp1
  240.             sbc        res7, tmp2
  241.             sbc        res8, tmp3
  242.             brcc    S_Div_DWordDWord_1
  243.             add        res5, tmp0
  244.             adc        res6, tmp1
  245.             adc        res7, tmp2
  246.             adc        res8, tmp3
  247.           S_Div_DWordDWord_1:
  248.             rol        res1
  249.             rol        res2
  250.             rol        res3
  251.             rol        res4
  252.             dec        r16
  253.             brne    S_Div_DWordDWord_Loop
  254.             com        res1
  255.             com        res2
  256.             com        res3
  257.             com        res4
  258.         pop   r16
  259.         out   sreg, r16
  260.         ret
  261.        
  262.       ; Подпрограмма подсчета расхода топлива
  263.       DoTask:
  264.         in    r16, sreg
  265.         push  r16
  266.         push  r17        
  267.           ; Считаем Q12
  268.           rcall calculateQ       
  269.           ; Загружаем константу Qдоп
  270.           ldi   zl, low(QdopAddr << 1)
  271.           ldi   zh, high(QdopAddr << 1)    
  272.           lpm   r7, Z+
  273.           lpm   r6, Z
  274.           ; Вычислим 1/3Qдоп
  275.           devideQdopBy3:
  276.             mov   tmp0,  r6         ; Загружаем мл. байт Qdop
  277.             mov   tmp1,  r7         ; Загружаем ст. байт Qdop
  278.             ldi   r16,   low(0x5555)   
  279.             mov   tmp2,  r16        ; Загружаем мл. байт константы 21845
  280.             ldi   r16,   high(0x5555)  
  281.             mov   tmp3,  r16        ; Загружаем ст. байт константы 21845
  282.             rcall mul16x16_32       ; Умножаем
  283.           ; Старшие 2 байты и есть результат деления на 3
  284.           mov   Qdopl,res3
  285.           mov   Qdoph,res4
  286.           check1:
  287.             ; Проверка
  288.             sub   Qh,    Qdoph
  289.             brsh  check2        ; Если Qh >= Qdoph/3, идем к след. условию
  290.             rjmp  includePipe1  ; Иначе включаем только 1 ветвь
  291.           check2:
  292.             add   Qh,    Qdoph  ; Восстанваливаем Q
  293.             ; Умножаем Qдоп на 2
  294.             rol   Qdopl
  295.             rol   Qdoph
  296.             ; Проверка
  297.             sub   Qh,    Qdoph
  298.             brsh  includePipe123    ; Если Qh >= 2*Qdoph/3, включаем все ветви
  299.             rjmp  includePipe12 ; Иначе включаем только 2 ветви
  300.           includePipe1:
  301.             ; Включаем 1 индикатор
  302.             in    r16,   PINA
  303.             ldi   r17,   (0 << 5)|(0 << 4)|(1 << 3)
  304.             add   r16,   r17
  305.             out   PORTA, r16
  306.            
  307.             ; Увеличиваем адрес канала(ветви)
  308.             inc   Index
  309.             inc   Index
  310.             ; Увеличиваем адрес константы N допустимой
  311.             inc   NdopAddr
  312.             ; Считаем расход топлива в ветви
  313.             rcall calculateQ
  314.             ; Сохраняем результат в буфер
  315.             st    Y+,    Ql
  316.             st    Y+,    Qh
  317.             clr   r16
  318.             st    Y+,    r16
  319.             st    Y,     r16
  320.             rjmp  endTask
  321.               includePipe12:   
  322.             ; Включаем 2 индикатора
  323.             in    r16,   PINA
  324.             ldi   r17,   (0 << 5)|(1 << 4)|(1 << 3)
  325.             add   r16,   r17
  326.             out   PORTA, r16
  327.            
  328.             ; Увеличиваем адрес канала(ветви)
  329.             inc   Index
  330.             inc   Index
  331.             ; Увеличиваем адрес константы N допустимой
  332.             inc   NdopAddr
  333.             ; Считаем расход топлива в ветви
  334.             rcall calculateQ
  335.             ; Записываем Q в r6, r7 для последующего суммирования
  336.             mov   r6,    Ql
  337.             mov   r7,    Qh
  338.            
  339.             ; Увеличиваем адрес канала(ветви)
  340.             inc   Index
  341.             inc   Index
  342.             ; Увеличиваем адрес константы N допустимой
  343.             inc   NdopAddr
  344.             ; Считаем расход топлива в ветви
  345.             rcall calculateQ
  346.             ; Q = Q34 + Q56
  347.             clc
  348.             add   r6,    Ql
  349.             adc   r7,    Qh
  350.             ; Сохраняем результат в буфер
  351.             st    Y+,    r6
  352.             st    Y+,    r7
  353.             st    Y+,    r8
  354.             clr   r16
  355.             st    Y,     r16
  356.             rjmp  endTask
  357.           includePipe123:
  358.             ; Включаем 3 индикатора
  359.             in    r16,   PINA
  360.             ldi   r17,   (1 << 5)|(1 << 4)|(1 << 3)
  361.             add   r16,   r17
  362.             out   PORTA, r16
  363.            
  364.             ; Увеличиваем адрес канала(ветви)
  365.             inc   Index
  366.             inc   Index
  367.             ; Увеличиваем адрес константы N допустимой
  368.             inc   NdopAddr
  369.             ; Считаем расход топлива в ветви
  370.             rcall calculateQ
  371.             ; Записываем Q в r6, r7 для последующего суммирования
  372.             mov   r6,    Ql
  373.             mov   r7,    Qh
  374.            
  375.             ; Увеличиваем адрес канала(ветви)
  376.             inc   Index
  377.             inc   Index
  378.             ; Увеличиваем адрес константы N допустимой
  379.             inc   NdopAddr
  380.             ; Считаем расход топлива в ветви
  381.             rcall calculateQ
  382.             ; Q = Q34 + Q56
  383.             clc
  384.             add   r6,    Ql
  385.             adc   r7,    Qh
  386.            
  387.             ; Увеличиваем адрес канала(ветви)
  388.             inc   Index
  389.             inc   Index
  390.             ; Увеличиваем адрес константы N допустимой
  391.             inc   NdopAddr
  392.             ; Считаем расход топлива в ветви
  393.             rcall calculateQ
  394.             ; Q = Q + Q78
  395.             clc
  396.             add   r6,    Ql
  397.             adc   r7,    Qh
  398.             ; Сохраняем результат в буфер
  399.             st    Y+,    r6
  400.             st    Y+,    r7
  401.             st    Y+,     r8
  402.             clr   r16
  403.             st    Y,     r16
  404.         endTask:
  405.           sbr   r19,  1
  406.         pop   r17
  407.         pop   r16
  408.         out   sreg, r16
  409.         ret
  410.        
  411.       ; Подпрограмма вычисления расхода
  412.       ; топлива по 1 ветви
  413.       calculateQ:
  414.         in    r16,  sreg
  415.         push  r16
  416.         push  r18
  417.         push  zl
  418.         push  A
  419.         push  B
  420.         push  r6
  421.         push  r7       
  422.           rcall CalculateFreq       ; Считываем частоты с датчиков    
  423.           in    r16,   PINA     ; Считываем текущее состояние порта
  424.           inc   SensorAddr      ; Увеличиваем адрес датчика
  425.           cbr   r16,   $07      ; Очищаем младшие 3 бита,
  426.           or    r16,   SensorAddr   ; загружаем в эти 3 бита адрес датчика
  427.           out   PORTA, r16      ; и передаем в порт
  428.          
  429.           rcall CalculateFreq       ; Считываем частоты с датчиков
  430.           in    r16,   PINA
  431.          
  432.           clz               ; Если дошли до последнего датчика,
  433.           cpi   SensorAddr, $07     ; мы не увеличиваем адрес
  434.           breq  next            ; (чтобы индикаторы горели до след. нажатия)                     
  435.          
  436.           inc   SensorAddr
  437.           cbr   r16,   $07
  438.           or    r16,   SensorAddr
  439.           out   PORTA, r16
  440.          
  441.           next:      
  442.           rcall GetNormFreq     ; Вычисляем нормальную частоту
  443.                         ; (выходные параметры - r20, r21)
  444.          
  445.           ; Загружаем константу А         
  446.           ldi   r16,  low(StartA << 1)
  447.           ldi   zh,   high(StartA << 1)
  448.           add   r16,  Index
  449.           mov   zl,   r16
  450.           add   zl,   r19    
  451.           lpm   A,    Z
  452.          
  453.           ; Загружаем константу В
  454.           ldi   r16,  low(StartB << 1)
  455.           ldi   zh,   high(StartB << 1)
  456.           add   r16,  Index      
  457.           mov   zl,   r16
  458.           add   zl,   r19
  459.           lpm   B,    Z+
  460.          
  461.           ; Q = A*N + B
  462.           calculateQ12:
  463.             ; r20 - мл. байт частоты
  464.             ; r21 - ст. байт частоты
  465.            
  466.             ; Умножаем А на частоту
  467.             mul   A,     r20   
  468.             mov   Ql,    r0
  469.             mov   r6,   r1
  470.             mul   A,     r21
  471.             add   r0,    r6
  472.             mov   Qh,    r0
  473.             ; Прибавляем В
  474.             clc
  475.             add   Ql,    B
  476.             clr   r16
  477.             adc   Qh,    r16
  478.         pop   r7
  479.         pop   r6
  480.         pop   B
  481.         pop   A
  482.         pop   zl
  483.         pop   r18
  484.         pop   r16
  485.         out   sreg, r16
  486.         ret
  487.        
  488.       ; Инициализируем счетчики
  489.       CT_init:
  490.         in    r16, sreg
  491.         push  r16
  492.           clr   r3      ; Очищаем регистр переполнений T1
  493.          
  494.           ldi   r16,    $04 ; Разрешаем прерывания по  
  495.           out   timsk,  r16 ; переполнению T1
  496.          
  497.           out   tifr,   r3  ; Сбрасываем флаги
  498.          
  499.           ldi   r16,    $0FF
  500.           out   tcnt0,  r3
  501.           out   tccr1a, r3
  502.           out   tcnt1h, r3  ; Обнуляем счетчик T1
  503.           out   tcnt1l, r3
  504.         pop   r16
  505.         out   sreg, r16
  506.         ret
  507.        
  508.       CalculateFreq:
  509.         in    r16, sreg
  510.         push  r16
  511.         push  r17
  512.         push  r18
  513.         push  r2
  514.           cli
  515.           rcall CT_init         ; Инициализируем счетчики
  516.           ldi   r16,    $07
  517.           sei
  518.           out   tccr0,  r16     ; Счет по фронту импульса
  519.           ldi   r16,    $02     ; clk/8
  520.           ;ldi   r16,    $01        ; clk
  521.           waitStart:
  522.                 sbis    PINB, 0
  523.                 rjmp    waitStart
  524.           out   tccr1b, r16     ; Устанавливаем предделитель = 8
  525.           waitEnd:
  526.                 sbic    PINB, 0
  527.                 rjmp    waitEnd
  528.           waitNextStart:
  529.                 sbis    PINB, 0
  530.                 rjmp    waitNextStart
  531.           clr   r16
  532.           out   tccr1b, r16     ; Останавливаем таймер T1
  533.           out   tccr0,  r16
  534.          
  535.           ; задание делимого(частота генератора) = 1MHz(0F4240h)
  536.           ldi   r16,    $40
  537.           mov   res1,   r16
  538.           ldi   r16,    $42
  539.           mov   res2,   r16
  540.           ldi   r16,    $0F
  541.           mov   res3,   r16
  542.           clr   res4
  543.           ; задание делителя(тики таймера)
  544.           in    tmp0,   tcnt1l
  545.           in    tmp1,   tcnt1h
  546.           mov   tmp2,   r3
  547.           clr   tmp3
  548.           ; подсчет исходной частоты = (частота генератора)/(тики таймера)
  549.           rcall div32to32
  550.           ; Загружаем результат в буфер
  551.           st    X+, res1
  552.           st    X+, res2  
  553.         pop   r2
  554.         pop   r18
  555.         pop   r17
  556.         pop   r16
  557.         out   sreg, r16
  558.         ret
  559.        
  560.       GetNormFreq:
  561.         in    r16, sreg
  562.         push  r16
  563.         push  r15   ; мл. байт первой частоты
  564.         push  r14   ; ст. байт первой частоты
  565.         push  r13   ; мл. байт второй частоты
  566.         push  r12   ; ст. байт второй частоты
  567.         push  r17   ; номер канала
  568.         push  r18
  569.         push  r22   ; N допустимая
  570.         push  r0
  571.         push  zl
  572.         push  zh
  573.         push  yl
  574.         push  yh
  575.           ; Загрузка Nдоп
  576.           mov   zl,  NdopAddr
  577.           clr   zh
  578.           rol   zl
  579.           rol   zh
  580.           lpm   r0,  Z
  581.           mov   r22, r0
  582.           ; Загрузка частот из буфера
  583.           ld    r12, -X
  584.           ld    r13, -X
  585.           ld    r14, -X
  586.           ld    r15, -X
  587.           ; Вычисление разности двух частот
  588.           clc
  589.           mov   r16, r15
  590.           sub   r16, r13
  591.           mov   r18, r14
  592.           sbc   r18, r12
  593.           brlo  second_more_than_first      ; Если разность < 0, то 2-я частота больше 1-й
  594.           breq  numbers_are_equal
  595.           first_more_than_second:
  596.             ;  Вычисление (N1 - N2) - Ndop
  597.             clc
  598.             sub  r16, r22
  599.             sbci r18, $0
  600.             brlo numbers_are_equal      ; Если (N1 - N2) - Ndop < 0, считаем их средн. арифм.
  601.             mov  r20, r15           ; Иначе возвращаем
  602.             mov  r21, r14           ; большую частоту
  603.             cbr  r19, $01
  604.             rjmp end
  605.           second_more_than_first:
  606.             ; (N1 - N2) -> (N2 - N1)
  607.             com  r18
  608.             com  r16
  609.             ;  Вычисление (N2 - N1) - Ndop
  610.             clc
  611.             sub  r16, r22
  612.             sbci r18, $0
  613.             brlo numbers_are_equal      ; Если (N2 - N1) - Ndop < 0, считаем их средн. арифм.
  614.             mov  r20, r13           ; Иначе возвращаем
  615.             mov  r21, r12           ; большую частоту
  616.             sbr  r19, $01
  617.             rjmp end
  618.           numbers_are_equal:
  619.             ; Делим на 2 первое число
  620.             lsr  r15
  621.             lsr  r14
  622.             ; Делим на 2 второе число
  623.             lsr  r13
  624.             lsr  r12
  625.             ; Складываем полученное
  626.             clc
  627.             add  r15, r13
  628.             adc  r14, r12
  629.             mov  r20, r15
  630.             mov  r21, r14
  631.             sbr  r19, $01
  632.         end:
  633.         pop   yh
  634.         pop   yl
  635.         pop   zh
  636.         pop   zl
  637.         pop   r0
  638.         pop   r22
  639.         pop   r18
  640.         pop   r17
  641.         pop   r12
  642.         pop   r13
  643.         pop   r14
  644.         pop   r15
  645.         pop   r16
  646.         out   sreg, r16
  647.         ret
  648.    
  649.       ; Инициализация UART
  650.       Uart_init:
  651.         in    r16, sreg
  652.         push  r16
  653.           ; Устанавливаем скорость передачи
  654.           ldi   r16,   low(bauddivider)
  655.           out   ubrrl, r16
  656.           ldi   r16,   high(bauddivider)
  657.           out   ubrrh, r16
  658.            
  659.           ; Сбрасываем флаги
  660.           clr   r16
  661.           out   ucsra, r16
  662.            
  663.           ; Разрешаем передачу
  664.           ldi   r16,   (1 << TXEN)|(0 << TXCIE)|(0 << UDRIE)
  665.           out   ucsrb, r16
  666.            
  667.           ; Обращаемся к UCSRC и устанавливаем формат кадра - 8 бит
  668.           ldi   r16,   (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0)
  669.           out   ucsrc, r16
  670.         pop   r16
  671.         out   sreg, r16
  672.         ret
  673.        
  674.       Transmit:
  675.         in    r16, sreg
  676.         push  r16
  677.         push  r17
  678.         push  yl
  679.         push  yh  
  680.           rcall Uart_init       ; Инициализируем UART
  681.           ldi   r17, $04        ; Передаем 4 байта данных
  682.           uart_send_cycle:
  683.             sbis ucsra, UDRE    ; Если регистр данных пуст, передаем след. байт
  684.             rjmp uart_send_cycle
  685.            
  686.             ld   r16, Y+
  687.             out  udr, r16       ; Загружаем в регистр данных след. байт
  688.            
  689.             dec  r17
  690.             brne uart_send_cycle
  691.         pop   yh
  692.         pop   yl
  693.         pop   r17
  694.         pop   r16
  695.         out   sreg, r16
  696.         ret
  697.        
  698. Loop:
  699.       rjmp  Loop
  700.  
  701. ;====================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement