Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

instrukcje IN oraz OUT dla Atmega128

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
instrukcje IN oraz OUT dla Atmega128

Postautor: Sławek5 » 1 wrz 2006, o 05:46

Cześć.
W asemblerze dla AVR sa instrukcje in oraz out dla pewego zakresu.
Co zrobić jak rejestr obsługujący np TWI jest poza zakresem działania tych instrukcji.

Mam w programie takie makro

Kod: Zaznacz cały

.macro outi ldi r16,@1 out @0,r16 .endm
Jego wywołanie to

Kod: Zaznacz cały

outi TWCR, TWI_NOT_ADDR
JAk sobie z tym poradzić.

A co z instrukcjami typu CBI oraz SBI

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 1 wrz 2006, o 08:19

w pliku m128def.inc jest zaznaczone że
; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ UCSR1C = 0x9d ; MEMORY MAPPED
....
.equ TWCR = 0x74 ; MEMORY MAPPED
....
więc takie coś sobie napisałam, mniejsza o sens wpisywanej do TWCR wartości...

Kod: Zaznacz cały

.include "m128def.inc" .cseg .org 0x0000 ldi r16, 0xAA sts TWCR, r16 loop: rjmp loop
zamiast OUT występuje STS (store direct to data space)...
pod symulatorem działa

tasza

[edit po chwili]
w dokumentacji do mega128 ( http://atmel.com/dyn/resources/prod_doc ... oc2467.pdf )
na stronie 213 jest tabelka prezentująca sposób dostępu do tych rejestrów, a poniżej drobnym fontem jest uwaga:
Note: For I/O registers located in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions
must be replaced with instructions that allow access to extended I/O.
Typically “LDS” and “STS” combined with “SBRS”, “SBRC”, “SBR”, and “CBR”.
to odpowiedź także na drugie pytanie.....

tasza
Ostatnio zmieniony 1 wrz 2006, o 08:47 przez tasza, łącznie zmieniany 1 raz.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 1 wrz 2006, o 08:45

Dzięki
Czyli jak bym zamienił to to zadzaiła.
Mam jeszcze taką prośbe do ciebie czy mozesz mi wytłmaczyć zasadę używnania tych instrukcji IN oraz OUT. JAkie one maja zakres działania i co zrobić przy innch procesorach jak wychodzi poza zakres adres rej. I/O.
A co z instrukcjami CBI oraz SBI one też mają jakieś ograniczenia i jak się ich pozbyc.

P.S. dobrze że internet jest w pracy było by mi trudno na beżąo odpowiadać.
Jeśli byś mi poświeciła chwile to będe wdzięczny.
Sławek.

Wisz co teraz to juz nic nie rozumiem, niby to wszystko proste ale potrzebuje pomocy w poukładaniu tego wszystkiego.

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 1 wrz 2006, o 09:21

spokojnie, poukłada się zaraz... jest tak:
instrukcje IN/OUT jako parametry dostają rejestr i adres portu I/O
dopuszczalne rejestry to od 0 do 31, więc tu nie ma problemu
dopuszczalny zakres adresów I/O to 0...63 (0x00...0x3F),
wszystko co jest poza tym zakesem, musi być traktowane jako
komórki pamięci, czyli z wykorzystaniem instrukcji LDS i STS,
ponieważ one jako operand oznaczający adres akceptują 0..0xFFFF.

ale akurat to jest do wytrzymania, po prostu należy pamiętać,
że pewne rejestry należy potraktować nieco inaczej...
o, napisz sobie do nich zestaw dodatkowych makr...

z instrukcjami cbi/sbi jest troszkę gorzej, ponieważ one operują
na adresach 0...31 (0...0x1F) i dla portów I/O mapowanych
w pamięci należy je zastąpić zestawem instrukcji LDS + SBR (lub CBR) + STS
czyli pobrać z portu wartość do rejestru, ustawić/skasować w niej
wymagany bit, potem wstawić tak zmodyfikowaną tam, skąd się ją wzięło

o, coś takiego - makro memo_sbi

Kod: Zaznacz cały

.include "m128def.inc" .cseg .org 0x0000 ;----------------------- .macro memo_sbi ; do R16 wartośc z komórki pamięci lds r16,@0 ;operacja na zadanych via @1 bitach R16 sbr r16,@1 ; oddanie zmodyfikowanje wartości sts @0,r16 .endm ; of memo_sbi ;----------------------- ; przykładowe wywołanie memo_sbi TWCR, (1<<2) loop: rjmp loop
najlepiej uruchom AVR studio i poobserwuj jak działają
takie kawalątka kodu, na małych fragmentach, jak ten właśnie
dobrze że internet jest w pracy
a tak, tylko ważne kto Ci stoi za plecami... 8)
ja na przykład mam okno i chwilowo ciekawskie assemblera słoneczko...

tasza

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość