Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;### MACROS & defs (.equ)###
- ; Macro LOAD_CONST loads given registers with immediate value, example: LOAD_CONST R16,R17 1234
- .MACRO LOAD_CONST
- LDI @0, LOW(@2)
- LDI @1, HIGH (@2)
- .ENDMACRO
- /*** Display ***/
- .equ DigitsPort = PORTB
- .equ SegmentsPort = PORTD
- .equ DisplayRefreshPeriod = 5 ; W MS
- ; SET_DIGIT diplay digit of a number given in macro argument, example: SET_DIGIT 2
- .MACRO SET_DIGIT
- PUSH R16
- PUSH R17
- LDI R16, (0b0001_0000>>@0)
- OUT PORTB, R16
- MOV R16, Dig_@0
- RCALL DigitTo7segCode
- LOAD_CONST R16,R17,DisplayRefreshPeriod
- RCALL DealyInMs
- POP R17
- POP R16
- .ENDMACRO
- ; ### GLOBAL VARIABLES ###
- .def PulseEdgeCtrL=R0
- .def PulseEdgeCtrH=R1
- .def Dig_0=R2
- .def Dig_1=R3
- .def Dig_2=R4
- .def Dig_3=R5
- ; ### INTERRUPT VECTORS ###
- .cseg
- .org 0 rjmp _main
- .org OC1Aaddr rjmp _Timer_ISR
- .org PCIBaddr rjmp _ExtInt_ISR
- ; ### INTERRUPT SEERVICE ROUTINES ###
- _ExtInt_ISR:
- PUSH R16
- IN R16, SREG
- PUSH R16
- PUSH R24
- PUSH R25
- MOVW R25:R24, PulseEdgeCtrH:PulseEdgeCtrl
- ADIW R25:R24, 1
- MOVW PulseEdgeCtrH:PulseEdgeCtrl, R25:R24
- POP R25
- POP R24
- POP R16
- OUT SREG, R16
- POP R16
- reti
- _Timer_ISR:
- PUSH R16
- IN R16, SREG
- PUSH R16
- push R17
- push R18
- push R19
- MOVW R17:R16, PulseEdgeCtrH:PulseEdgeCtrl
- LSR R17
- ROR R16
- CLR PulseEdgeCtrH
- CLR PulseEdgeCtrl
- MOV Dig_0, R16
- MOV Dig_0, R17
- MOV Dig_0, R18
- MOV Dig_0, R19
- pop R19
- pop R18
- pop R17
- POP R16
- OUT SREG, R16
- POP R16
- reti
- ; ### MAIN PROGAM ###
- _main:
- ; *** Initialisations ***
- ;--- Ext. ints --- PB0
- LDI R18, 0b0010_0000
- OUT GIMSK, R18
- LDI R18, 0b0000_0001
- OUT PCMSK0, R18
- ;--- Timer1 --- CTC with 256 prescaller
- LDI R16, 0
- OUT TCCR1A, R16
- LDI R16, 0b0000_1100
- OUT TCCR1B, R16
- LOAD_CONST R16, R17, 31249
- OUT OCR1AH, R16
- OUT OCR1AL, R17
- LDI R16,0b0100_0000
- OUT TIMSK, R16
- ;--- Display ---
- LDI R18, 0b0001_1110
- OUT DDRB, R18
- LDI R18, 0b0111_1111
- OUT DDRD, R18
- ; --- enable gloabl interrupts
- SEI
- MainLoop: ; presents Digit0-3 variables on a Display
- SET_DIGIT 0
- SET_DIGIT 1
- SET_DIGIT 2
- SET_DIGIT 3
- RJMP MainLoop
- ; ### SUBROUTINES ###
- ;*** NumberToDigits ***
- ;converts number to coresponding digits
- ;input/otput: R16-17/R16-19
- ;internals: X_R,Y_R,Q_R,R_R - see _Divider
- ; internals
- .def Dig0=R22 ; Digits temps
- .def Dig1=R23 ;
- .def Dig2=R24 ;
- .def Dig3=R25 ;
- _NumberToDigits:
- push Dig0
- push Dig1
- push Dig2
- push Dig3
- PUSH R17
- PUSH R16
- ; thousands
- LOAD_CONST R16,R17,1000
- RCALL _Divide
- MOV Dig3, QL
- ; hundreads
- LOAD_CONST R16,R17,100
- RCALL _Divide
- MOV Dig2, QL
- ; tens
- LOAD_CONST R16,R17,10
- RCALL _Divide
- MOV Dig1, QL
- ; ones
- MOV Dig0, RL
- ; otput result
- mov R16,Dig0
- mov R17,Dig1
- mov R18,Dig2
- mov R19,Dig3
- POP R16
- POP R17
- pop Dig3
- pop Dig2
- pop Dig1
- pop Dig0
- ret
- ;*** Divide ***
- ; divide 16-bit nr by 16-bit nr; X/Y -> Qotient,Reminder
- ; Input/Output: R16-19, Internal R24-25
- ; inputs
- .def XL=R16 ; divident
- .def XH=R17
- .def YL=R18 ; divider
- .def YH=R19
- ; outputs
- .def RL=R16 ; reminder
- .def RH=R17
- .def QL=R18 ; quotient
- .def QH=R19
- ; internal
- .def QCtrL=R24
- .def QCtrH=R25
- _Divide:
- push R24 ;save internal variables on stack
- push R25
- CLR QCtrH
- CLR QCtrL
- CP XH, YH
- CPC XL, YL
- BRLO DIEND
- DIELOOP:
- SUB XH, YH
- SBC XL, YL
- ADIW QCtrH:QCtrL, 1
- CP XH, YH
- CPC XL, YL
- BRSH DIELOOP
- DIEND:
- MOVW QH:QL, QCtrH:QCtrL
- pop R25 ; pop internal variables from stack
- pop R24
- ret
- ; *** DigitTo7segCode ***
- ; In/Out - R16
- Table: .db 0x3f,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0xff,0x6f
- DigitTo7segCode:
- push R30
- push R31
- LDI R30, LOW(Table<<1)
- LDI R31, HIGH(Table<<1)
- ADD R30,R16
- CLR R16
- ADC R31,R16
- LPM R16, Z
- pop R31
- pop R30
- ret
- ; *** DelayInMs ***
- ; In: R16,R17
- DealyInMs:
- push R24
- push R25
- MOVW R25:R24, R17:R16
- DELOOP:
- RCALL OneMsLoop
- SBIW R25:R24, 1
- BRBC 1, DELOOP
- pop R25
- pop R24
- ret
- ; *** OneMsLoop ***
- OneMsLoop:
- push R24
- push R25
- LOAD_CONST R24,R25,2000
- L1: SBIW R24:R25,1
- BRNE L1
- pop R25
- pop R24
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement