Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 23 lis 2024, o 12:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 6 wrz 2018, o 17:02 
Offline
Nowy

Dołączył(a): 06 wrz 2018
Posty: 1
Pomógł: 0

Piszę symulację w atmel studio. Otworzyłem okno z podglądem RAM i po wykonaniu
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

wszystko działa zgodnie z opisem RAMu w nocie atmega328 - zmienia się bajt pod adresem 0x0010.

To dlaczego po
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

bajt 0x0020 RAMu nie zmienia się na 0x01?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2018, o 11:16 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Na początku muszę uściślić, że adres 0x0020 w przestrzeni adresowej danych nie odnosi się do pamięci RAM, tylko tzw. pamięci MAPPED_IO (czyli dotyczy rejestrów I/O).
Instrukcja SBI 0, 0 w rzeczywistości odnosi się do tej lokalizacji w pamięci. Należy jednak wziąć pod uwagę, że to rejestr specjalny i reakcja na poszczególne operacje (na takich rejestrach) nie zawsze będzie zgodna z zasadami ogólnymi.

Nie podałeś typu mikrokontrolera i użyłeś wartości liczbowej, zamiast nazwy symbolicznej rejestru, więc nie wiadomo, o jaki rejestr chodzi. Oczywiście asembler nie zgłosi w tym przypadku błędu, ponieważ wartości operandów mieszczą się w dopuszczalnym zakresie, ale to wcale nie oznacza, że instrukcja jest prawidłowa. W niektórych mikrokontrolerach niektóre adresy (czy nawet tylko nietóre bity danego adresu) mogą być zarezerwowane/nieużywane i wpisywanie do nich czegokolwiek nie jest zalecane. W innych pod tym adresem może być np. jakiś rejestr PINx, i wtedy wpisywanie do niego jakichś wartości (z przyczyn oczywistych) w ogóle pozostaje bez efektu, lub daje efekt zupełnie innym niż się można spodziewać (biorąc pod uwagę zasady ogólne).

Przykładowo w mikrokotrolerze ATmega644P pod adresem 0x20 (czyli 0x00 w przestrzeni I/O) znajduje się rejestr PINA. Ustawienie któregoś bitu w tym rejestrze nie powoduje de facto jego faktycznego ustawienia, za to powoduje zmianę stanu odpowiadającego mu bitu w rejestrze PORTA:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W powyższym przykładzie wartość rejestru PINA pozostanie bez zmian.

Dlatego, jeśli już chcesz skosztować asemblera, używaj nazw symbolicznych rejestrów I/O, bo taki styl pisania (jak sam widzisz) nie bardzo zdaje egzamin. Dzięki zastosowaniu nazw symbolicznych kod będzie czytelniejszy i łatwiej będzie się domyślić, jaki będzie efekt poszczególnych instrukcji.

Gdybyś w swoim przykładzie użył nazwy symbolicznej, byłaby pewność, że dany adres jet prawidłowy (nie jest zarezerwowany) albo przynajmniej łatwiej byłoby odpowiedzieć na Twoje pytanie. Skoro już korzystasz z dokumentacji (jak napisałeś) to jest w nich zawsze dokładne zestawienie wszystkich rejestrów I/O danego mikrokontrolera łącznie z ich adresami. Są tam też dokładne opisy, do czego te rejestry służą i jak ich używać.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO