AT89C52 i assmebler



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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 >



Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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