ASEMBLER dzielenie na cyfry setek, dziesiątek, jedności - Transmisja szeregowa 8051

0

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?

0

Hmmm to chyba bardziej tutaj chodzi o właściwy odbiór przesyłanych transmisją szeregową liczb, zgadza się?

0
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ć.

0

Masz gdzieś dokumentację protokołu jakim będą słane dane, albo nazwę oraz parametry jeśli to jakiś ustandaryzowany, np RS-232?

0

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
0

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.

0

Mikrokontroler 8051

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0