Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

80537/80517 - Nie działająca transmisja danych przez RS232

damekr 18 Gru 2012 20:14 1992 12
  • #1 18 Gru 2012 20:14
    damekr
    Poziom 12  

    Witam, zacząłem pisać program na zaliczenie tj. Zamek szyfrowy sterowany zdalnie z terminala i odrazu pierwszy problem, chodzi o ustawienie transmisji. Mam oto taki kod:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Symulator Keil, przy linijce MOV SCON, #SCON_SET wyrzuca błąd:
    test.asm(58): error A45: UNDEFINED SYMBOL (PASS-2)

    Tłumacząc to chodzi o nie zdefiniowany symbol, ale dlaczego skoro w linijce:
    SCON_SET EQU (TR_M*64)+(TR_R*16)

    Jest definiowany oraz przypisywane są mu wartości.

    Pozdrawiam

    Z góry dzięki za pomoc!

    0 12
  • Pomocny post
    #2 18 Gru 2012 23:55
    michalko12
    Specjalista - Mikrokontrolery

    Tu nie chodzi o SCON_SET tylko o SCON
    517 ma S0CON i S1CON

    0
  • #3 05 Sty 2013 07:02
    damekr
    Poziom 12  

    Witam, przepraszam że w tym samym temacie ale sprawa dotyczy tego samego projektu. Mianowicie mam na tym mikrokontrolerze zrobić zamek kodowy z wpisywaniem kodu przez terminal w komputerze połączenie przez rs232. Nie rozumiem pewnej kwestii jak porównać kod przychodzący z terminala z tym zapisanym w kodzie programu. Np. wpisuje do terminala kod 12345

    i czy mogę to normalnie porównać z wpisanym kodem np w akumulatorze. Kod ma być maksymalnie 10 cyfrowy. Kontroler jest ośmiobitowy. Proszę pomoc jak można ten problem rozwiązać.

    Pozdrawiam

    0
  • #4 05 Sty 2013 09:39
    McMonster
    Poziom 32  

    damekr napisał:
    i czy mogę to normalnie porównać z wpisanym kodem np w akumulatorze. Kod ma być maksymalnie 10 cyfrowy. Kontroler jest ośmiobitowy. Proszę pomoc jak można ten problem rozwiązać.


    Jak chcesz zapisać 10-cyfrową liczbę decymalną w 8-bitowym akumulatorze? Musisz zebrać wszystkie cyfry, zapisać je w pamięci i porównywać parami w kolejności.

    0
  • #5 05 Sty 2013 09:42
    damekr
    Poziom 12  

    Rozumiem, czyli mogę np podzielić kod po dwie i porównywać? Czyli np

    mov r1, #12
    mov a,s0buf
    cjne a,r1,jakas_petla

    Coś w tym stylu?

    Mógłbyś mniej więcej określić jak by to miało wyglądać?

    Pozdrawiam

    0
  • Pomocny post
    #6 05 Sty 2013 09:51
    McMonster
    Poziom 32  

    Zdecydowanie prościej będzie sprawdzać po jednej cyfrze. Najpierw zbierasz wszystkie cyfry z terminala do pamięci. Potem dla każdej cyfry sprawdzasz, czy pętla się skończyła, jeśli tak, skaczesz do "sukces", jeśli nie, bierzesz cyfrę z pamięci, porównujesz z cyfrą z kodu, skaczesz do "nierawidłowy" jeśli różne, kontynuujesz jeśli równe. To w przybliżeniu, architektury i asemblera 8052 i jemu podobnych nie znam, więc więcej w tym nie pomogę.

    0
  • #7 05 Sty 2013 09:54
    damekr
    Poziom 12  

    Rozumiem, tylko nie mogę w specyfikacji odnaleźć jak ten mikroprocesor ma pamięć żeby to tego wykorzystać. Przydało by się jakies 10x8-bitowy rejestr.

    0
  • Pomocny post
    #8 05 Sty 2013 10:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Raczej 10 bajtów pamięci. Masz pamięć danych w kilku blokach - do tego w sam raz nadaje się blok o adresach 128..256, dostępny przy użyciu trybów adresowania @r0 i @r1. Zobacz w opisie asemblera, jak deklaruje się dane w pamięci RAM.

    0
  • #9 05 Sty 2013 10:10
    damekr
    Poziom 12  

    Ok dzięki, poczytam o tym. Rozumiem że poprzez adresowanie pośrednie odnosimy się do pamięci. Czyli np. dana w r0 wskazuje na miejsce w pamięci. Nie za bardzo rozumiem jak pozapisywać te dane w pamięci a potem je poprawnie odczytać. Przecież jak odczytam dane wskazane przez r0 to będzie jeden bajt (czyli moja jedna liczba), gdzie przechować resztę adresów pamięci?

    0
  • Pomocny post
    #10 05 Sty 2013 10:33
    McMonster
    Poziom 32  

    damekr napisał:
    Ok dzięki, poczytam o tym. Rozumiem że poprzez adresowanie pośrednie odnosimy się do pamięci. Czyli np. dana w r0 wskazuje na miejsce w pamięci. Nie za bardzo rozumiem jak pozapisywać te dane w pamięci a potem je poprawnie odczytać. Przecież jak odczytam dane wskazane przez r0 to będzie jeden bajt (czyli moja jedna liczba), gdzie przechować resztę adresów pamięci?

    Chodzi tutaj o adres, w 8-bitowym rejestrze zapiszesz 256 adresów jednobajtowych wartości. Jak z tego skorzystać, to musisz odwołać się do dokumentacji architektury.

    0
  • #11 05 Sty 2013 12:17
    damekr
    Poziom 12  

    A jeżeli by zastosować w tym przypadku stos? Poprostu przychodzące dane odkładać kolejno na stos, potem zdejnować i sprawdzać z zapisanym kodem od tyłu, czy to nie było by prostsze rozwiązanie?

    0
  • #12 05 Sty 2013 13:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie byłoby prostsze, tylko dziwaczne. Zastanów się, jak byś to zapisał np. w C, a potem zrób to samo w asemblerze 51. Zresztą, można prównywać bajty w miarę ich wprowadzania, nie trzeba ich składować.

    0
  • #13 14 Sty 2013 19:44
    damekr
    Poziom 12  

    Problem z transmisją rozwiązany, kod odpowiedzialny za ustawienie parametrów transmisji:


    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0