cw3.rtf

(13 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

...

Zgłoś jeśli naruszono regulamin