Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////////////////////////
- // Laboratory AVR Microcontrollers Part2
- // Program template for lab 9
- // Authors: Marcin Łesek
- //
- // Group: 2
- // Section: 1
- //
- // Task: Podsekcja 6
- // Atmega128 16MHz
- // 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
- // 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
- // Gdzies znajduje sie druga tablica o nazwie RAM_TAB o znanej dlugosci nie wiekszej niz 512 bajtow
- //
- // Todo: Po nacisnieciu dowolnego przycisku, kopiowanie 1 bajtu z tablicy ROM do RAM, program przechodzi przez tablice dwukrotnie.
- //
- // Version: 3.0
- //////////////////////////////////////////////////////////////////////////////
- .nolist ;quartz assumption 4Mhz
- .include "m128def.inc"
- ;//////////////////////////////////////////////////////////////////////////////
- .list
- .equ xlength = 512
- ;//////////////////////////////////////////////////////////////////////////////
- ; EEPROM - data non volatile memory segment
- .ESEG
- ;//////////////////////////////////////////////////////////////////////////////
- ; StaticRAM - data memory.segment
- .DSEG
- .ORG 0x200; may be omitted this is default value
- ; Destination table (xlengthx bytes).
- ; Replace "xlengthx" with correct value
- RAM_TAB: .BYTE xlength
- ;//////////////////////////////////////////////////////////////////////////////
- ; CODE - Program memory segment
- ; Please Remember that it is "word" address space
- ;
- .CSEG
- .org 0x0000 ; may be omitted this is default value
- jmp RESET ; Reset Handler
- ; Interrupts vector table / change to your procedure only when needed
- jmp EXT_INT0 ; IRQ0 Handler
- jmp EXT_INT1 ; IRQ1 Handler
- jmp EXT_INT2 ; IRQ2 Handler
- jmp EXT_INT3 ; IRQ3 Handler
- jmp EXT_INT4 ; IRQ4 Handler
- jmp EXT_INT5 ; IRQ5 Handler
- jmp EXT_INT6 ; IRQ6 Handler
- jmp EXT_INT7 ; IRQ7 Handler
- jmp TIM2_COMP ; Timer2 Compare Handler
- jmp TIM2_OVF ;Timer2 Overflow Handler
- jmp TIM1_CAPT ;Timer1 Capture Handler
- jmp TIM1_C0MPA ;Timer1 CompareA Handler
- jmp TIM1_C0MPB ;Timer1 CompareB Handler
- jmp TIM1_0VF ;Timer1 Overflow Handler
- jmp TIM0_COMP ;Timer0 Compare Handler
- jmp TIM0_OVF ;Timer0 Overflow Handler
- jmp SPI_STC ;SPI Transfer Complete Handler
- jmp USART0_RXC ;USART0 RX Complete Handler
- jmp USART0_DRE ;USART0,UDR Empty Handler
- jmp USART0_TXC ;USART0 TX Complete Handler
- jmp ADC1 ;ADC Conversion Complete Handler
- jmp EE_RDY ;EEPROM Ready Handler
- jmp ANA_COMP ;Analog Comparator Handler
- jmp TIM1_C0MPC ;Timer1 CompareC Handler
- jmp TIM3_CAPT ;Timer3 Capture Handler
- jmp TIM3_COMPA ;Timer3 CompareA Handler
- jmp TIM3_COMPB ; Timer3 CompareB Handler
- jmp TIM3_COMPC ;Timer3 CompareC Handler
- jmp TIM3_OVF ;Timer3 Overflow Handler
- jmp USART1_RXC ;USART1 RX Complete Handler
- jmp USART1_DRE ;USART1,UDR Empty Handler
- jmp USART1_TXC ;USART1 TX Complete Handler
- jmp TWI ;Two-wire Serial Interface Interrupt Handler
- jmp SPM_RDY ;SPM Ready Handler
- ;//////////////////////////////////////////////////////////////////////////////
- EXT_INT0: ; IRQ0 Handler
- EXT_INT1: ; IRQ1 Handler
- EXT_INT2: ; IRQ2 Handler
- EXT_INT3: ; IRQ3 Handler
- EXT_INT4: ; IRQ4 Handler
- EXT_INT5: ; IRQ5 Handler
- EXT_INT6: ; IRQ6 Handler
- EXT_INT7: ; IRQ7 Handler
- TIM2_COMP: ; Timer2 Compare Handler
- TIM2_OVF: ;Timer2 Overflow Handler
- TIM1_CAPT: ;Timer1 Capture Handler
- TIM1_C0MPA: ;Timer1 CompareA Handler
- TIM1_C0MPB: ;Timer1 CompareB Handler
- TIM1_0VF: ;Timer1 Overflow Handler
- TIM0_COMP: ;Timer0 Compare Handler
- TIM0_OVF: ;Timer0 Overflow Handler
- SPI_STC: ;SPI Transfer Complete Handler
- USART0_RXC: ;USART0 RX Complete Handler
- USART0_DRE: ;USART0,UDR Empty Handler
- USART0_TXC: ;USART0 TX Complete Handler
- ADC1: ;ADC Conversion Complete Handler
- EE_RDY: ;EEPROM Ready Handler
- ANA_COMP: ;Analog Comparator Handler
- TIM1_C0MPC: ;Timer1 CompareC Handler
- TIM3_CAPT: ;Timer3 Capture Handler
- TIM3_COMPA: ;Timer3 CompareA Handler
- TIM3_COMPB: ; Timer3 CompareB Handler
- TIM3_COMPC: ;Timer3 CompareC Handler
- TIM3_OVF: ;Timer3 Overflow Handler
- USART1_RXC: ;USART1 RX Complete Handler
- USART1_DRE: ;USART1,UDR Empty Handler
- USART1_TXC: ;USART1 TX Complete Handler
- TWI: ;Two-wire Serial Interface Interrupt Handler
- SPM_RDY: ;SPM Ready Handler
- reti ; return from all no used
- ;//////////////////////////////////////////////////////////////////////////////
- ; Program start
- reset:
- ;porownanie wielkosci tablicy z maksymalna wartoscia w zalozeniach - 512
- ldi r16, high(xlength)
- ldi r18, low(xlength)
- ldi r17, high(513)
- ldi r19, low(513)
- cp r18, r19
- cpc r16, r17
- brsh programEnd ;gdy wieksze lub rowne 513 to konczymy dzialanie
- ldi r16, 0xFF ;ladujemy 11111111 binarnie
- out DDRA, r16 ;ustawiamy port A jako wyjscie ( diody )
- ldi r16, 0x00 ;ladujemy 0
- out DDRB, r16 ;ustawiamy port B jako wejscie
- ldi r16, 0xFF ;8 jedynek do r16
- out PORTB, r16 ;podciagamy port B do vcc (zalozenie, ze sa rezystory podciagajace)
- ldi r16, byte3(ROM_TAB<<1) ;do r16 przesylamy 3 bajt adresu
- out RAMPZ, r16 ;do rampz wrzucamy ten bajt, rampz idzie w parze z ZL i ZH dlatego tam wrzucamy pozostala czesc adresu
- ldi r30, low(ROM_TAB<<1) ;do r30 ( ZL ) idzie mlodsza czesc adresu
- ldi r31, high(ROM_TAB<<1) ;do rd1 ( ZH ) idzie starsza czesc adresu
- ;ladujemy adres tablicy RAM do pary rejestrów YH:YL
- ldi r28, low(RAM_TAB<<1) ;rejestr YH, mlodsza czesc adresu
- ldi r29, high(RAM_TAB<<1);rejestr YL, starsza czesc adresu
- ;jako, ze tablica moze miec wiecej niz 255 elementów to dzielimy liczbe na 2 czesci
- ldi XL, low(xlength) ;do xl idzie mlodsza czesc liczby, obsluga ilosci do 255
- ldi XH, high(xlength) ;jesli liczba wieksza niz 255, to tutaj sie zapisze jej wyzsze bity
- waitForButton: ;czekamy dopóki nie zostanie wcisniety jeden guzik (jest ich 8)
- in r16, PINB ;wczytanie wartosci stanów logicznych na wejsciu portu B do r16
- cpi r16, 0xFF ;sprawdzamy wcisniecie guzika
- breq waitForButton ;jesli nie to czekaj tak dlugo, az ktos wcisnie
- copyRAMtoROM:
- elpm r16, Z+ ;24 bitowy adres by bylo wiecej niz 64kB
- cpi r16, 0x00 ;sprawdzamy czy wartosc nie jest 0x00
- brne copyByte ;jeseli nie to kopiujemy bajt
- elpm r16, Z ;jesli bylo Z, to ladujemy adres kolejnej komórki
- cpi r16, 0x00 ;sprawdzamy czy wartosc nie jest 0x00
- breq programEnd ;jezeli sa równe to koniec, bo wystapil straznik
- sbiw Z,1 ;jezeli nie sa równe, czyli 0x00 nalezy do tablicy to cofamy sie z powrotem do komórki która sprawdzalismy
- elpm r16,Z+ ;ladujemy adres tej komórki i inkrementujemy przejscie do kolejnej
- copyByte:
- st Y+,r16 ;kopiujemy wartosc i przechodzimy do kolejnej komórki tablicy RAM
- sbiw X, 1 ;w X mamy ilość powtórzęe, jako ze raz juz przekopiowalismy to dekrementujemy ta wartosc
- ;teraz sprawdzenie licznika, jako ze wartosci moze byc wiecej niz 255 (256 z tresci zadania)
- cpi XL, 0 ;sprawdzenie młodszej czesci
- brne waitForButton ;jezeli !=0 to kopiuje dalej
- cpi XH, 0 ;sprawdzenie starszej części
- breq programEnd ;jesli mniejsza od 0 to koniec
- brne waitForButton;jesli wieksza od 0, to kopiujemy dalej
- ;------------------------------------------------------------------------------
- ; Program end - Ending loop
- ;------------------------------------------------------------------------------
- programEnd:
- rjmp programEnd
- ;------------------------------------------------------------------------------
- ; Table Declaration - place here test values
- ; Test with different table values and different begin addresses of table (als above 0x8000)
- ;
- ROM_TAB: .db 0x01,0x02,0x03,0x04,0x00,0x00
- .EXIT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement