logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zaimplementować adresowanie pośrednie w asemblerze dla portu szeregowego?

bolek 05 Sty 2003 16:01 6071 7
REKLAMA
  • #1 76224
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Hello!
    Może mi Ktoś wytłumaczyć jak się robiło następującą rzecz: załóżmy że odbieram dane z portu szeregowego i chce mieć do tego małą, zgrabna i szybką procedurkę na przerwaniu (odebranie bajtu = zgłoszenie przerwania). Zastanawiam się jak zrobić taki manewr aby każdy odebrany znak został automatycznie zapisany do komórki o adresie większym o jeden od poprzedniego, a jak odbierze np: 8-smy bajt to program automatycznie ustawia się na bajt pierwszy- to się chyba nazywało adresowanie pośrednie (???). w moim programie czekanie aż procek odbierze 8 bajtów danych to wieczność i pomyślałem sobie że ten sposób będzie idealny
  • REKLAMA
  • #2 76258
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    Najlepiej użyć do tego jeden z rejestrów indeksowych (R0, R1).
    Najpierw ustawiasz sobie adres bufora RAM, w rejestrze np. R0:
    MOV R0,#50 ;WPISZ DO REJESTRU INDEXOWEGO ADRES RAM

    W programie obsługi przerwania od szeregowego piszesz:

    MOV @R0,SBUF ;ZAPISZ ODEBRANY BAJT DO RAM
    INC R0 ;ZWIEKSZ ADRES RAM
    CJNE R0,#58,PR_GOTOWE ;JESLI TO BYL 8 BAJT, TO GOTOWE

    Procedurę PR_GOTOWE umieszczasz wewnątrz obsługi przerwania! - potem musi być RETI.

    Przed powtórną transmisją musisz znowu ustawić adres bufora w R0.

    Pozdrawiam.
  • REKLAMA
  • #3 76264
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Odpowiedniki 51 DALLASA/MAXIMA maja nawet dodatkowa instrukcje ktora automatycznie inkrementuje R0 po przesłaniu.
  • REKLAMA
  • #4 76698
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    :arrow: Marek
    z tego co rozumiem to ten adres pośredni to "małkpa"?.
    Jeśli zdeklaruje sobie pierwszy bajt np: BAJT_1 EQU 20H to do rejestru R0 muszę wpisać MOV R0, #20H i wtedy po każdym odebranym bajcie zwiększyć R0 (aż do 28H)?--- ni?!

    to fajnie Chłopaki-dzieki
  • REKLAMA
  • #5 76883
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    Dokładnie tak.
    MOV @R0,A - oznacza że akumulator zapisywany jest do komórki RAM, o adresie znajdującym się w R0.

    Pozdrawiam.
  • #6 76928
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    O!
    Znów zaczynam lubieć asembler... bo mi program działa tak jak ma.
    Ale i w tym przypadku nie obyło się bez kłopotu (problem już rozwiązałem). Jak deklaruje zmienne to byłem nauczony robić to w ten sposób
    ZMEINNA EQU 20H
    ZMEINNA1 EQU 21H
    .
    .
    .
    ZMIENNAx EQU 29H
    ZMEINNAy EQU 30H—i tu jest błąd!. Ja adresuje w hex’ie a myślę w dec’ach. I mój program wysyłał za dużo danych (adres od 27h do 32h- a powinno być od 27h do 2Ch)...
    I teraz w związku z tym pytanko: deklaracja bitu wygląda tak: BIT EQU 34H.0- i to u mnie działa, ale nie działa coś takiego przy użyciu systemu dziesiętnego np.: BIT EQU 34.0- jak to powinno być poprawnie napisane?
  • #7 76954
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    Nie wiem dlaczego tak masz. Ja zwykle gdy deklaruje bity, np. jako znaczniki, to korzystam z obszaru RAM o adresach 32-47 (20H-2FH). Jest to tzw. pamięć adresowana bitowo. W tym obszarze możesz adresować bity bezpośrednio od 0 do 127. Na przykład:
    BIT_ZAŁ EQU 0 ;przyporządkowuje nazwę BIT_ZAŁ do komórki 32.0 (20H.0)
    BIT_WYŁ EQU 8 ;przyporządkowuje nazwę BIT_WYŁ do komórki 33.0 (21H.0)
    Podaję Ci link do dość dobrego opracowania '51:
    http://www.ampr.intertele.pl/sq8feu/8051/

    Pozdrawiam.
  • #8 7002379
    Piesiu567
    Poziom 12  
    Posty: 80
    Widze, ze temat stary jak świat, ale moze ktos odpowie. Interesuje mnie jaka jest różnica między MOV @DPTR,A; i MOV @R0,A; w 8051.
    Rozumiem, że @R0 to swego rodzaju "wskaźnik” na daną komórkę pamięci, a z tego co się orientuję rejestr jest 32 bitowy, komorki RAMu są indeksowane 64 bitowo. Jeżeli tak to jak to ma prawo działać? Czy DPTR odnosi się tylko do pamięci zewnętrznej, czy może też do RAMu?

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji adresowania pośredniego w asemblerze mikrokontrolera 8051 do obsługi odbioru danych z portu szeregowego w przerwaniu. Proponowane rozwiązanie wykorzystuje rejestry indeksowe R0 lub R1 jako wskaźniki do bufora RAM, gdzie każdy odebrany bajt jest zapisywany pod adresem wskazywanym przez R0, a następnie R0 jest inkrementowany. Po odebraniu określonej liczby bajtów (np. 8) adres jest resetowany do początku bufora, co umożliwia cykliczne zapisywanie danych. Przykładowy kod asemblera pokazuje instrukcję MOV @R0,SBUF do zapisu bajtu oraz CJNE do sprawdzania liczby odebranych bajtów. Wspomniano także o specjalnych instrukcjach w niektórych układach Dallas/MAXIM, które automatycznie inkrementują R0. Poruszono również kwestie deklaracji zmiennych i bitów w pamięci RAM adresowanej bitowo (adresy 20H-2FH), gdzie można bezpośrednio adresować pojedyncze bity. Na koniec pojawiło się pytanie o różnicę między instrukcjami MOV @DPTR,A i MOV @R0,A w 8051, z wyjaśnieniem, że DPTR służy do adresowania pamięci zewnętrznej, a R0 do wewnętrznej RAM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA