Advertisement
Guest User

Untitled

a guest
Jan 30th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. //////////////////////////////////////////////////////////////////////////////
  3. // Laboratory AVR Microcontrollers Part2
  4. // Program template for lab 9
  5. // Authors: Marcin Łesek
  6. //
  7. // Group: 2
  8. // Section: 1
  9. //
  10. // Task: Podsekcja 6
  11. // Atmega128 16MHz
  12. // Do portu a podlaczone jest 8 przyciskow zwierajacych ten port do masy, do portu b podlsczone jest 8 diod swiecacych przez rezystor do masy, pozostale porty sa wyjsciowe
  13. // Gdzies w pamieci programu znajduje sie tablica o nazwie ROM_TAB o nieznanej dlugosci ale zakonczona slowem o wartosci zero (dwa bajty o wartosci 0) nie naleza do tablicy, sa straznikiem konca
  14. // Gdzies znajduje sie druga tablica o nazwie RAM_TAB o znanej dlugosci nie wiekszej niz 512 bajtow
  15. //
  16. // Todo: Po nacisnieciu dowolnego przycisku, kopiowanie 1 bajtu z tablicy ROM do RAM, program przechodzi przez tablice dwukrotnie.
  17. //
  18. // Version: 3.0
  19. //////////////////////////////////////////////////////////////////////////////
  20. .nolist ;quartz assumption 4Mhz
  21. .include "m128def.inc"
  22. ;//////////////////////////////////////////////////////////////////////////////
  23. .list
  24. .equ xlength = 512
  25. ;//////////////////////////////////////////////////////////////////////////////
  26. ; EEPROM - data non volatile memory segment
  27. .ESEG
  28.  
  29. ;//////////////////////////////////////////////////////////////////////////////
  30. ; StaticRAM - data memory.segment
  31. .DSEG
  32. .ORG 0x200; may be omitted this is default value
  33. ; Destination table (xlengthx bytes).
  34. ; Replace "xlengthx" with correct value
  35. RAM_TAB: .BYTE xlength
  36.  
  37. ;//////////////////////////////////////////////////////////////////////////////
  38. ; CODE - Program memory segment
  39. ; Please Remember that it is "word" address space
  40. ;
  41. .CSEG
  42. .org 0x0000 ; may be omitted this is default value
  43. jmp RESET   ; Reset Handler
  44.  
  45. ; Interrupts vector table / change to your procedure only when needed
  46. jmp EXT_INT0    ; IRQ0 Handler
  47. jmp EXT_INT1    ; IRQ1 Handler
  48. jmp EXT_INT2    ; IRQ2 Handler
  49. jmp EXT_INT3    ; IRQ3 Handler
  50. jmp EXT_INT4    ; IRQ4 Handler
  51. jmp EXT_INT5    ; IRQ5 Handler
  52. jmp EXT_INT6    ; IRQ6 Handler
  53. jmp EXT_INT7    ; IRQ7 Handler
  54. jmp TIM2_COMP   ; Timer2 Compare Handler
  55. jmp TIM2_OVF    ;Timer2 Overflow Handler
  56. jmp TIM1_CAPT   ;Timer1 Capture Handler
  57. jmp TIM1_C0MPA  ;Timer1 CompareA Handler
  58. jmp TIM1_C0MPB  ;Timer1 CompareB Handler
  59. jmp TIM1_0VF    ;Timer1 Overflow Handler
  60. jmp TIM0_COMP   ;Timer0 Compare Handler
  61. jmp TIM0_OVF    ;Timer0 Overflow Handler
  62. jmp SPI_STC     ;SPI Transfer Complete Handler
  63. jmp USART0_RXC  ;USART0 RX Complete Handler
  64. jmp USART0_DRE  ;USART0,UDR Empty Handler
  65. jmp USART0_TXC  ;USART0 TX Complete Handler
  66. jmp ADC1    ;ADC Conversion Complete Handler
  67. jmp EE_RDY  ;EEPROM Ready Handler
  68. jmp ANA_COMP    ;Analog Comparator Handler
  69. jmp TIM1_C0MPC  ;Timer1 CompareC Handler
  70. jmp TIM3_CAPT   ;Timer3 Capture Handler
  71. jmp TIM3_COMPA  ;Timer3 CompareA Handler
  72. jmp TIM3_COMPB  ; Timer3 CompareB Handler
  73. jmp TIM3_COMPC  ;Timer3 CompareC Handler
  74. jmp TIM3_OVF    ;Timer3 Overflow Handler
  75. jmp USART1_RXC  ;USART1 RX Complete Handler
  76. jmp USART1_DRE  ;USART1,UDR Empty Handler
  77. jmp USART1_TXC  ;USART1 TX Complete Handler
  78. jmp TWI     ;Two-wire Serial Interface Interrupt Handler
  79. jmp SPM_RDY     ;SPM Ready Handler
  80.  
  81. ;//////////////////////////////////////////////////////////////////////////////
  82. EXT_INT0:   ; IRQ0 Handler
  83. EXT_INT1:   ; IRQ1 Handler
  84. EXT_INT2:   ; IRQ2 Handler
  85. EXT_INT3:   ; IRQ3 Handler
  86. EXT_INT4:   ; IRQ4 Handler
  87. EXT_INT5:   ; IRQ5 Handler
  88. EXT_INT6:   ; IRQ6 Handler
  89. EXT_INT7:   ; IRQ7 Handler
  90. TIM2_COMP:  ; Timer2 Compare Handler
  91. TIM2_OVF: ;Timer2 Overflow Handler
  92. TIM1_CAPT: ;Timer1 Capture Handler
  93. TIM1_C0MPA: ;Timer1 CompareA Handler
  94. TIM1_C0MPB: ;Timer1 CompareB Handler
  95. TIM1_0VF: ;Timer1 Overflow Handler
  96. TIM0_COMP: ;Timer0 Compare Handler
  97. TIM0_OVF: ;Timer0 Overflow Handler
  98. SPI_STC: ;SPI Transfer Complete Handler
  99. USART0_RXC: ;USART0 RX Complete Handler
  100. USART0_DRE: ;USART0,UDR Empty Handler
  101. USART0_TXC: ;USART0 TX Complete Handler
  102. ADC1: ;ADC Conversion Complete Handler
  103. EE_RDY: ;EEPROM Ready Handler
  104. ANA_COMP: ;Analog Comparator Handler
  105. TIM1_C0MPC: ;Timer1 CompareC Handler
  106. TIM3_CAPT: ;Timer3 Capture Handler
  107. TIM3_COMPA: ;Timer3 CompareA Handler
  108. TIM3_COMPB: ; Timer3 CompareB Handler
  109. TIM3_COMPC: ;Timer3 CompareC Handler
  110. TIM3_OVF: ;Timer3 Overflow Handler
  111. USART1_RXC: ;USART1 RX Complete Handler
  112. USART1_DRE: ;USART1,UDR Empty Handler
  113. USART1_TXC: ;USART1 TX Complete Handler
  114. TWI: ;Two-wire Serial Interface Interrupt Handler
  115. SPM_RDY: ;SPM Ready Handler
  116. reti        ; return from all no used
  117.  
  118. ;//////////////////////////////////////////////////////////////////////////////
  119. ; Program start
  120. reset:
  121. ;porownanie wielkosci tablicy z maksymalna wartoscia w zalozeniach - 512
  122. ldi r16, high(xlength)
  123. ldi r18, low(xlength)
  124. ldi r17, high(513)
  125. ldi r19, low(513)
  126. cp r18, r19
  127. cpc r16, r17
  128. brsh programEnd ;gdy wieksze lub rowne 513 to konczymy dzialanie
  129.  
  130. ldi r16, 0xFF ;ladujemy 11111111 binarnie
  131. out DDRA, r16 ;ustawiamy port A jako wyjscie ( diody )
  132. ldi r16, 0x00 ;ladujemy 0
  133. out DDRB, r16 ;ustawiamy port B jako wejscie
  134. ldi r16, 0xFF ;8 jedynek do r16
  135. out PORTB, r16 ;podciagamy port B do vcc (zalozenie, ze sa rezystory podciagajace)
  136.  
  137.  
  138. ldi r16, byte3(ROM_TAB<<1) ;do r16 przesylamy 3 bajt adresu
  139. out RAMPZ, r16 ;do rampz wrzucamy ten bajt, rampz idzie w parze z ZL i ZH dlatego tam wrzucamy pozostala czesc adresu
  140. ldi r30, low(ROM_TAB<<1) ;do r30 ( ZL ) idzie mlodsza czesc adresu
  141. ldi r31, high(ROM_TAB<<1) ;do rd1 ( ZH ) idzie starsza czesc adresu
  142.  
  143. ;ladujemy adres tablicy RAM do pary rejestrów YH:YL
  144. ldi r28, low(RAM_TAB<<1) ;rejestr YH, mlodsza czesc adresu
  145. ldi r29, high(RAM_TAB<<1);rejestr YL, starsza czesc adresu
  146.  
  147. ;jako, ze tablica moze miec wiecej niz 255 elementów to dzielimy liczbe na 2 czesci
  148. ldi XL, low(xlength) ;do xl idzie mlodsza czesc liczby, obsluga ilosci do 255
  149. ldi XH, high(xlength) ;jesli liczba wieksza niz 255, to tutaj sie zapisze jej wyzsze bity
  150.  
  151. waitForButton: ;czekamy dopóki nie zostanie wcisniety jeden guzik (jest ich 8)
  152. in r16, PINB ;wczytanie wartosci stanów logicznych na wejsciu portu B do r16
  153. cpi r16, 0xFF ;sprawdzamy wcisniecie guzika
  154. breq waitForButton ;jesli nie to czekaj tak dlugo, az ktos wcisnie
  155.  
  156. copyRAMtoROM:
  157. elpm r16, Z+ ;24 bitowy adres by bylo wiecej niz 64kB
  158. cpi r16, 0x00 ;sprawdzamy czy wartosc nie jest 0x00
  159. brne copyByte ;jeseli nie to kopiujemy bajt
  160. elpm r16, Z ;jesli bylo Z, to ladujemy adres kolejnej komórki
  161. cpi r16, 0x00 ;sprawdzamy czy wartosc nie jest 0x00
  162. breq programEnd ;jezeli sa równe to koniec, bo wystapil straznik
  163. sbiw Z,1 ;jezeli nie sa równe, czyli 0x00 nalezy do tablicy to cofamy sie z powrotem do komórki która sprawdzalismy
  164. elpm r16,Z+ ;ladujemy adres tej komórki i inkrementujemy przejscie do kolejnej
  165.  
  166. copyByte:
  167. st Y+,r16 ;kopiujemy wartosc i przechodzimy do kolejnej komórki tablicy RAM
  168. sbiw X, 1 ;w X mamy ilość powtórzęe, jako ze raz juz przekopiowalismy to dekrementujemy ta wartosc
  169.  
  170. ;teraz sprawdzenie licznika, jako ze wartosci moze byc wiecej niz 255 (256 z tresci zadania)
  171. cpi XL, 0 ;sprawdzenie młodszej czesci
  172. brne waitForButton ;jezeli !=0 to kopiuje dalej
  173. cpi XH, 0 ;sprawdzenie starszej części
  174. breq programEnd ;jesli mniejsza od 0 to koniec
  175. brne waitForButton;jesli wieksza od 0, to kopiujemy dalej
  176.  
  177. ;------------------------------------------------------------------------------
  178. ; Program end - Ending loop
  179. ;------------------------------------------------------------------------------
  180. programEnd:
  181. rjmp programEnd
  182.  
  183. ;------------------------------------------------------------------------------
  184. ; Table Declaration - place here test values
  185. ; Test with different table values and different begin addresses of table (als above 0x8000)
  186. ;
  187. ROM_TAB: .db 0x01,0x02,0x03,0x04,0x00,0x00
  188. .EXIT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement