AT89C52 i assmebler
Masz problem? Zapytaj na forum elektroda.pl
From: "Henry(k)" <henrico_at_nospam_friko6.onet.pl>
Subject: AT89C52 i assmebler
Date: Mon, 15 Nov 1999 13:51:26 +0100
Mam parę pytań, może lamerskie ale jestem tylko początkujący.
1. Procesor AT89C52 ma 256 bajtów pamięci. Rozumiem, że adresy
górnych 128 bajtów są równoległe z rejestrami specjalnymi
ale są niezależne. Czyli jeśli ustawię np. początek adresu
stosu: mov SP, #80h to nie nadpisze on rejestrów ?
Jak wygląda dostęp (wpisanie wartości np. 20h) do adresu
RAM 0A0h i rejestru P2 (też 0A0h) - proszę o przykład.
2. W swoim programie muszę wykorzystać Timer0. Czy oznacza
to, że nie mogę wykorzystać linii P3.4-T0 jako wyjścia
(i analogicznie z T1), bo lektura z EP12/94 strona 50
jakoś na to wskazuje.
3. Różnica między ACALL i LCALL to zakres adresowanej pamięci
na skok. Jeżeli nie jestem pewien czy ACALL zmieści się
w obszarze strony 2kB czy bez większych problemów mogę
użyć LCALL zakładając, że jeden bajt więcej na instrukcję
mnie nie interesuje? Podobnie z AJMP / LJMP.
4. W przykładowym programie obsługi I2C dołączonym do noty
aplikacyjnej ATMELA - AT24cxx są takie linijki:
ORG 40H
buffer: DS PSIZE ; storage for read/write data
ORG 60H ; stack origin
stack: DS 20H ; stack depth
Co to jest te "DS" bo ja nie mam pojęcia.
--
Pozdrowionka.
Henry(k) < henrico_at_nospam_friko6.onet.pl >
From: "MaraBut" <martys_at_nospam_priv.onet.pl>
Subject: Re: AT89C52 i assmebler
Date: Mon, 15 Nov 1999 14:25:42 +0100
Henry(k) <henrico_at_nospam_friko6.onet.pl> napisał:
Mam parę pytań, może lamerskie ale jestem tylko początkujący.
1. Procesor AT89C52 ma 256 bajtów pamięci. Rozumiem, że adresy
górnych 128 bajtów są równoległe z rejestrami specjalnymi
ale są niezależne. Czyli jeśli ustawię np. początek adresu
stosu: mov SP, #80h to nie nadpisze on rejestrów ?
Jak wygląda dostęp (wpisanie wartości np. 20h) do adresu
RAM 0A0h i rejestru P2 (też 0A0h) - proszę o przykład.
Dostęp do SFR jest bezpośredni, RAM jest poprzez adresowanie pośrednie. Tzn.
sekwencja :
mov P2,#20h (lub mov A0h,#20h)
wpisuje 20h do portu P2 natomiast sekwencja :
mov R0,#A0h
mov _at_nospam_R0,#20h
wpisuje 20h pod adres A0h w pamięci RAM procesora.
Operacje dotyczące stosu są "z natury" przykładem adresowania pośredniego (o
czym wyraźnie
napisano w PDF'ie ATMEL'a) więc mogą dotyczyć górnego obszaru pamięci.
Mam nadzieję że przedstawiłem to dość jasno ;o)
2. W swoim programie muszę wykorzystać Timer0. Czy oznacza
to, że nie mogę wykorzystać linii P3.4-T0 jako wyjścia
(i analogicznie z T1), bo lektura z EP12/94 strona 50
jakoś na to wskazuje.
Oto skutki korzystania z miernych źródeł : linie portu P3 mają ALTERNATYWNE
funkcje. Tzn. jeśli nie ustawisz
odpowiednio bitów w rejestrach konfiguracyjnych (przełączniki timer/counter,
wybór źródła zliczanych impulsów)
są to zwykłe linie I/O. I odwrotnie - gdy chcesz korzystać z funkcji
dodatkowych MUSISZ wpisać 1 do odpowiednich
bitów portu.
3. Różnica między ACALL i LCALL to zakres adresowanej pamięci
na skok. Jeżeli nie jestem pewien czy ACALL zmieści się
w obszarze strony 2kB czy bez większych problemów mogę
użyć LCALL zakładając, że jeden bajt więcej na instrukcję
mnie nie interesuje? Podobnie z AJMP / LJMP.
Procesora również to nie interesuje ;o)
w każdym razie do momentu gdy adres docelowy znajduje się w obszarze
dostępnej pamięci.
BTW : sporo asemblerów dopuszcza użycie "pseudokodów" CALL i JMP przypisując
odpowiednią
instrukcję kodu maszynowego na etapie linkowania, w zależności od odległości
skoku.
4. W przykładowym programie obsługi I2C dołączonym do noty
aplikacyjnej ATMELA - AT24cxx są takie linijki:
ORG 40H
buffer: DS PSIZE ; storage for read/write data
[...] Co to jest te "DS" bo ja nie mam pojęcia.
DS=Define Space : rezerwacja przestrzeni adresowej bez inicjalizacji.
Odpowiada instrukcji * = * + PSIZE, tzn.
dodaje PSIZE do bieżącego adresu dostępnego dla asemblera. Następne
zmienne/program będą lokowane od
adresu *+PSIZE.
Powinieneś przeczytać dokumentację do asemblera jaki używasz - mówiąc krótko
RTFM !!!
Polecam też 8051FAQ - znajdziesz je dowolną wyszukiwarką.
--
> Pozdrowionka.
I wzajemnie
MaraBut
Date: Mon, 15 Nov 1999 16:06:14 +0100
From: Ozzon <wwer_at_nospam_winuel.com.pl>
Subject: Re: AT89C52 i assmebler
"Henry(k)" wrote:
Mam parę pytań, może lamerskie ale jestem tylko początkujący.
1. Procesor AT89C52 ma 256 bajtów pamięci. Rozumiem, że adresy
górnych 128 bajtów są równoległe z rejestrami specjalnymi
ale są niezależne. Czyli jeśli ustawię np. początek adresu
stosu: mov SP, #80h to nie nadpisze on rejestrów ?
Jak wygląda dostęp (wpisanie wartości np. 20h) do adresu
RAM 0A0h i rejestru P2 (też 0A0h) - proszę o przykład.
Dostep do rejestrow specjalnych jest poprzez rozkazy:
mov adres, xxx
mov xxx, adres
itp... anl, orl,
Do pamieci 80h-0ffh mozesz dostac sie komendami:
mov _at_nospam_r0, xxx lub r1
mov xxx, _at_nospam_r0
tj. wszystkimi rozkazami adresujacymi posrednio
2. W swoim programie muszę wykorzystać Timer0. Czy oznacza
to, że nie mogę wykorzystać linii P3.4-T0 jako wyjścia
(i analogicznie z T1), bo lektura z EP12/94 strona 50
jakoś na to wskazuje.
Jezeli do taktowania timera 0 stosujesz wewnetrzny sygnal zegarowy, to
wyjscie p3.4-t0 jest twoje.
3. Różnica między ACALL i LCALL to zakres adresowanej pamięci
na skok. Jeżeli nie jestem pewien czy ACALL zmieści się
w obszarze strony 2kB czy bez większych problemów mogę
użyć LCALL zakładając, że jeden bajt więcej na instrukcję
mnie nie interesuje? Podobnie z AJMP / LJMP.
Oprocz wymienionej przez Ciebie roznicy to wszystko jest tak samo (2
bajtu na stos itd)
4. W przykładowym programie obsługi I2C dołączonym do noty
aplikacyjnej ATMELA - AT24cxx są takie linijki:
ORG 40H
buffer: DS PSIZE ; storage for read/write data
ORG 60H ; stack origin
stack: DS 20H ; stack depth
Co to jest te "DS" bo ja nie mam pojęcia.
Jest to definiowanie obszaru w pamieci o dlugosci n bajtow.
--
> Pozdrowionka.
> Henry(k) < henrico_at_nospam_friko6.onet.pl >
Wiecej pytan ? Nie ma sprawy.
Wojtek