Czy to tak

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
grzesio75
-
Posty: 3
Rejestracja: 04 lis 2005, 9:03
Lokalizacja: Lublin
Kontakt:

Czy to tak

Post autor: grzesio75 » 04 lis 2005, 9:30

Witam.
Zaczynam pisać w asemblerze dla AVR.
Mam pytanie ktore zostało już opisane tylko nie jestem pewiemn czy dobrze to zrozumialem. Chodzi mi o :
Kurs asemblera dla AVR w przykładach i Pierwszy program - zapalanie i gaszenie diody LED.
Wariant II
.def acc = r16 ; r16 teraz ma nazwę acc

To zrozumiałe nadaje rejestrowi nazwę - definiuje zmienną.
Dalej
.equ KeyPort = PORTD ;
.equ LEDPort = PORTB ;
.equ Key0Pin = 0 ;
.equ Key1Pin = 1 ;
.equ LEDPin = 0 ;
; Powyżej definiujemy podstawowe parametry programu, to jest
; określamy stałą o nazwie KeyPort (ze wskazaniem na port D) jako port
; przycisków. Analogicznie określona jest stała LEDPort na oznaczenie
; portu, do którego jest przyłączona dioda LED. Dalej uszczegółowione są
; położenia przycisków oraz diody LED jako numerów bitów w portach.
; Tylko te stałe należy modyfikować w przypadku innej parametryzacji.
;-------------------------------------------------------------------------------------
To też zrozumiałem nazwie po lewej stronie równania (nadanej) odpowiada rejesrt bądż pin.
Problem mam ze zrozumieniem poniższej części
.equ KeyPDirection = KeyPort - 1 ;
.equ LedPDirection = LEDPort - 1 ;
.equ KeyPins = KeyPort - 2 ;
; Dodatkowo określone są rejestry związane z konfiguracją pinów
; (wejście/wyjście) użytych portów (adres portu kierunku jest o 1 mniejszy
; od portu danych: DDRB ma adres $17, a PORTB ma adres $18, DDRD ma
; adres $11, a POTRD ma adres $12. Względne przesunięcie adresowe
; rejestru kierunku (DDRx) oraz rejestru stanu pinów (PINx) w stosunku
; do rejestru danych (PORTx) jest stałe. Zmiana wartości stałych LEDPort
; lub KeyPort spowoduje, że wymienione stałe będą nadążały same za
; tymi zmianami."
Ja to tak rozumię:
KeyPort - 1(Pinowi 1 portu D) przypisana zostaje stała KeyPDirection
Analogicznie też z pozostałymi 2 liniami.
Nie rozumię jak dodatkowo określone są rejestry.
Niedawno "przesiadłem się" z 51 na avr i dlatego te pytania
Grzegorz.

skorpik
-
Posty: 9
Rejestracja: 21 sie 2005, 11:17
Lokalizacja: Warszawa

Post autor: skorpik » 05 lis 2005, 13:16

W procesorach AVR obsługa portów jest zupełnie inna niż w rodzinie '51. Aby poprawnie konfigurować porty AVR musisz wiedzieć, że zapis do portu obsługuje rejestr PORTx, odczyt realizujemy za pomocą rejestru PINx a kofigurację WE/WY ustawiamy w rejestrze DDRx. wszystkie te rejestry ustawione są w przestrzeni sfr procesora obok siebie. Zapis w przedstawionym listingu pozwala na ewentualną zmianę całej konfiguracji tylko w dwóch wirszach (reszta zmieni się sama).

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Re: Czy to tak

Post autor: gaweł » 05 lis 2005, 16:17

grzesio75 pisze:Witam.
Zaczynam pisać w asemblerze dla AVR.
Mam pytanie ktore zostało już opisane tylko nie jestem pewiemn czy dobrze to zrozumialem. Chodzi mi o :
Kurs asemblera dla AVR w przykładach i Pierwszy program - zapalanie i gaszenie diody LED.
O widzę, że ćwiczysz mój program ze strony Wojtka. Tak jak pisał ci kolega skorpik, w prockach AVR istnieją rejestry, krórych nie było w C51, więc warto jest zapoznać się z podstawowymi zasobami procka. Jeżeli nie trawisz literatury angielskiej, to możesz poczytać w tym już w języku polskim.

grzesio75
-
Posty: 3
Rejestracja: 04 lis 2005, 9:03
Lokalizacja: Lublin
Kontakt:

Post autor: grzesio75 » 05 lis 2005, 18:37

;---------------------------------------------------------------------------------------------
.def acc = r16 ; r16 teraz ma nazwę acc
.def acc2 = r17 ; r17 teraz ma nazwę acc2
;---------------------------------------------------------------------------------------------
.equ KeyPort = PORTD ; stała KeyPort to PORTD
.equ LEDPort = PORTB ; stała LEDPort to PORTB
.equ KeyPin = 0 ; bit 0 w KeyPort
.equ LEDPin = 0 ; bit 0 w LEDPort
;---------------------------------------------------------------------------------------------
.equ KeyPDirection = KeyPort - 1 ; rejestr kierunku - DDRD
.equ LedPDirection = LEDPort - 1 ; rejestr kierunku - DDRB
.equ KeyPInput = KeyPort - 2 ; rejestr stanu pinów - PIND
Zapis z lekcji II lepiej ukazuje sposób konfiguracji pinów.
Dzięki za pomoc.
Grzegorz.

ODPOWIEDZ