8051 - programowanie



Masz problem? Zapytaj na forum elektroda.pl z bramką pl.misc.elektronika!

Poprzedni Następny
Wiadomoœć
spis treści
From: "Bartosz Rakowski" <rakbar_at_nospam_friko2.onet.pl>
Subject: 8051 - programowanie
Date: 21 Jan 1999 20:50:29 GMT


Czesc

Szukam kogos, kto programowal '51 w roznych jezykach, a raczej uzywal
roznych kompilatorow assemblera. Mam programy jakos dziwnie napisane
i szukam kogos, kto moglby mi powiedziec, jak to zastapic w moim
kompilatorze.

Rakbar

Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Thu, 21 Jan 1999 23:06:09 GMT



Bartosz Rakowski napisał(a) w wiadomości:
<01be4648$de64f320$aaafccc2_at_nospam_rakbar>...
Czesc

Szukam kogos, kto programowal '51 w roznych jezykach, a raczej uzywal
roznych kompilatorow assemblera. Mam programy jakos dziwnie napisane
i szukam kogos, kto moglby mi powiedziec, jak to zastapic w moim
kompilatorze.


Czekaj, czekaj - albo kompilator, albo assembler. Kompilatorem kompilujesz a
assemblerem assemblujesz. Nie ma czegos takiego jak kompilator assemblera -
no chyba, ze sie myle :)))))

Sypnij na liste jakims malym kodem to zerkniemy...

Juliusz




Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 00:32:53 GMT



Olgierd Cybulski napisał(a) w wiadomości:
<36A7CC7A.AD1_at_nospam_pkpf.if.uj.edu.pl>...
Juliusz wrote:

Szukam kogos, kto programowal '51 w roznych jezykach, a raczej uzywal
roznych kompilatorow assemblera. Mam programy jakos dziwnie napisane
i szukam kogos, kto moglby mi powiedziec, jak to zastapic w moim
kompilatorze.

Czekaj, czekaj - albo kompilator, albo assembler. Kompilatorem
kompilujesz a
assemblerem assemblujesz. Nie ma czegos takiego jak kompilator
assemblera -
no chyba, ze sie myle :)))))

Oczywiście (że się mylisz).
Narzędzie służące do wytwarzania kodu maszynowego na podstawie
programu napisanego w assemblerze nazywane jest kompilatorem
assemblera.


Przyznam ci sie, ze ganiajac po internecie nigdzie nie spotkalem okreslenia
"assembler compiler" natomiast wszedzie jest kompilator C. Mozemy pogadac o
nazewnictwie, czy dyrektywy i makra robia z assemblera kompilator czy jednak
nie. Jeszcze sa interpretery i mozna by je nazwac tez "kompilatorami
interpretujacymi: :))) hahaha, bo w koncu pojedyncze linijli tez chwilowo
zamieniaja na jezyk maszynowy w taki czy inny sposob :)

Ot i przyklad:

Welcome to the ATMEL AVR Assembler.
Please select between the following Help items:
........

Niech sie wypowiedza inni guru :)

Juliusz




Poprzedni Następny
Wiadomoœć
spis treści
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 03:19:29 +0100


Juliusz wrote:

Przyznam ci sie, ze ganiajac po internecie nigdzie nie spotkalem okreslenia
"assembler compiler" natomiast wszedzie jest kompilator C.

Myślałem, że rozmawiamy o polskim nazewnictwie.
Na Zachodzie, z tego co wiem, stosuje się rozróżnienie
pomiędzy słowami "assembler" i "Assembler" , to drugie,
pisane od dużej litery, oznacza kompilator.
Tak mi ktoś kiedyś tłumaczył, nie wiem, ile w tym prawdy.

Mozemy pogadac o
nazewnictwie, czy dyrektywy i makra robia z assemblera kompilator czy jednak
nie.

To są dodatki, istotne wprawdzie, ale tylko dodatki.
Niemniej do przetłumaczenia programu w assemblerze
na kod maszynowy potrzebny jest kompilator.
Chcesz, to wpisz do pamięci FLASH procesora AT89C51
tekst źródłowy programu w assemblerze, zobaczymy,
jakie będą efekty :-)
Na ogół przypadkowe.
Ponieważ tekst źródłowy i kod wynikowy to zupełnie
różne rzeczy, i aby przejść od pierwszego do drugiego
potrzebny jest specjalny program, zwyczajowo
nazywany kompilatorem assemblera.
Na zachodzie Assemblerami nazywane są również
kompilatary assemblera - języka.
W Polsce czasem też, jednak wyłącznie na zasadzie skrótów
myślowych, moim zdaniem.

Jeszcze sa interpretery i mozna by je nazwac tez "kompilatorami
interpretujacymi: :)))

Interpretery assemblera ????
To pojęcie może mieć sens jedynie w odniesieniu
do sposobu działania emulatorów sprzętowych
poszczególnych procesorów.
Assembler nie jest językiem interpretowanym,
ale wyłącznie (poza emulatorami) kompilowanym.
Interpretowany, to może być Basic.
Interpretacja, to nic innego, jak tylko
jednoczesne tworzenie kodu wykonywalnego na
podstawie tekstu programu i jego uruchamianie,
w odróżnieniu od kompilacji, która polega
na wcześniejszym przetłumaczeniu całości tekstu
źródłowego na kod wykonywalny.

O.C.

-------------------------------------------------
wśród blasku laserów i szumu wentylatorów
-------------------------------------------------

Poprzedni Następny
Wiadomoœć
spis treści
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 01:55:22 +0100


Juliusz wrote:

Szukam kogos, kto programowal '51 w roznych jezykach, a raczej uzywal
roznych kompilatorow assemblera. Mam programy jakos dziwnie napisane
i szukam kogos, kto moglby mi powiedziec, jak to zastapic w moim
kompilatorze.

Czekaj, czekaj - albo kompilator, albo assembler. Kompilatorem kompilujesz a
assemblerem assemblujesz. Nie ma czegos takiego jak kompilator assemblera -
no chyba, ze sie myle :)))))

Oczywiście (że się mylisz).
Narzędzie służące do wytwarzania kodu maszynowego na podstawie
programu napisanego w assemblerze nazywane jest kompilatorem
assemblera.

Zadaniem kompilatora jest nie tylko zastępowanie mnemoników
instrukcji odpowiednim kodem maszynowym, lecz także,
a nawet przede wszystkim - obliczanie wartości wyrażeń,
optymalizacja (ta najprostsza, np. wybór rodzaju
skoków lub wywołań podprogramów), automatyczne przydzielanie
pamięci zmiennym, obliczanie adresów skoków itp itd.
Samo przetłumaczenie mnemoników na kod maszynowy
jest trywialne, program służący do tego można napisać
w jeden dzień. Cała komplikacja tkwi właśnie w owych zadaniach
pomocniczych, oraz w interpretacji rozmaitych dyrektyw.
Dobry kompilator sprawia, że różnica między kodem maszynowym a
programem w assemblerze jest tak samo duża jak różnica
pomiędzy programem w assemblerze, a programem w C .
Dobre assemblery pozwalają na stosowanie pseudoinstrukcji
makr, oraz makr parametrycznych.

Olgierd Cybulski

-------------------------------------------------
wśród blasku laserów i szumu wentylatorów
-------------------------------------------------

Poprzedni Następny
Wiadomoœć
spis treści
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 02:09:22 +0100


Bartosz Rakowski wrote:

Szukam kogos, kto programowal '51 w roznych jezykach, a raczej uzywal
roznych kompilatorow assemblera. Mam programy jakos dziwnie napisane
i szukam kogos, kto moglby mi powiedziec, jak to zastapic w moim
kompilatorze.

Co to znaczy "dziwnie napisane" ?

Dla mnie "dziwne" są wszelkie odstępstwa od specyfikacji
assemblera MCS-51 opracowanej przez INTEL.
Niestety są one dość często spotykane - nawet w papierowej
literaturze. Wielu twórców kompilatorów assemblera
usiłowało przeforsować własne rozwiązania, tak, jakby
specyfikacja INTEL nie była im znana.
Dotyczy to przede wszystkim stosowanych dyrektyw
pomocniczych, konwencji zapisu wyrażeń (np.
symboli operatorów, także ich priorytetu),
a co najgorsze - również samego zapisu instrukcji -
przede wszystkim konwencji zapisu operandów w różnych
trybach adresowania.
Na przykład MOV R1,0
w oryginalnej specyfikacji INTEL oznacza przepisanie
do rejestru R1 zawartości komórki pamięci o adresie 0.
Natomiast wiele prowincjonalnych assemblerów traktuje
to jako wyzerowanie rejestru R1, a zatem intelowskie
MOV r1,#0 .
Jeśli już ktoś koniecznie chce używać takich assemblerów,
bądź dysponuje akurat takim, niestandardowym, kodem źródłowym,
konwersja do postaci intelowskiej jest na ogól bardzo prosta.
Nawet w przypadku długich programów.
Ja używam do tych celów porządnego edytora
tekstów, np. edytora z IDE Borland C++ .
Przy pomocy tego edytora można łatwo zastąpić określone
sekwencje znaków innymi sekwencjami, co umożliwia
automatyzację procesu tłumaczenia. Kiedyś miałem
źródło bardzo fajnej biblioteki numerycznej
w "dziwacznym" assemblerze. Ponieważ biblioteka była
długa, napisałem sobie specjalny programik (w Pascalu),
który tłumaczył tekst według prostych reguł.
Po takim tłumaczeniu wystarczyło jeszcze zmienić
kilka fragmentów ręcznie, i tyle, działało bez
zarzutu. Byle tylko wiedzieć, o co chodziło
autorowi programu, co na ogół można wywnioskować
z kontekstu.

Olgierd Cybulski

-------------------------------------------------
wśród blasku laserów i szumu wentylatorów
-------------------------------------------------

Poprzedni Następny
Wiadomoœć
spis treści
From: "Bartosz Rakowski" <rakbar_at_nospam_friko2.onet.pl>
Subject: Re: 8051 - programowanie
Date: 22 Jan 1999 06:22:05 GMT


Czesc

Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl> napisał(a) w artykule
<36A7CFC2.5220_at_nospam_pkpf.if.uj.edu.pl>...
Co to znaczy "dziwnie napisane" ?

Dziwnie napisane, znaczy uzywajace zacznikow nie wiadomo z kad.
Zacytuje wam ponizej fragment, i powiem co mi sie nie podoba.
Jest to fragment kodu obslugujacego poprzez 8051 sterownik magistrali
I2C - PCF8584.

Przede wszystkim specyfikacja procedur jako PUBLIC i EXTERN. W spotkanych
przeze mnie kompilatorach bylo tylko "include".
Po drugie dziwne umieszczanie zmiennych poprzez RSEG, albo SEGMENT
CZy ma ktos kompilator, ktory to lyknie?
Poza tym gdzies tam w kodzie wystepuje "USING 1" :-?
A jeszcze w innym pliku mam taka deklaracje zmiennej
"TABLE: DS 10", dla mnie bomba. Juz prawie wiem, jak to wszystko
pozamieniac, ale nie mam pewnosci.



--- Oto leci ----

$TITLE (I2C INTERRUPT ROUTINE)
$PAGELENGTH(40)
;
PUBLIC INT0_SRV
PUBLIC DIR,I2C_END
PUBLIC BASE,NR_BYTES,IIC_CNT,SLAVE
EXTRN CODE(SENDBYTE,SENDCONTR,STOP,READBYTE,READCONTR)
;
;Define variables in RAM
IIC_VAR SEGMENT DATA
RSEG IIC_VAR
BASE: DS 1 ;Pointer to I2C table (till 256)
NR_BYTES: DS 1 ;Number of bytes to rcv/trm
IIC_CNT:DS 1 ;I2C byte counter
SLAVE: DS 1 ;Slave address after START
;
;Define variable segment
BIT_VAR SEGMENT DATA BITADDRESSABLE
RSEG BIT_VAR
STATUS: DS 1 ;Byte with flags
I2C_END BIT STATUS.0 ;Defines if a I2C transmission is finished
;'1' is finished
;'0' is not ready
DIR BIT STATUS.3 ;Defines direction of I2C transmission
;'1':Transmit '0':Receive
;
;Define code segment for routine
IIC_INT SEGMENT CODE PAGE
RSEG IIC_INT
;
;Program uses registers in RB1
USING 1
;
INT0_SRV:
PUSH ACC ;Save acc. en psw on stack
PUSH PSW
MOV PSW,#08H ;Select register bank 1
JNB DIR,RECEIVE ;Test direction bit
;8584 is MST/TRM

;Program part to transmit bytes to IIC bus
MOV A,IIC_CNT ;Compare IIC_CNT and NR_BYTES
CJNE A,NR_BYTES,PROCEED
CALL STOP ;All bytes transmitted
JMP EXIT
PROCEED:MOV R0,BASE ;RAM pointer
MOV A,_at_nospam_R0 ;Source is internal RAM
INC BASE ;Update pointer of table
CALL SENDBYTE ;Send byte to IIC bus
INC IIC_CNT ;Update byte counter
JMP EXIT
;
;
;Program to receive byte from IIC bus
RECEIVE:
MOV A,IIC_CNT ;Test if last byte is to be received
INC A
INC A
CJNE A,NR_BYTES,PROC_RD
MOV A,#01001000B;Last byte to be received. Disable ACK
CALL SENDCONTR ;Write control word to PCD8584
PROC_RD:CALL READBYTE ;Read I2C byte
MOV R4,A ;Save accu
;If RECEIVE is entered after the transmission of START+address
;then the result of READBYTE is not relevant. READBYTE is used to start
;the generation of the clock pulses for the next byte to read.
;This situation occurs when IIC_CNT is 0
CLR A ;Test IIC_CNT
CJNE A,IIC_CNT,SAVE
JMP END_TEST ;START is send. No relevant data in data reg. of
8584
SAVE: MOV R0,BASE
MOV A,R4 ;Destination is internal RAM
MOV _at_nospam_R0,A
INC BASE
END_TEST:INC IIC_CNT ;Test if all bytes are received
MOV A,NR_BYTES
CJNE A,IIC_CNT,EXIT
CALL STOP ;All bytes received
;
EXIT: POP PSW ;Restore PSW and accu
POP ACC
RETI
;
END



Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 12:17:54 GMT



Bartosz Rakowski napisał(a) w wiadomości:
<01be4698$b817e6a0$83afccc2_at_nospam_rakbar>...
Czesc

Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl> napisał(a) w artykule
<36A7CFC2.5220_at_nospam_pkpf.if.uj.edu.pl>...
Co to znaczy "dziwnie napisane" ?

Dziwnie napisane, znaczy uzywajace zacznikow nie wiadomo z kad.
Zacytuje wam ponizej fragment, i powiem co mi sie nie podoba.
Jest to fragment kodu obslugujacego poprzez 8051 sterownik magistrali
I2C - PCF8584.

Przede wszystkim specyfikacja procedur jako PUBLIC i EXTERN. W spotkanych
przeze mnie kompilatorach bylo tylko "include".
Po drugie dziwne umieszczanie zmiennych poprzez RSEG, albo SEGMENT
CZy ma ktos kompilator, ktory to lyknie?
Poza tym gdzies tam w kodzie wystepuje "USING 1" :-?



USING 1 to czesta dyrektywa mowiaca z jakiego banku (z czterech) w danej
chwili namy zamiar korzystac. Moze byc USING 0,1,2 i 3. Mam jakis taki
assembler co to lyka akurat. Moge ci go podeslac jak masz ochote na plik ?

Juliusz




Poprzedni Następny
Wiadomoœć
spis treści
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 14:11:56 +0100


Bartosz Rakowski wrote:

Co to znaczy "dziwnie napisane" ?

Dziwnie napisane, znaczy uzywajace zacznikow nie wiadomo z kad.
Zacytuje wam ponizej fragment, i powiem co mi sie nie podoba.
Jest to fragment kodu obslugujacego poprzez 8051 sterownik magistrali
I2C - PCF8584.

Przede wszystkim specyfikacja procedur jako PUBLIC i EXTERN. W spotkanych
przeze mnie kompilatorach bylo tylko "include".

Niektóre kompilatory umożliwiają stosowanie częściowej ochrony danych
i kodu, tzn. umożliwiają "prywatyzację" podprogramów.
Myślę, że możesz zignorować te dyrektywy - zwykłe kompilatory
traktują wszystko jako PUBLIC.

Po drugie dziwne umieszczanie zmiennych poprzez RSEG, albo SEGMENT
CZy ma ktos kompilator, ktory to lyknie?

Ja mam. W moim assemblerze mozna zdefiniowac stale jako
EQU, dzięki czemu są po prostu stałymi, których można używać
dowolnie, ale można też (i warto) większość stałych zadeklarować
w ramach segmentów DATA, lub CODE, itp. dzięki czemu mamy pewność,
że nie pomyli nam się ich zastosowanie (kompilator na to nie pozwoli),
są wówczas albo adresami zmiennych w RAM, albo adresami w przestrzeni
kodu.
Poszukam opisu, mam to gdzieś całkiem nieźle wyłuszczone
(w instrukcji do kompilatora).

Poza tym gdzies tam w kodzie wystepuje "USING 1" :-?

To też w zasadzie nie ma znaczenia. Chodzi o to, by kompilator
wiedział, że domyślnie przyjęty jest pierwszy bank rejestrów,
przypuszczam, że skoro pierwszy, to nie zerowy, więc przyjęto,
że rejestr R0 jest w ósmej komórce.
Ma to znaczenie wyłącznie dla kompilatora i nie powoduje
generowania jakiegokolwiek kodu.
Chodzi, o ile wiem, o to, żeby kompilator mógł kontrolować
zmiany wartości rejestrów (ochrona danych !), np. żeby
zmienna prywatna umieszczona pod adresem 0 nie mogła być
zmodyfikowana w "zewnętrznej" części programu instrukcją
np. MOV R0,#VALUE, oczywiście mogłoby się to zdarzyć tylko
wówczas, gdy w PSW bity wybierające bank rejestrów będą wyzerowane.
Z automatycznym przydzielaniem pamięci zmiennym jest zawsze kłopot
polegający na tym, że komórki pamięci mogą być jednocześnie
adresowane jako rejestry (czasem) lub pola bitowe (też nie zawsze. of course)


A jeszcze w innym pliku mam taka deklaracje zmiennej
"TABLE: DS 10", dla mnie bomba. Juz prawie wiem, jak to wszystko
pozamieniac, ale nie mam pewnosci.

TABLE to zwykła etykieta, tzn. stała, która nie jest znana przez
Ciebie, gdy piszesz program, lecz ma wartość obliczaną na etapie
kompilacji. Inaczej mówiąc - adres w pamięci programu.
Lub adres komórki RAM, jeśli dyrektywa wystąpi w segmencie DATA.
DS to skrót od Define Space. 10 jest argumentem.
Całość oznacza, że kompilator ma zarezerować 10 komórek pamięci
(inaczej mówiąc - pozostawić je wolne, lub w przypadku
segmentu kodu - pozostawić je do ewentualnego zapełnienia
w przyszłości po dyrektywie ORG TABLE).
Niektóre kompilatory pozwalają na użycie takich dyrektyw (DS, DW, DB, DQ)
w segmencie danych, a zatem rezerwowana jest nie część pamięci programu,
ale część RAMu, na przykład na tablicę iluś tam elementową.
Jak widać z takim czymś masz właśnie do czynienia.
Np. fragment (w segmencie DATA) :

BASE: DS 1

powoduje utworzenie zmiennej jednobajtowej w komorce o adresie
przydzielonym automatycznie i zapamietamym w stalej o nazwie BASE .

Z tym, że w przypadku RAMu i segmentu danych dyrektywa DS ma znaczenie tylko
przy automatycznym przydzielaniu pamięci zmiennym.
Ja tego nie używam, bo i po co.
Wolę sam ustalić gdzie mają być jakie zmienne.

Natomiast w kodzie dyrektywa DS ma duże znaczenie, np.
do ustalania początków tablic LUT, lub tablic skokow,
jesli nie wszystkie offsety sa mozliwe i czesc z nich
trzeba "zmarnowac".


O.C.

-------------------------------------------------
wśród blasku laserów i szumu wentylatorów
-------------------------------------------------

Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 13:02:18 GMT


--- Oto leci ----


Dobra to ja zrobilbym to tak...


mov SP,#29h ;dno stosu - stos sie zacznie od 30h zwalniajac tym samym
caly obszar adresowany bitowo

PUBLIC INT0_SRV

To bym zastapil
org 03h
ajmp INT0_SRV - niech sobie assembler sam to umiesci gdzie chce !

--------------------------------------------------
PUBLIC DIR,I2C_END
To sa definiowane bity (tak wynika z kodu) wiec zakladamy, ze rozpoczynasz
od najnizszego adresu adresowanego bitowo
To wszystko umieszczam w bajcie 20h

DIR equ 000h
I2C_END equ 001h


------------------------------------------------------

PUBLIC BASE,NR_BYTES,IIC_CNT,SLAVE
To sa chyba zwykle bajty tylko ponazywane labelkami wiec: Zakladam, ze
wsadzam te zmienne w miejsce gdzie siedzi 3-ci w kolejnosci bank rejestrow
(jakby to powiedziec USING 2 :-)

BASE DATA 010h
NR-BYTES DATA 011h
IIC_CNT DATA 012h
SLAVE DATA 013h


------------------------------------------------------------

EXTRN CODE(SENDBYTE,SENDCONTR,STOP,READBYTE,READCONTR)

To bym olal i pozwolil assemblerowi samemu to porozmieszczec w pamieci
To pewnie sa jakies procedury wolane rozkazem call lub jakies skoki z
programu

---------------------------------------------------------------

;Define variables in RAM
IIC_VAR SEGMENT DATA
RSEG IIC_VAR
BASE: DS 1 ;Pointer to I2C table (till 256)
NR_BYTES: DS 1 ;Number of bytes to rcv/trm
IIC_CNT:DS 1 ;I2C byte counter
SLAVE: DS 1 ;Slave address after START

Tego nie ma ! Podalem ich lokalizacje wczesniej


---------------------------------------------------------

;Define variable segment
BIT_VAR SEGMENT DATA BITADDRESSABLE
RSEG BIT_VAR
STATUS: DS 1 ;Byte with flags
I2C_END BIT STATUS.0 ;Defines if a I2C transmission is finished
;'1' is finished
;'0' is not ready
DIR BIT STATUS.3 ;Defines direction of I2C transmission
;'1':Transmit '0':Receive

Dalszy ciag tego bajtu 20h rozparcelowanego na flagi w obszarze adresowanym
bitowo

BIT_VAR equ 02h
DIR ----- juz bylo no chyba, ze to inny DIR ??? i wypada go nazwac DIR1 i
nadac mu adres bitowy kolejny
I2C_END --- bylo juz chyba, ze ma inne znaczenie - kto wie :)
STATUS equ 03h

----------------------------------------------------------------------------
-----

;Define code segment for routine
IIC_INT SEGMENT CODE PAGE
RSEG IIC_INT
To wywal - niech sam sobie assembler to ustawi w pamieci gdzie to ma
siedziec.

;Program uses registers in RB1
USING 1

No wlasnie ! pomizej do PSW wpisywana jest wartosc wybierajaca bank wiec ta
dyrektywa USING 1 nie konieczna zbytnio tu jest !!!!!!!! Nie wszystkie
assemblery to lykaja ! Ale kto wie jakby caly kod zobaczyc ??

---------------------------------
To pewnie procedura przerwania zwykla
INT0_SRV:
PUSH ACC ;Save acc. en psw on stack
PUSH PSW
MOV PSW,#08H ;Select register bank 1
JNB DIR,RECEIVE ;Test direction bit
;8584 is MST/TRM


tu gdzies RETI powinno byc i zebranie ze stosu to co zostalo tam wsadzone
POP PSW
POP ACC
RETI



===========================
DALEJ TO JUZ KOD - TRUDNO POWIEDZIEC CO MA OZNACZAC I CO ROBIC - twoje
zmartwienie :)
===========================

;Program part to transmit bytes to IIC bus
MOV A,IIC_CNT ;Compare IIC_CNT and NR_BYTES
CJNE A,NR_BYTES,PROCEED
CALL STOP ;All bytes transmitted
JMP EXIT
PROCEED:MOV R0,BASE ;RAM pointer
MOV A,_at_nospam_R0 ;Source is internal RAM
INC BASE ;Update pointer of table
CALL SENDBYTE ;Send byte to IIC bus
INC IIC_CNT ;Update byte counter
JMP EXIT
;
;
;Program to receive byte from IIC bus
RECEIVE:
MOV A,IIC_CNT ;Test if last byte is to be received
INC A
INC A
CJNE A,NR_BYTES,PROC_RD
MOV A,#01001000B;Last byte to be received. Disable ACK
CALL SENDCONTR ;Write control word to PCD8584
PROC_RD:CALL READBYTE ;Read I2C byte
MOV R4,A ;Save accu
;If RECEIVE is entered after the transmission of START+address
;then the result of READBYTE is not relevant. READBYTE is used to start
;the generation of the clock pulses for the next byte to read.
;This situation occurs when IIC_CNT is 0
CLR A ;Test IIC_CNT
CJNE A,IIC_CNT,SAVE
JMP END_TEST ;START is send. No relevant data in data reg. of
8584
SAVE: MOV R0,BASE
MOV A,R4 ;Destination is internal RAM
MOV _at_nospam_R0,A
INC BASE
END_TEST:INC IIC_CNT ;Test if all bytes are received
MOV A,NR_BYTES
CJNE A,IIC_CNT,EXIT
CALL STOP ;All bytes received
;
EXIT: POP PSW ;Restore PSW and accu
POP ACC
RETI
;
END

===================================
=====================================
======================================

Mozna to zrobic na 1000 sposobow i pewnie nie jeden bedzie dobry - to mi tak
do glowy wpadlo teraz na szybkiego :))

Milej zabawy

Juliusz


P.S. Bez wzgledu na to czy assembler to kompilator czy nie :))))




Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 13:07:13 GMT



Bartosz Rakowski napisał(a) w wiadomości:
<01be4698$b817e6a0$83afccc2_at_nospam_rakbar>...
Czesc

Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl> napisał(a) w artykule
<36A7CFC2.5220_at_nospam_pkpf.if.uj.edu.pl>...
Co to znaczy "dziwnie napisane" ?

A jeszcze w innym pliku mam taka deklaracje zmiennej
"TABLE: DS 10", dla mnie bomba. Juz prawie wiem, jak to wszystko
pozamieniac, ale nie mam pewnosci.



To table to nie takie table chyba jak myslisz :)) To zdefiniowany LABELEK o
nazwie table chyba tylko !!!!!
Ten dwukropek za TABLE jest nieco mylacy :( Jakbys dal caly kod to
popatrzymy.

Juliusz




Poprzedni Następny
Wiadomoœć
spis treści
From: "Juliusz" <juliusz_at_nospam_wyscigi.multi-ip.com.pl>
Subject: Re: 8051 - programowanie
Date: Fri, 22 Jan 1999 13:17:05 GMT



Juliusz napisał(a) w wiadomości: <5K_p2.7774$12.1382683_at_nospam_news.tpnet.pl>...

Bartosz Rakowski napisał(a) w wiadomości:
<01be4698$b817e6a0$83afccc2_at_nospam_rakbar>...
Czesc

Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl> napisał(a) w artykule
<36A7CFC2.5220_at_nospam_pkpf.if.uj.edu.pl>...
Co to znaczy "dziwnie napisane" ?

A jeszcze w innym pliku mam taka deklaracje zmiennej
"TABLE: DS 10", dla mnie bomba. Juz prawie wiem, jak to wszystko
pozamieniac, ale nie mam pewnosci.


Jak chcesz gotowego I2C to ci moge dac kawalek mojego kodu, ktory chodzi na
100%. Chyba 4 bajty polyka i ze 2 lub trzy flagi bitowe.
Wolasz procedury zapisu, czytania, ACK normalnie poprzez CALL i tyle

Juliusz