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, DLA 50HZ 20MS
- ; 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
- OUT PORTD, R16
- 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 ; segment pamięci kodu programu
- .org 0 rjmp _main ; skok do programu głównego
- .org OC1Aaddr rjmp _Timer_ISR
- .org PCIBaddr rjmp _ExtInt_ISR ; skok do procedury obsługi przerwania zenetrznego
- ; ### INTERRUPT SEERVICE ROUTINES ###
- _ExtInt_ISR: ; procedura obsługi przerwania zewnetrznego
- 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 ; powrót z procedury obsługi przerwania (reti zamiast ret)
- _Timer_ISR:
- push R16
- in r16, sreg
- push r16
- push R17
- push R18
- push R19
- movw r17:r16, PulseEdgeCtrH:PulseEdgeCtrL
- LSR R17
- ROR R16
- rcall _NumberToDigits
- CLR PulseEdgeCtrH
- CLR PulseEdgeCtrL
- mov Dig_0, r16
- mov Dig_1, r17
- mov Dig_2, r18
- mov Dig_3, 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,R17
- OUT OCR1AL,R16
- LDI R16, 0b0100_0000
- OUT TIMSK, R16
- ;--- Display ---
- LDI R18, 0b0111_1111
- OUT DDRD,R18
- LDI R18, 0b0001_1110
- OUT DDRB,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
- ; thousands
- LOAD_CONST R18,R19,1000
- RCALL _Divide
- mov Dig3, QL
- ; hundreads
- LOAD_CONST R18,R19,100
- RCALL _Divide
- mov Dig2, QL
- ; tens
- LOAD_CONST R18,R19,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 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 qctrL
- clr qctrH
- cp XL,YL
- cpc XH, YH
- brlo divideend
- loopd:
- sub xl,yl
- sbc xh,yh
- adiw QctrH:QCtrL, 1
- cp xl,yl
- cpc xh,yh
- brsh loopd
- divideend:
- 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
- LOOP:
- RCALL OneMsLoop
- SBIW R25:R24, 1
- BRBC 1, LOOP
- 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