; 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
PSQ87