cw3.txt

(11 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
;-----------------------------------------------...
Zgłoś jeśli naruszono regulamin