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

AT90S2313: Jak usunąć starsze bity z PORTB i porównać z tablicą?

adasb 29 Maj 2006 17:09 1215 9
REKLAMA
  • #1 2676102
    adasb
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 4
    Cześć. Mam pewien problem.
    Pisze program na AT90S2313 w AVRStudio.
    W mikroprocku wykorzystuje PORTB. Na wejscie procka mam podłączone ważne dane (b0-b3) -4 bity które są zanegowane. Musze porównać te dane z wartością tablicy. Jak usunąć 4 starsze bity które wprowadzane są do portu B. Zrobienie maski nie da żadnych efektów. Porównywanie z tablicą robić równolegle czy szeregowo który sposób bedzie najlepszy. Isnieje jakaś komenda na 2313 lub czy można wykorzystać jakąś funkcję w avrstudio żeby poruszać się po młodszej lub starszej części 8 bitowego dowolnego rejestru.
    Z góry dzieki za pomoc.
    Pozdrawiam
  • REKLAMA
  • #2 2676273
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Czytasz z rejestru PINB, i dajesz maskę 0x0F, inaczej się nie da. AVR (ani żadne inne znane mi uC) nie oferują możliwości operowania na półbajtach. A jeśli porównujesz to z tablicą to najwygodniej jest porównywać od razu całymi bajtami. Masz zresztą rozkaz cp (cpi), który służy do porównywania ;)
  • REKLAMA
  • #3 2676290
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Opisz dokładniej , o co Ci chodzi , bo jasnowidzem nikt(prawie) nie jest.Jak są ułożone dane w tablicy , z którymi chcesz porównywać otrzymany półbajt itd...

    Piotrek
    PS
    W jakim języku piszesz ??
  • #4 2677644
    adasb
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 4
    Pisze program w asemblerze.
    Oto dokładnie o co mi chodzi.
    Chce porównać daną którą mam w tablicy np. 00000010 z daną wprowadzaną do portuB. Młodsza część portu B (b0-b3) to dane które są ważne. Starsza część mnie nie interesuje. Ponadto młodsza część jest wprowadzana do procka jako negacja ponieważ tak jest reprezentowana dana z poprzedniego układu cyfrowego i nie da się jej zmienić. Jak porównać te dwa bajty.

    np.
    porównuje daną pobraną z tablicy z daną którą wprowadzam na portB które są sobie równe.

    cała dana w tablicy - 0b00000010
    dana z portu - starsza 4 nie istotna=0101 ,
    mlodsza 4 jest negacją 0010 czyli 1101
    cała dana podana na port = 0b01011101
    czyli porównuje 0b00000010 z 0b01011101
    Jakie wykonać mam operacje aby te dwie liczby były sobie równe .
  • #5 2677827
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    1. Negujesz odebraną wartości
    2. Działasz maską 1111
    3. porównujsz...
    Kolega Zaquadnik podał ci już przepis wcześniej
  • REKLAMA
  • #6 2678259
    adasb
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 4
    powyższa procedurka nie działa.

    np. Tab: 0b00000010
    PortB: 0b10101101

    1. negacja portu - 01010010
    2. maska na port 11110000 - czyli 10010001
    3. porownanie z tablicą nie jest ta samą wartoscią

    Problem dalej pozostaje
    Dzieki za zainteresowanie i czekam na dalsze pomysły
    Pozdrawiam

    Dodano po 54 [minuty]:

    Dobra dzieki za pomoc.
    Sam się pomyliłem.
    Zamiast robić sumę logiczną OR robiłem ADD.
    Dziekuje wszystkim za pomoc.
    Pozdrawiam

    Temat uważam za zamknięty.
  • REKLAMA
  • #7 2678430
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 570
    Metod jest pare pierwsza to dodac do wartości z portu 11110000
    nastepnie zanegować
    dostaniesz swoja liczbe zanegowana i 0000XXXX sprawdz . Inne kombinacje możesz sprawdzić kalkien do windy w wejsji naukowej
  • #8 2678546
    Piotr PIeczykolan
    Poziom 12  
    Posty: 14
    Pomógł: 3
    Ocena: 1
    Zrób iloczyn logiczny z maską 0b00001111

    Piotr
  • #9 2702232
    adasb
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 4
    Dziękuje wszystkim za pomoc w rozwiązaniu problemu.
    Pozdrawiam

    Temat uważam za zamkniety.
  • #10 2702366
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 159
    Są też rozkazy sbr, cbr uzywane do maskowania.
    Pozdr. N.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu programowania mikrokontrolera AT90S2313 w asemblerze, polegającego na porównaniu 4 młodszych bitów (b0-b3) portu B, które są zanegowane, z wartością przechowywaną w tablicy. Kluczowym zagadnieniem było usunięcie starszych 4 bitów portu B oraz prawidłowe porównanie danych. Zalecane rozwiązanie to zastosowanie maski bitowej 0x0F (0b00001111) do wyizolowania młodszych bitów oraz negacja odczytanej wartości, aby uwzględnić odwróconą reprezentację danych. Porównanie można wykonać instrukcją cp/cpi na całych bajtach po odpowiedniej obróbce bitowej. W trakcie dyskusji pojawiły się sugestie użycia rozkazów sbr i cbr do maskowania bitów. Autor potwierdził, że problem rozwiązał, po poprawnym zastosowaniu negacji i maski oraz uniknięciu błędu polegającego na użyciu dodawania zamiast operacji logicznej OR. Porównywanie danych najlepiej wykonywać na całych bajtach po odpowiednim przygotowaniu danych, gdyż mikrokontroler nie oferuje operacji na półbajtach.
Wygenerowane przez model językowy.
REKLAMA