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.

Operacje na bitach - ATmega32

Leon90 18 Kwi 2012 18:23 993 5
  • #1 18 Kwi 2012 18:23
    Leon90
    Poziom 11  

    Witam!
    Mógłby mi ktoś podsunąć jakiś pomysł na rozwiązanie na następujące zadanie?
    W rejestrze mamy zapisane bity np R16=10110001. Należy wziąć dwa pierwsze bity słowa i wrzucić je na bramkę AND a wynik (jeden bit) zapisać w R17. Tak samo dla 3 pozostałych par bitów w R16 (3-4 5-6 7-8). W rezultacie w R17 wynik powinien zajmować 4 pierwsze bity. Czy jest rozkaz wykonujący mnożenie na pojedynczych bitach rejestru?
    Z góry dzięki za pomoc

    0 5
  • #2 18 Kwi 2012 19:07
    tmf
    Moderator Mikrokontrolery Projektowanie
  • #3 18 Kwi 2012 19:13
    Leon90
    Poziom 11  

    Ale rozkaz AND operuje w assemblerze na całych rejestrach a ja muszę wykonać tą operacje na 2 sąsiednich bitach. Myślałem, żeby skorzystać z rozkazu SBRC tzn, jeżeli jakiś bit jest zerem to skaczemy do podprogramu który wpisuje zera na odpowiednie miejsca, i powtarzam to 4 razy. Jest może jakiś prostszy sposób?

    0
  • #4 18 Kwi 2012 19:26
    mirekk36
    Poziom 42  

    Leon90 napisał:
    Ale rozkaz AND operuje w assemblerze na całych rejestrach


    A ja bym ci radził jednak doczytać co robi rozkaz AND w asemblerze - bo totalnie źle sobie wytłumaczyłeś jago działanie. Toż on jest właśnie do tego o co tobie chodzi. Pisał ci już tmf - a ty jak rozumiem wytłumaczyłeś mu że nie da rady z AND ? hmmm no fajnie.

    0
  • #5 18 Kwi 2012 19:56
    Leon90
    Poziom 11  

    Zrobiłem to trochę inaczej ale wiem, że nie jest to zbyt optymalne rozwiązanie. Z tym AND nie za bardzo wiem jak to zrobić :(

    Code:

          .INCLUDE "M32DEF.INC"
          .ORG   0X00
          LDI      R16,LOW(RAMEND)
          OUT      SPL,R16
       
          RJMP   START
    START:
          LDI      R16,0B00000000
          SBRS   R16,0
          CALL          WPIS_1
          SBRS   R16,1
          CALL   WPIS_1
    ET1:
          SBRS   R16,2
          CALL     WPIS_2
          SBRS   R16,3
          CALL           WPIS_2
    ET2:
          SBRS   R16,4
          CALL          WPIS_3
          SBRS   R16,5
          CALL          WPIS_3
    ET3:
          SBRS   R16,6
          CALL          WPIS_4
          SBRS   R16,7
          CALL           WPIS_4
    ET4:      
                    OR      R17,R18
          OR      R17,R19
          OR      R17,R20
          RJMP           START


    WPIS_1:
          LDI      R17,0B00000010
          RJMP    ET1
    WPIS_2:
          LDI      R18,0B00001000
          RJMP    ET2
    WPIS_3:
          LDI      R19,0B00100000
          RJMP    ET3
    WPIS_4:
          LDI      R20,0B10000000
          RJMP    ET4

    aha te bramki to jednak były NAND. Wyniki mają być na parzystych bitach

    0
  • #6 18 Kwi 2012 21:19
    excray
    Poziom 39  

    Nie ma takiego rozkazu. Musisz rozpisać na kilku innych rozkazach. Na przykład tak:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0