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 w Assembler ustawić dwa bity w porcie za pomocą jednej instrukcji?

cristof_w 15 Gru 2007 15:47 2315 4
REKLAMA
  • #1 4590251
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Witam.
    Mam mały problem przy pisaniu programu w Assembler i nie mogę sobie poradzić.
    Sprawa jest następująca.
    Mam instrukcję sprawdzającą czy na wejsciu jest 1 i jezeli jest to pomija nastepną instrukcję:

    sbis PORTB,SET1

    Gdy nie jest jedynką to ma wykonać kolejną instrukcję i tutaj mam zagwostkę. Potrzebuję przestawic dwa różne bity w danym porcie (jeden ma byc 0 drugi ma byc 1)
    Potrafie albo jeden ustawic albo drugi wyzerowac, niepotrafie za pomoca jednej instrukcji tego zrobic, a wlasnie potrzebuje mjiec to w jedenej instrukcji, zeby ewentualnego skoka zrobil do tego, do czego potrzeba.
    Ktoś ma pomysł jak zrobić, by za pomocą jednej instrukcji ustawić jeden port na o a drugi na 1?
    Pozdrawiam.

    Dodano po 21 [minuty]:

    Wyjaśniam dokładniej:
    Numery po lewej stronie to linijki kodu w ASM

    1.Sprawdzam konkretny bit (gdy jest równy 1 to skok do linijki 3)
    2. Ustawienie jednego bitu na np. 1 i tym samym zanegowanie innego bitu
    3. Tutaj skok

    Miałem pewną koncepcję, ale wtedy musiałbym ingerować w cały port, co nie jest dozwolone. Poprostu potrafie albo jakis bit ustawić albo wyzerować, niepotrafie jednego wyzerować a drugiego ustawić na raz.
    Jak widać, musi to zostać zrealizowane w jednej linijce, w tym problem.
    Dziękuję za zainteresowanie.
    Pozdrawiam.
  • REKLAMA
  • #2 4590336
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    To nie rób tego za pomocą jednej instrukcji, bo chyba się nie da ;)

    sbic PORTB,SET1
    rjmp WYKONANIE
    
    TWOJE INSTRUKCJE(ZMIANA STANÓW W ILU LINIACH TYLKO CHCESZ)
    
    WYKONANIE:


    Rozumiesz czy wytłumaczyć?

    Dodano po 3 [minuty]:

    Dlaczego nie możesz w cały "port" ingerować?

    in r16
    ori r16, 0x01
    andi r16, ~0x02
    out PORTB, r16

    Dany kod ustawia bit 0 i zeruje bit 1 w porcie B ... i to w jednakowym czasie ;)
  • REKLAMA
  • #3 4590349
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Chyba tak.
    Rozumiem to tak, żeby napisać poprostu gdzieś sobie podprocedurkę a tutaj w tej jednej linijce zrobic do niej tylko skok.
    Mam nadzieję, że właśnie to oto tutaj chodzi.
    Bardzo Ci dziękuję za pomoc.
    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #4 4590356
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    No o to chodziło, ale nie musisz dać tej podprocki w innym miejscu ;) zrób pomijanie kodu zmiany stanów gdy pin nie spełnia Twoich oczekiwań :)
  • #5 4590360
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Dziękuję.
    Pozdrawiam.
REKLAMA