Facebook
From Morose Hornbill, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 87
  1. .equ Digits_P = PORTB
  2. .equ Segments_P = PORTD
  3.  
  4. .def Digit_0 = R5
  5. .def Digit_1 = R4
  6. .def Digit_2 = R3
  7. .def Digit_3 = R2
  8.  
  9. .def PulseEdgeCtrL = R0
  10. .def PulseEdgeCtrH = R1
  11.  
  12. ; INPUTS
  13. .def XL=R16 ; divident
  14. .def XH=R17
  15.  
  16. .def YL=R18 ; divisor
  17. .def YH=R19
  18.  
  19. ; OUTPUTS
  20. .def RL=R16 ; remainder
  21. .def RH=R17
  22.  
  23. .def QL=R18 ; quotient
  24. .def QH=R19
  25.  
  26. ; INTERNAL
  27. .def QCtrL=R24
  28. .def QCtrH=R25
  29.  
  30.  
  31.  
  32. .macro LOAD_CONST
  33.         ldi @0, low(@2)
  34.         ldi @1, high(@2)
  35. .endmacro
  36.  
  37. .macro SET_DIGIT
  38.         mov R16, Digit_@0
  39.         rcall DigitTo7segCode
  40.         ldi R24, 2<<@0
  41.         out Digits_P, R24
  42.         out Segments_P, R16
  43.         rcall DelayInMs
  44. .endmacro
  45.  
  46.  
  47.  
  48. .cseg           ; segment pamięci kodu programu  
  49.  
  50. .org 0     ; ustawia pamięć kodu na 0.
  51. rjmp main_loop  ; skok po resecie (do programu głównego)
  52. .org OC1Aaddr  
  53. rjmp _timer_isr ; skok do obsługi przerwania timera
  54.  
  55. _timer_isr:      ; procedura obsługi przerwania timera
  56.     inc R0   ; jakiś kod
  57.     reti     ; powrót z procedury obsługi przerwania (reti zamiast ret)  
  58.  
  59.  
  60.  
  61.         Divide:
  62. ; X/Y = Q * Y + R
  63.  
  64.         push R24
  65.         push R25
  66.  
  67.         LOAD_CONST QCtrL, QCtrH, 0
  68.  
  69.         Divide_2:
  70.                 cp XH, YH    ;cp porównuje rejestry odejmując je.
  71.                 brcs Divide_2_End ; XH < YH
  72.                 brne Divide_2_Sub ; XH > YH
  73.  
  74.                 cp XL, YL ; XH = YH
  75.                 brcs Divide_2_End ; XL < YL
  76.  
  77.                 Divide_2_Sub:
  78.                         sub XL, YL
  79.                         sbc XH, YH
  80.                         adiw QCtrL:QCtrH, 1
  81.                         rjmp Divide_2
  82.  
  83.                 Divide_2_End:
  84.                         mov QH, QCtrH
  85.                         mov QL, QCtrL
  86.                         mov RH, XH
  87.                         mov RL, XL
  88.  
  89.         pop R25
  90.         pop R24
  91.  
  92.         ret
  93.  
  94.  
  95.  
  96. DelayInMs:
  97.         push R24
  98.         push R25
  99.         LOAD_CONST R24, R25, 30
  100.         Loop_1:
  101.                 rcall DelayOneMs
  102.                 sbiw R24, 1
  103.         brne Loop_1
  104.         pop R25
  105.         pop R24
  106.         ret
  107.  
  108. DelayOneMs:
  109.         push R24
  110.         push R25
  111.  
  112.         LOAD_CONST R24, R25, 1750
  113.         Loop_2:
  114.                 sbiw R24, 1
  115.                 brne Loop_2
  116.  
  117.         pop R25
  118.         pop R24
  119.         ret
  120.  
  121.  
  122.  
  123.         DigitTo7segCode:
  124.  
  125.         push R30
  126.         push R31
  127.  
  128.         ldi R30, low(Table<<1)
  129.         ldi R31, high(Table<<1)
  130.  
  131.         add R30,R16
  132.         clr R16
  133.         adc R31,R16
  134.         lpm R16, Z
  135.  
  136.         pop R31
  137.         pop R30
  138.  
  139.         ret
  140.  
  141. Table: .db 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
  142.  
  143.  
  144.  
  145. NumberToDigits:
  146.         mov XL, PulseEdgeCtrL
  147.         mov XH, PulseEdgeCtrH
  148.         LOAD_CONST YL, YH, 1000
  149.         rcall Divide
  150.         mov Digit_0, QL
  151.  
  152.         LOAD_CONST YL, YH, 100
  153.         mov XH, RH
  154.         mov XL, RL
  155.         rcall Divide
  156.         mov Digit_1, QL
  157.  
  158.         LOAD_CONST YL, YH, 10
  159.         mov XH, RH
  160.         mov XL, RL
  161.         rcall Divide
  162.         mov Digit_2, QL
  163.  
  164.         mov Digit_3, RL
  165.         ret
  166.  
  167.  
  168.  
  169. Timer1_Init:   ; linijka 248 w manualu.
  170.         .equ Timer_Period = 32150
  171.  
  172.         ldi R16, TCCR1B|(1<<CS12)|(1<<WGM12)
  173.         out TCCR1B, R16
  174.         ldi R16, high(Timer_Period)
  175.         out OCR1AH, R16
  176.         ldi R16, low(Timer_Period)
  177.         out OCR1AL, R16
  178.         ldi R16, 1<<OCIE1A
  179.         out TIMSK, R16
  180.  
  181. push R27
  182. push R28
  183. LOAD_CONST R27, R28, 1234 ; TUTAJ WPISUJĘ LICZBĘ
  184. mov PulseEdgeCtrH, R28
  185. mov PulseEdgeCtrL, R27
  186. pop R28
  187. pop R27
  188.  
  189. //clr PulseEdgeCtrL
  190. //clr PulseEdgeCtrH
  191.  
  192. rcall NumberToDigits
  193.  
  194.  
  195. Main_Loop:
  196.  
  197.         push R20
  198.         push R21
  199.         push R22
  200.  
  201.         ldi R20, 1
  202.         add PulseEdgeCtrL, R20
  203.         clr R20
  204.         adc PulseEdgeCtrH, R20
  205.  
  206.         LOAD_CONST R21, R22, 10000
  207.  
  208.         cp PulseEdgeCtrL, R21
  209.         brne Counter_End
  210.         cp PulseEdgeCtrH, R22
  211.         brne Counter_End
  212.  
  213.         clr PulseEdgeCtrL
  214.         clr PulseEdgeCtrH
  215.  
  216.         Counter_End:
  217.         rcall NumberToDigits
  218.  
  219.  
  220.  
  221.         SET_DIGIT 0
  222.         SET_DIGIT 1
  223.         SET_DIGIT 2
  224.         SET_DIGIT 3
  225.  
  226.         pop R22
  227.         pop R21
  228.         pop R20
  229.  
  230. rjmp Main_Loop