Dany1858

atmega: esercizio 1

Jul 1st, 2019
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .include "8535def.inc"  ;nomi registri
  2.  
  3. .CSEG           ;mem prog
  4. .ORG 0x000
  5.     rjmp    RESET       ;reset  0x000
  6.     rjmp    int_0_int   ;int0   0x001
  7.     reti                ;int1   0x002
  8.     reti                ;tim2 comp  0x003
  9.     reti                ;tim2 ovf   0x004
  10.     reti                ;tim1 capt  0x005
  11.     reti                ;tim1 compB 0x006
  12.     reti                ;tim1 compA 0x007
  13.     reti                ;tim1 ovf   0x008
  14.     reti                ;tim0 ovf   0x009
  15.     reti                ;SPI STC    0x00A
  16.     reti                ;UART RX    0x00B
  17.     reti                ;UART UDRE  0x00C
  18.     reti                ;UART TX    0x00D
  19.     reti                ;ADC    0x00E
  20.     reti                ;EE_RDY 0x00F
  21.     reti                ;ANA_COMP   0x010
  22.  
  23. DOVE:.DW 0b0010010100110010
  24.  
  25. RESET:
  26.     ldi r16, LOW(RAMEND)
  27.     out SPL, r16
  28.     ldi r16, HIGH(RAMEND)
  29.     out SPH, r16
  30.  
  31. MAIN:
  32.     sei
  33.     push r17
  34.     ;configuro int0 e sleep mode
  35.     in r17, MCUCR
  36.     ori r17, 0b01000011     ;set SE & int0 rising
  37.     out MCUCR, r17
  38.     in r17, GIMSK
  39.     ori r17, 0b01000000     ;enable int0
  40.     out GIMSK, r17
  41.     ;configuro porte A e B
  42.     ser r17
  43.     out DDRA, r17
  44.     out DDRB, r17
  45.     out DDRC, r17
  46.     ;wait
  47.     sleep
  48.     pop r17
  49.     ret
  50.  
  51. int_0_int:  ;devo contare coppie di '10'
  52.     push r17
  53.     push r18   
  54.     push r19
  55.     push r20
  56.     push r21
  57.     push r22
  58.     ;indirizzo in z per lpm
  59.     ldi ZL, low(DOVE*2) ;Word addressing
  60.     ldi ZH, high(DOVE*2)
  61.     lpm
  62.     mov r17, r0
  63.     ;resetto tutto
  64.     clr r18     ;contatore loop
  65.     clr r19     ;contatore coppie
  66.     clr r20     ;res
  67.     clr r21     ;temp
  68.     clr r22     ;res
  69.     out PORTA, r18
  70.     out PORTB, r18
  71.     ;via al conteggio
  72.     mov r21 ,r17
  73.     mov r22, ZL
  74.     inc r22
  75.     loop:
  76.         andi r21, 0x03  ;considero solo ultimi due bit
  77.         cpi r21, 0x02   ;uguale 10?
  78.         breq n_inc      ;n++
  79.     ritorna:
  80.         lsr r17         ;shift right
  81.         inc r18         ;contatore++
  82.         cpi r18, 0x08   ;7 confronti
  83.         brne loop
  84.     cp r22, ZL
  85.     breq fattoriale
  86.     inc ZL          ;parte alta di Z
  87.     lpm     ;carico parte alta di DOVE
  88.     mov r17, r0
  89.     mov r21 ,r17
  90.     clr r18
  91.     rjmp loop
  92.  
  93. n_inc:
  94.     cpi r19, 0xFF       ;se contatore pieno err
  95.     breq err
  96.     inc r19
  97.     rjmp ritorna
  98.  
  99.  
  100. fattoriale:
  101.     mov r17, r19    ;r17 contatore loop temp
  102.     mov r18, r19    ;r18 contatore loop
  103.     mov r21, r19    ;r21 somma
  104.     mov r22, r19    ;r22 valore attuale
  105.     loopL:
  106.         add r19, r21
  107.         adc r20, r22        ;sommo i riporti
  108.         dec r17
  109.         cpi r17, 0x00
  110.         breq loopH
  111.         brlt err
  112.         rjmp loopL
  113.     loopH:
  114.         mov r21, r19
  115.         dec r18
  116.         cpi r18, 0x01
  117.         breq print
  118.         mov r17, r18                ;fattoriale fa 5+5+5+5=20+20+20=60+60
  119.  
  120. print:
  121.     out PORTA, r19
  122.     out PORTB, r20
  123.    
  124.  
  125.  
  126.     pop r22
  127.     pop r21
  128.     pop r20
  129.     pop r19
  130.     pop r18
  131.     pop r17
  132.     rjmp RESET
  133.  
  134. err:
  135.     ldi r17, 0xFF
  136.     out PORTC, r17
  137.     pop r22
  138.     pop r21
  139.     pop r20
  140.     pop r19
  141.     pop r18
  142.     pop r17
  143.     rjmp RESET
Add Comment
Please, Sign In to add comment