Advertisement
Guest User

Untitled

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