<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=49&amp;t=21259&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-09-09T11:16:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=49&amp;t=21259&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-09-09T11:16:06+01:00</updated>
<published>2018-09-09T11:16:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211506#p211506</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211506#p211506"/>
<title type="html"><![CDATA[Re: sbi - gdzie ustawiają się bity?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211506#p211506"><![CDATA[
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).<br />Instrukcja <strong><em>SBI 0, 0</em></strong> 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.<br /><br />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).<br /><br />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 <strong>zmianę stanu</strong> odpowiadającego mu bitu w rejestrze PORTA:[syntax=asm]; zakładając, że wartość początkowa rejestru PORTA<br />; (o adresie 0x22) wynosi 0x00<br />    SBI 0,0     ; ta instrukcja spowoduje ustawienie<br />                ; wartości rejestru PORTA na 0x01<br />    SBI 0,0     ; ta sama instrukcja użyta po raz drugi<br />                ; spowoduje ustawienie wartości<br />                ; rejestru PORTA na 0x00[/syntax]<br />W powyższym przykładzie wartość rejestru PINA pozostanie bez zmian.<br /><br />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.<br /><br />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ć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 9 wrz 2018, o 11:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bapi131313]]></name></author>
<updated>2018-09-06T17:02:09+01:00</updated>
<published>2018-09-06T17:02:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211468#p211468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211468#p211468"/>
<title type="html"><![CDATA[sbi - gdzie ustawiają się bity?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21259&amp;p=211468#p211468"><![CDATA[
Piszę symulację w atmel studio. Otworzyłem okno z podglądem RAM i po wykonaniu<br />[syntax=asm]ldi R16,0xff[/syntax]<br />wszystko działa zgodnie z opisem RAMu w nocie atmega328 - zmienia się bajt pod adresem 0x0010.<br /><br />To dlaczego po<br />[syntax=asm]sbi 0,0[/syntax]<br />bajt 0x0020 RAMu nie zmienia się na 0x01?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19912">bapi131313</a> — 6 wrz 2018, o 17:02</p><hr />
]]></content>
</entry>
</feed>