cw3.doc

(48 KB) Pobierz

; Zrobione:
; -kopiowanie RAM -> RAM (przycisk 3)
; -kopiowanie EEPROM -> RAM (przycisk 4)
; -kopiowanie FLASH -> RAM (przycisk 5)
; -kopiowanie FLASH -> EEPROM (przycisk 6)
; -kopiowanie EEPROM -> EEPROM (przycisk 7)


; Ćwiczenie 3.
; Rodzaje pamięci mikrokontrolera ATMEGA128
; Pamięć programu FLASH
; Pamięć EEPROM
; Pamięć RAM - wewnętrzna 0x100 do 0x10FF
; Pamięć RAM - zewnętrzna 0x1100 do 0xFFFF
; Naciśnięcie przycisku 7 - przepisanie pamięci FLASH do pamięci RAM
; Naciśnięcie przycisku 6 - przepisanie pamięci EEPROM do pamięci RAM
; Naciśnięcie przycisku 5 - przepisanie pamięci RAM na wskaźnik LCD
; -------------------------------------------------

.NOLIST
.INCLUDE "DEF_128.ASM" ;Plik z definicjami portów mikrokontrolera
.INCLUDE "DEF_REG.ASM" ;Plik z definicjami nazw rejestrów
.LIST
;-----------------------------------------------
.CSEG ;Dyrektywa określająca jeden z trzech
;segmentów programu - segment kodu.
.ORG 0 ;Ustala adres początkowy lokowania kodu.

JMP RESET ; Skok omijający wektor przerwań

; Wektor przerwań procesora ATMEGA128 - składa się z 34 długich skoków
; do procedur obsługi przerwań. Dla przerwań wyłączonych w programie
; może być skok w dowolne miejsce (np. do etykiety RESET).

JMP RESET ; 1 Zewnętrzne przerwanie 0
JMP RESET ; 2 Zewnętrzne przerwanie 1
JMP RESET ; 3 Zewnętrzne przerwanie 2
JMP RESET ; 4 Zewnętrzne przerwanie 3
JMP RESET ; 5 Zewnętrzne przerwanie 4
JMP RESET ; 6 Zewnętrzne przerwanie 5
JMP RESET ; 7 Zewnętrzne przerwanie 6
JMP RESET ; 8 Zewnętrzne przerwanie 7
JMP RESET ; 9 Timer 2 - porównanie
JMP RESET ;10 Timer 2 - przepełnienie
JMP RESET ;11 Timer 1 - zatrzask
JMP RESET ;12 Timer 1 - porównanie A
JMP RESET ;13 Timer 1 - porównanie B
JMP RESET ;14 Timer 1 - przepełnienie
JMP CLKINT ;15 Timer 0 - porównanie - przerwanie zegarowe
JMP RESET ;16 Timer 0 - przepełnienie
JMP RESET ;17 SPI - wykonane przesłanie
JMP RESET ;18 USART0 - odbiornik pełny
JMP RESET ;19 USART0 - nadajnik gotowy
JMP RESET ;20 USART0 - zakończone nadawanie
JMP RESET ;21 ADC - zakończone przetwarzanie
JMP RESET ;22 EEPROM - gotowy
JMP RESET ;23 Komparator analogowy
JMP RESET ;24 Timer 1 - porównanie C
JMP RESET ;25 Timer 3 - zatrzask
JMP RESET ;26 Timer 3 - porównanie A
JMP RESET ;27 Timer 3 - porównanie B
JMP RESET ;28 Timer 3 - porównanie C
JMP RESET ;29 Timer 3 - przepełnienie
JMP RESET ;30 USART1 - odbiornik pełny
JMP RESET ;31 USART1 - nadajnik gotowy
JMP RESET ;32 USART1 - zakończone nadawanie
JMP RESET ;33 TWI - wykonane przesłanie
JMP RESET ;34 SPM - zakończona operacja na pamięci

RESET: LDI AL,LOW (RAMEND) ;
OUT SPL,AL ; Inicjowanie wskaźnika stosu
LDI AL,HIGH (RAMEND) ;
OUT SPH,AL ; Inicjowanie wskaźnika stosu
;
LDI AL,0B00000000
OUT DDRD,AL ;Port D zdefiniowany jako wejście
LDI AL,0B11111111
OUT PORTD,AL ;W porcie D do wejść są dołączone oporniki
LDI AL,0B11111111
OUT DDRB,AL ;Port B zdefiniowany jako wyjście
;---------------------------------------------------------
;---------------------------------------------------------
LDI AL,0B00001100 ;CS02 CS01 CS00=010 -dzielenie zegara przez 64
;Tryb pracy WGM01 WGM00 = 10 - CTC
;Licznik TIMERa liczy od 00 do wartości OCR0
;Gdy osiągnie wartość OCR0 jest kasowany na 00
;Dzieli częstotliwość swojego zegara przez
;liczbę wpisaną do OCR0
;Zegar procesora = 6 MHz / 64 = 93.750 kHz
OUT TCCR0,AL ;Uruchomienie TIMERa 0
LDI AL,0
OUT TCNT0,AL ;Licznik TIMERa 0 będzie liczył od 0
;Zakładamy okres przerwań zegarowych 1 msek
; (częstotliwość 1000 Hz)
;Licznik TIMERa powinien dzielić przez 94
LDI AL,94 ;
OUT OCR0,AL ;Licznik TIMERa 0 będzie liczył od 0 do 93
;Gdy osiągnie 94 to zostanie skasowany na 00
;---------------------------------------------------------
IN AL,TIMSK ;Rejestr maski przerwań TIMERa 0 1 2
SBR AL,1<<OCIE0 ;Zezw. na przerwanie od porównania TIMERa 0
OUT TIMSK,AL
;---------------------------------------------------------
LDI AL,(1<<SRE)+(1<<SRW10);Włączenie zewnętrznego RAMu i Wait-state
OUT MCUCR,AL
LDI AL,0x0E ;SRL2 SRL1 SRL0 = 0 - cała pamięć zewnętrzna
; należy do wyższego sektora
;SRW01 SRW00 = 3 - niższy sektor
; - czeka 2 cykle podczas zap/odc
; - czeka 1 cykl podczas adresu
;SRW11 SRW10 = 3 - wyższy sektor
; - czeka 2 cykle podczas zap/odc
; - czeka 1 cykl podczas adresu
; SRW10 wpisany do MCUCR
STS XMCRA,AL ;
;---------------------------------------------------------
SEI ;Globalna flaga zezwolenia na przerwania
;---------------------------------------------------------
PTL00:
SBIS PIND,3 ;Testowanie bitu 3 w porcie E
CALL R_RAM ;Call gdy PORTE.3 = 0 (wciśnięty przycisk)
;Będzie przepisanie pamięci RAM do RAMu

SBIS PIND,4 ;Testowanie bitu 4 w porcie E
CALL R_EEPRO ;Call gdy PORTE.4 = 0 (wciśnięty przycisk)

SBIS PIND,5 ;Testowanie bitu 5 w porcie E
CALL R_FLASH ;Call gdy PORTE.5 = 0 (wciśnięty przycisk) ;Będzie przepisanie pamięci EEPROM do RAMu
;Będzie przepisanie pamięci FLASH do RAMu

SBIS PIND,6 ;Testowanie bitu 6 w porcie E
CALL F_EEPROM ;Call gdy PORTE.6 = 0 (wciśnięty przycisk)
;Będzie przepisanie pamięci FLASH do EEPROMu

SBIS PIND,7 ;Testowanie bitu 7 w porcie E
CALL E_EEPROM ;Call gdy PORTE.7 = 0 (wciśnięty przycisk)
;Będzie przepisanie pamięci EEPROM do EEPROMu
LDI AL,1
CALL WAIT_YY ;Odczeka czas 1 * 100 msek
SBI PORTB,5 ;Gasi diodę dołączoną do PORTB.5
LDI AL,1
CALL WAIT_YY ;Odczeka czas 1 * 100 msek
CBI PORTB,5 ;Zapala diodę dołączoną do PORTB.5
JMP PTL00
;---------------------------------------------------------
; Przepisanie pamięci FLASH do RAMu
;---------------------------------------------------------
R_FLASH:LDI ZL,LOW (BUFOR_F * 2);Rejestr indeksowy Z zawiera adres bajtowy
LDI ZH,HIGH (BUFOR_F * 2);danych w tablicy BUFOR_F w pamięci FLASH
LDI YL,LOW (BUFOR_R) ;Rejestr indeksowy Y zawiera adres
LDI YH,HIGH (BUFOR_R) ;bufora w pamięci RAM
LDI AH,16 ;Licznik pętli przepisywania
PTL10: LPM AL,Z+ ;Pobiera bajt z pamięci FLASH
ST Y+,AL ;Zapisuje bajt do pamięci RAM
DEC AH
BRNE PTL10
RET

;---------------------------------------------------------
; Przepisanie jednego bloku RAMu pod inny adres RAMu
;---------------------------------------------------------
R_RAM:LDI ZL,LOW (BUFOR_R);Rejestr indeksowy Z zawiera adres
LDI ZH,HIGH (BUFOR_R);bufora BUFOR_R w pamięci RAM
LDI YL,LOW (BUFOR_R2) ;Rejestr indeksowy Y zawiera adres
LDI YH,HIGH (BUFOR_R2) ;bufora BUFOR_R2 w pamięci RAM
LDI AH,16 ;Licznik pętli przepisywania
PTL_RRAM:
LD AL,Z+ ;Pobiera bajt z pamięci FLASH
ST Y+,AL ;Zapisuje bajt do pamięci RAM
DEC AH
BRNE PTL_RRAM
RET
;---------------------------------------------------------
; Przepisanie pamięci EEPROM do RAMu
;---------------------------------------------------------
R_EEPRO:LDI XL,LOW (BUFOR_E) ;Rejestr indeksowy X zawiera adres
LDI XH,HIGH (BUFOR_E) ;danych w tablicy BUFOR_E w pamięci EEPROM
LDI YL,LOW (BUFOR_R) ;Rejestr indeksowy Y zawiera adres
LDI YH,HIGH (BUFOR_R) ;bufora w pamięci RAM
LDI AH,16 ;Licznik pętli przepisywania
PTL11: CALL EERead ;Pobiera bajt z pamięci EEPROM
ADIW XL,1 ;Zwiększa o 1 adres pamięci EEPROM
ST Y+,AL ;Zapisuje bajt do pamięci RAM
DEC AH
BRNE PTL11
RET
;---------------------------------------------------------
; Odczyt pamięci EEPROM
;---------------------------------------------------------
EERead: CLI ;Zabrania przerwań podczas dostępu do EEPROMa
PTL13: SBIC EECR,EEWE ;Czy gotowy EEPROM
JMP PTL13 ;jeszcze nie
OUT EEARL,XL ;adres w pamięci EEPROM
OUT EEARH,XH
SBI EECR,EERE ;Rozkaz odczytu
SBI EECR,EERE ;Rozkaz odczytu - powtórny
IN AL,EEDR ;Odczyt danej z pamięci EEPROM
SEI ;Zezwolenie na przerwania
RET

;---------------------------------------------------------
; Przepisanie bloku pamięci FLASH do EEPROMu
;---------------------------------------------------------
F_EEPROM:
LDI ZL,LOW (BUFOR_F * 2);Rejestr indeksowy Z zawiera adres bajtowy
LDI ZH,HIGH (BUFOR_F * 2);danych w tablicy BUFOR_F w pamięci FLASH

LDI XL,LOW (BUFOR_E2) ;Rejestr indeksowy X zawiera adres
LDI XH,HIGH (BUFOR_E2) ;danych w tablicy BUFOR_E2 w pamięci EEPROM
LDI AH,16
PTLEE_0:
SBIC EECR, EEWE
RJMP PTLEE_0
OUT EEARL, XL
OUT EEARH, XH

LPM AL,Z+ ;Pobiera bajt z pamięci FLASH
OUT EEDR, AL
SBI EECR, EEMWE
SBI EECR, EEWE

ADIW XL,1
DEC AH
BRNE PTLEE_0
RET

;---------------------------------------------------------
; Przepisanie jednego bloku EEPROMu do innego bloku EEPROMu
;---------------------------------------------------------
E_EEPROM:
LDI ZL,LOW (BUFOR_E2);Rejestr indeksowy Z zawiera adres
LDI ZH,HIGH (BUFOR_E2);danych w tablicy BUFOR_E2 w pamięci EEPROM

LDI XL,LOW (BUFOR_E) ;Rejestr indeksowy X zawiera adres
LDI XH,HIGH (BUFOR_E) ;danych w tablicy BUFOR_E w pamięci EEPROM
LDI AH,16
PTLEE_1:

SBIC EECR, EEWE
RJMP PTLEE_1
CALL EERead
OUT EEARL, ZL
OUT EEARH, ZH

OUT EEDR, AL
SBI EECR, EEMWE
SBI EECR, EEWE

ADIW XL,1
ADIW ZL,1
DEC AH
BRNE PTLEE_1
RET

;---------------------------------------------------------
; Odczeka czas AL * 1 msek
;---------------------------------------------------------
WAIT_XX:ADD AL,TIMEL ;Czas opuszczenia procedury
PTL14: CP AL,TIMEL ;Czeka aż licznik przerwań
BRNE PTL14 ;osiągnie wartość = AL
RET ;Minął wymagany czas
;---------------------------------------------------------
; Odczeka czas AL * 100 msek
;---------------------------------------------------------
WAIT_YY:NOP
PTL15: PUSH AL
LDI AL,100
CALL WAIT_XX ;100 * 1msek = 100 msek
POP AL
DEC AL
BRNE PTL15
RET ;Minął wymagany czas
;---------------------------------------------------------
; Czeka na wystąpienie najbliższego przerwania zegarowego
;---------------------------------------------------------
TIMECYC:NOP
PTL16: SBRS FLAGI_P,NEWINT ;Czy by’o nowe przerwanie
JMP PTL16 ;Czeka na przerwanie
CBR FLAGI_P,1<<NEWINT ;Kasuje znacznik przerwania
RET
;---------------------------------------------------------
; Przerwanie zegarowe od porównania TIMERa 0
;---------------------------------------------------------
CLKINT: PUSH AL ;Ochrona rejestru AL
IN AL,SREG ;Ochrona flag procesora
SBR FLAGI_P,1<<NEWINT ;Flaga wykonania przerwania co 1 msek
;Program główny może czekać na NEWINT = 1
;Następnie wykonać czynność okresową co 1 msek
;i skasować flagę NEWINT.
INC TIMEL ;Licznik przerwań zegarowych modulo 256
OUT SREG,AL ;Przywrócenie stanu flag procesora
POP AL ;Przywrócenie stanu rejestru AL
RETI ;Powrót z obsługi przerwania
;---------------------------------------------------------
BUFOR_F:.DB "Dane pam. FLASH " ;Definicja danych w pamięci programu
;---------------------------------------------------------
; Pamięć RAM
.DSEG ;Dyrektywa segmentu pamięci RAM
.ORG 0x100 ;Adres wewnętrznej pamięci RAM
BUFOR_R:.BYTE 0x10 ;Bufor docelowy w pamięci RAM
.DSEG ;Dyrektywa segmentu pamięci RAM
.ORG 0x120
BUFOR_R2:.BYTE 0x10
;---------------------------------------------------------
; Pamięć EEPROM
.ESEG ;Dyrektywa segmentu pamięci EEPROM
.ORG 0x000 ;Adres pamięci EEPROM
BUFOR_E:.DB "Dane pam. EEPROM" ;Definicja danych w pamięci EEPROM
.ESEG ;Dyrektywa segmentu pamięci EEPROM
.ORG 0x020 ;Adres pamięci EEPROM
BUFOR_E2:.DB "Dane pam. XXXXXX" ;Definicja danych w pamięci EEPROM
;---------------------------------------------------------
.EXIT
;

;Zadeklarować drugi bufor w pamięci RAM.
;Dopisać procedurę przepisania danych z jednego do drugiego
;bufora w pamięci RAM.
;Przepisanie wykonywać po naciśnięciu jednego z klawiszy 7 6 3 2 1 0

...
Zgłoś jeśli naruszono regulamin