Mam za zadanie napisać dodawanie/odejmowanie/możenie liczb za pomocą transmisji szeregowej. Podajemy liczbę w takiej postaci np. 123+045=, mam na razie to na jedną cyfrę np. 003+004= po zsumowaniu wynosi 7. I moje pytanie brzmi w jaki sposób mógłbym uzyskać liczbę setek, dziesiątek, jedności? Można by było wziąć pierwsza cyfrę tj. 1 i pomnożyć ją przez 100(w jaki sposób?) i dodać do niej następną tj. 2 razy 10 a później 3 razy 1 zapisać ją, a potem kolejna cyfra? Następnie w jakiś sposób wykonać na niej działania i z powrotem wyświetlić wynik w prawidłowej postaci?
Hmmm to chyba bardziej tutaj chodzi o właściwy odbiór przesyłanych transmisją szeregową liczb, zgadza się?
MasterBLB napisał(a):
Hmmm to chyba bardziej tutaj chodzi o właściwy odbiór przesyłanych transmisją szeregową liczb, zgadza się?
Tak, dokładnie. Następnie muszę dokonać na nich określonych operacji arytmetycznych i z powrotem wysyłać.
Masz gdzieś dokumentację protokołu jakim będą słane dane, albo nazwę oraz parametry jeśli to jakiś ustandaryzowany, np RS-232?
Asynchroniczna szeregowa, prędkość 9600, 8 bitów danych, 1 bit stopu i brak kontroli parzystości.
Mam coś takiego, planowałem żeby docelowo działało to na dwóch liczbach trzycyfrowych z wynikiem do 256, na razie wpadłem na taki pomysł, mamy np (123?056?) ?-znak +*= i brać najpierw pierwszy bit od lewej tj(1) i mnożyć go razy 100 następnie dodać do tego drugi bit(2) pomnożyć przez 10 a następnie 3 razy 1, przechować gdzieś tą liczbę i powtórzyć to samo z drugą i wykonać operację arytmetyczną. Oczywiście gorzej z wykonaniem tego pomysłu.
_RECV_FLG BIT 00h ;Flaga otrzymania danych
_SEND_FLG BIT 01h ;Flaga wysłania danych
_RECV_BUF DATA 030h ;bufor otrzymanych danych
_RECV_BUF_INDEKS DATA 030 ;indeks danych(iterator)
ORG 0000h
_RESET:
LJMP _INIT
ORG 0023h
_INT_SERIAL:
JB TI,_INT_SERIAL_TI
_INT_SERIAL_RI:
MOV A,#_RECV_BUF
INC _RECV_BUF_INDEKS
ADD A,_RECV_BUF_INDEKS
MOV R1, A
MOV A, SBUF
MOV SBUF, A
MOV @R1, A
CLR RI
SETB _RECV_FLG
RETI
_INT_SERIAL_TI:
CLR TI
;SETB _SEND_FLG
RETI
ORG 0100h
_INIT:
MOV SCON,#01010000b
ANL TMOD, #00101111b
ORL TMOD, #00100000b
MOV TL1,#0FDh
MOV TH1,#0FDh
ANL PCON,#01111111b
CLR TF1
SETB TR1
SETB ES
SETB EA
CLR _RECV_FLG
CLR _SEND_FLG
MOV _RECV_BUF,#0d
MOV _RECV_BUF_INDEKS,#0d
MOV R0,#0FF81H
MOV R4,#0FF82H
_LOOP:
JNB _RECV_FLG,_LOOP10
MOV A,_RECV_BUF_INDEKS
CLR CY
SUBB A,#8d
JC _LOOP5
LCALL _CALCULATE
_LOOP5:
CLR _RECV_FLG
_LOOP10:
JNB _SEND_FLG,_LOOP
CLR _SEND_FLG
MOV A,R7
INC R7
MOVC A,@A+DPTR
JZ _LOOP
MOV SBUF,A
LJMP _LOOP
_CALCULATE:
CPL P1.7
MOV A, #_RECV_BUF ;wkładamy dane do akumulatora np(004?001=)
ADD A,#3d ;przechodzimy na wartosc 3 bitu od lewej strony(4)
MOV R1,A
MOV A,@R1
SUBB A,#48d ;zamieniamy z ASCII
MOV R6,A
MOV A, #_RECV_BUF ;kolejna cyfra
ADD A,#7d ;7 bit(1)
MOV R1,A
MOV A,@R1
SUBB A,#48d ;zmiana z ASCII
ADD A,R6 ;dodajemy obie cyfry
ADD A,#48d ;zamiana na ASCI
MOV SBUF, A ;zapisanie do rejestru wyjściowego
MOV _RECV_BUF_INDEKS,#0d
RET
END
W transmisji o takich parametrach jak podajesz będzie szło:
- bit startu
- 8 bitów danych, czyli liczba 0-255
- bit stopu, skoro parzystości nie masz
więc po wykryciu ustawionego bitu 1 oznaczającego rozpoczętą transmisję czytasz 8 bitów do bufora, i masz dzięki temu całą liczbę nr 1. Potem to samo dla znaku, i drugiej liczby.
Co to w ogóle jest za asembler i procesor? Bo po nazwach rejestrów sądząc na x86 to nie wygląda.
Mikrokontroler 8051
Niestety, tego procesora nie znam :/ Btw, co będzie ci potrzebne:
Rejestry:
- https://www.elprocus.com/know-about-types-of-registers-in-8051-microcontroller/
- https://www.microcontroller-project.com/8051-microcontroller-registers.html
Asembler:
- https://www.electronicshub.org/8051-microcontroller-assembly-language-programming/
- http://plit.de/asem-51/docs.htm
Coś ekstra:
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.