Advertisement
Guest User

Untitled

a guest
Nov 6th, 2018
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  ;### MACROS & defs (.equ)###
  2.  
  3. ; Macro LOAD_CONST loads given registers with immediate value, example: LOAD_CONST  R16,R17 1234
  4. .MACRO LOAD_CONST  
  5.     LDI @0, LOW(@2)
  6.     LDI @1, HIGH (@2)
  7. .ENDMACRO
  8.  
  9. /*** Display ***/
  10. .equ DigitsPort = PORTB
  11. .equ SegmentsPort = PORTD
  12. .equ DisplayRefreshPeriod = 5 ; W MS
  13.  
  14. ; SET_DIGIT diplay digit of a number given in macro argument, example: SET_DIGIT 2
  15. .MACRO SET_DIGIT  
  16.  
  17.     PUSH R16
  18.     PUSH R17
  19.  
  20.     LDI R16, (0b0001_0000>>@0)
  21.     OUT PORTB, R16
  22.     MOV R16, Dig_@0
  23.     RCALL DigitTo7segCode
  24.     LOAD_CONST R16,R17,DisplayRefreshPeriod
  25.     RCALL DealyInMs
  26.  
  27.     POP R17
  28.     POP R16
  29.  
  30. .ENDMACRO
  31.  
  32. ; ### GLOBAL VARIABLES ###
  33.  
  34. .def PulseEdgeCtrL=R0
  35. .def PulseEdgeCtrH=R1
  36.  
  37. .def Dig_0=R2
  38. .def Dig_1=R3
  39. .def Dig_2=R4
  40. .def Dig_3=R5
  41.  
  42. ; ### INTERRUPT VECTORS ###
  43. .cseg      
  44.  
  45. .org     0      rjmp    _main
  46. .org OC1Aaddr   rjmp  _Timer_ISR
  47. .org PCIBaddr   rjmp  _ExtInt_ISR
  48.  
  49. ; ### INTERRUPT SEERVICE ROUTINES ###
  50.  
  51. _ExtInt_ISR:
  52.  
  53.     PUSH R16
  54.     IN R16, SREG
  55.     PUSH R16
  56.     PUSH R24
  57.     PUSH R25
  58.  
  59.     MOVW R25:R24, PulseEdgeCtrH:PulseEdgeCtrl
  60.     ADIW R25:R24, 1
  61.     MOVW PulseEdgeCtrH:PulseEdgeCtrl, R25:R24
  62.  
  63.     POP R25
  64.     POP R24
  65.     POP R16
  66.     OUT SREG, R16
  67.     POP R16
  68.  
  69. reti    
  70.  
  71. _Timer_ISR:
  72.  
  73.     PUSH R16
  74.     IN R16, SREG
  75.     PUSH R16
  76.     push R17
  77.     push R18
  78.     push R19
  79.  
  80.     MOVW R17:R16, PulseEdgeCtrH:PulseEdgeCtrl
  81.     LSR R17
  82.     ROR R16
  83.  
  84.     CLR PulseEdgeCtrH
  85.     CLR PulseEdgeCtrl
  86.  
  87.     MOV Dig_0, R16
  88.     MOV Dig_0, R17
  89.     MOV Dig_0, R18
  90.     MOV Dig_0, R19
  91.  
  92.     pop R19
  93.     pop R18
  94.     pop R17
  95.     POP R16
  96.     OUT SREG, R16
  97.     POP R16
  98.  
  99.   reti
  100.  
  101. ; ### MAIN PROGAM ###
  102.  
  103. _main:
  104.     ; *** Initialisations ***
  105.  
  106.     ;--- Ext. ints --- PB0
  107.     LDI R18, 0b0010_0000
  108.     OUT GIMSK, R18
  109.     LDI R18, 0b0000_0001
  110.     OUT PCMSK0, R18
  111.  
  112.     ;--- Timer1 --- CTC with 256 prescaller
  113.     LDI R16, 0
  114.     OUT TCCR1A, R16
  115.     LDI R16, 0b0000_1100
  116.     OUT TCCR1B, R16
  117.     LOAD_CONST R16, R17, 31249
  118.     OUT OCR1AH, R16
  119.     OUT OCR1AL, R17
  120.     LDI R16,0b0100_0000
  121.     OUT TIMSK, R16
  122.            
  123.     ;---  Display  ---
  124.     LDI R18, 0b0001_1110
  125.     OUT DDRB, R18
  126.     LDI R18, 0b0111_1111
  127.     OUT DDRD, R18
  128.  
  129.     ; --- enable gloabl interrupts
  130.     SEI
  131.  
  132. MainLoop:   ; presents Digit0-3 variables on a Display
  133.             SET_DIGIT 0
  134.             SET_DIGIT 1
  135.             SET_DIGIT 2
  136.             SET_DIGIT 3
  137.  
  138.             RJMP MainLoop
  139.  
  140. ; ### SUBROUTINES ###
  141.  
  142. ;*** NumberToDigits ***
  143. ;converts number to coresponding digits
  144. ;input/otput: R16-17/R16-19
  145. ;internals: X_R,Y_R,Q_R,R_R - see _Divider
  146.  
  147. ; internals
  148. .def Dig0=R22 ; Digits temps
  149. .def Dig1=R23 ;
  150. .def Dig2=R24 ;
  151. .def Dig3=R25 ;
  152.  
  153. _NumberToDigits:
  154.  
  155.     push Dig0
  156.     push Dig1
  157.     push Dig2
  158.     push Dig3
  159.     PUSH R17
  160.     PUSH R16
  161.  
  162.     ; thousands
  163.     LOAD_CONST R16,R17,1000
  164.     RCALL _Divide
  165.     MOV Dig3, QL
  166.  
  167.     ; hundreads
  168.     LOAD_CONST R16,R17,100
  169.     RCALL _Divide
  170.     MOV Dig2, QL    
  171.  
  172.     ; tens
  173.     LOAD_CONST R16,R17,10
  174.     RCALL _Divide
  175.     MOV Dig1, QL    
  176.  
  177.     ; ones
  178.     MOV Dig0, RL
  179.  
  180.     ; otput result
  181.     mov R16,Dig0
  182.     mov R17,Dig1
  183.     mov R18,Dig2
  184.     mov R19,Dig3
  185.  
  186.     POP R16
  187.     POP R17
  188.     pop Dig3
  189.     pop Dig2
  190.     pop Dig1
  191.     pop Dig0
  192.  
  193.     ret
  194.  
  195. ;*** Divide ***
  196. ; divide 16-bit nr by 16-bit nr; X/Y -> Qotient,Reminder
  197. ; Input/Output: R16-19, Internal R24-25
  198.  
  199. ; inputs
  200. .def XL=R16 ; divident  
  201. .def XH=R17
  202.  
  203. .def YL=R18 ; divider
  204. .def YH=R19
  205.  
  206. ; outputs
  207.  
  208. .def RL=R16 ; reminder
  209. .def RH=R17
  210.  
  211. .def QL=R18 ; quotient
  212. .def QH=R19
  213.  
  214. ; internal
  215. .def QCtrL=R24
  216. .def QCtrH=R25
  217.  
  218. _Divide:
  219.  
  220.         push R24 ;save internal variables on stack
  221.         push R25
  222.        
  223.         CLR QCtrH
  224.         CLR QCtrL
  225.         CP XH, YH
  226.         CPC XL, YL
  227.         BRLO DIEND
  228.  
  229.         DIELOOP:
  230.             SUB XH, YH
  231.             SBC XL, YL
  232.             ADIW QCtrH:QCtrL, 1
  233.             CP XH, YH
  234.             CPC XL, YL
  235.             BRSH DIELOOP
  236.  
  237.         DIEND:
  238.  
  239.         MOVW QH:QL, QCtrH:QCtrL
  240.  
  241.         pop R25 ; pop internal variables from stack
  242.         pop R24
  243.  
  244.         ret
  245.  
  246. ; *** DigitTo7segCode ***
  247. ; In/Out - R16
  248.  
  249. Table: .db 0x3f,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0xff,0x6f
  250.  
  251. DigitTo7segCode:
  252.  
  253. push R30
  254. push R31
  255.  
  256. LDI R30, LOW(Table<<1)
  257. LDI R31, HIGH(Table<<1)
  258.  
  259. ADD R30,R16
  260. CLR R16
  261. ADC R31,R16
  262.  
  263. LPM R16, Z
  264.  
  265. pop R31
  266. pop R30
  267.  
  268. ret
  269.  
  270. ; *** DelayInMs ***
  271. ; In: R16,R17
  272. DealyInMs:  
  273.             push R24
  274.             push R25
  275.  
  276.             MOVW R25:R24, R17:R16
  277.  
  278.             DELOOP:
  279.                 RCALL OneMsLoop
  280.                 SBIW R25:R24, 1
  281.                 BRBC 1, DELOOP
  282.  
  283.             pop R25
  284.             pop R24
  285.  
  286.             ret
  287.  
  288. ; *** OneMsLoop ***
  289. OneMsLoop: 
  290.             push R24
  291.             push R25
  292.            
  293.             LOAD_CONST R24,R25,2000                    
  294.  
  295. L1:         SBIW R24:R25,1
  296.             BRNE L1
  297.  
  298.             pop R25
  299.             pop R24
  300.  
  301.             ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement