Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include "8535def.inc" ;nomi registri
- .CSEG ;mem prog
- .ORG 0x000
- rjmp RESET ;reset 0x000
- rjmp int_0_int ;int0 0x001
- reti ;int1 0x002
- reti ;tim2 comp 0x003
- reti ;tim2 ovf 0x004
- reti ;tim1 capt 0x005
- reti ;tim1 compB 0x006
- reti ;tim1 compA 0x007
- reti ;tim1 ovf 0x008
- reti ;tim0 ovf 0x009
- reti ;SPI STC 0x00A
- reti ;UART RX 0x00B
- reti ;UART UDRE 0x00C
- reti ;UART TX 0x00D
- reti ;ADC 0x00E
- reti ;EE_RDY 0x00F
- reti ;ANA_COMP 0x010
- DOVE:.DW 0b0010010100110010
- RESET:
- ldi r16, LOW(RAMEND)
- out SPL, r16
- ldi r16, HIGH(RAMEND)
- out SPH, r16
- MAIN:
- sei
- push r17
- ;configuro int0 e sleep mode
- in r17, MCUCR
- ori r17, 0b01000011 ;set SE & int0 rising
- out MCUCR, r17
- in r17, GIMSK
- ori r17, 0b01000000 ;enable int0
- out GIMSK, r17
- ;configuro porte A e B
- ser r17
- out DDRA, r17
- out DDRB, r17
- out DDRC, r17
- ;wait
- sleep
- pop r17
- ret
- int_0_int: ;devo contare coppie di '10'
- push r17
- push r18
- push r19
- push r20
- push r21
- push r22
- ;indirizzo in z per lpm
- ldi ZL, low(DOVE*2) ;Word addressing
- ldi ZH, high(DOVE*2)
- lpm
- mov r17, r0
- ;resetto tutto
- clr r18 ;contatore loop
- clr r19 ;contatore coppie
- clr r20 ;res
- clr r21 ;temp
- clr r22 ;res
- out PORTA, r18
- out PORTB, r18
- ;via al conteggio
- mov r21 ,r17
- mov r22, ZL
- inc r22
- loop:
- andi r21, 0x03 ;considero solo ultimi due bit
- cpi r21, 0x02 ;uguale 10?
- breq n_inc ;n++
- ritorna:
- lsr r17 ;shift right
- inc r18 ;contatore++
- cpi r18, 0x08 ;7 confronti
- brne loop
- cp r22, ZL
- breq fattoriale
- inc ZL ;parte alta di Z
- lpm ;carico parte alta di DOVE
- mov r17, r0
- mov r21 ,r17
- clr r18
- rjmp loop
- n_inc:
- cpi r19, 0xFF ;se contatore pieno err
- breq err
- inc r19
- rjmp ritorna
- fattoriale:
- mov r17, r19 ;r17 contatore loop temp
- mov r18, r19 ;r18 contatore loop
- mov r21, r19 ;r21 somma
- mov r22, r19 ;r22 valore attuale
- loopL:
- add r19, r21
- adc r20, r22 ;sommo i riporti
- dec r17
- cpi r17, 0x00
- breq loopH
- brlt err
- rjmp loopL
- loopH:
- mov r21, r19
- dec r18
- cpi r18, 0x01
- breq print
- mov r17, r18 ;fattoriale fa 5+5+5+5=20+20+20=60+60
- print:
- out PORTA, r19
- out PORTB, r20
- pop r22
- pop r21
- pop r20
- pop r19
- pop r18
- pop r17
- rjmp RESET
- err:
- ldi r17, 0xFF
- out PORTC, r17
- pop r22
- pop r21
- pop r20
- pop r19
- pop r18
- pop r17
- rjmp RESET
Add Comment
Please, Sign In to add comment