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 zamienić pozycje bitów w bajcie dla LCD podłączonego do AVR?

figa_miga 01 Sie 2011 18:18 2013 15
REKLAMA
  • #1 9782668
    figa_miga
    Poziom 19  
    Posty: 585
    Pomógł: 4
    Ocena: 27
    Zrobiłem byka i źle podłączyłem LCD, czyli D0 do portu 7, D1 do portu 6. No i teraz pytanie, jak to softem naprawić tak aby to zbytnio czasu nie zajmowało?

    Może w C i AVR jest jakieś magiczne polecenie?
  • REKLAMA
  • #2 9782688
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    nie ma :D tylko ify i operacje bitowe.
  • #3 9782786
    figa_miga
    Poziom 19  
    Posty: 585
    Pomógł: 4
    Ocena: 27
    To już lepiej tablica, prośbę mam... wyplujesz w exelu takową? moje Oo coś nie bardzo chce zasłaniając się problemem z javą.
  • REKLAMA
  • #4 9782851
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    figa_miga napisał:
    Zrobiłem byka i źle podłączyłem LCD, czyli D0 do portu 7, D1 do portu 6. No i teraz pytanie, jak to softem naprawić tak aby to zbytnio czasu nie zajmowało?

    Może w C i AVR jest jakieś magiczne polecenie?


    No ale może ja czegoś nie rozumiem? w każdym bądź razie co to za problem ? żeby przekonfigurować sobie piny LCD pod inne piny procka ??? i wtedy nie trzeba żadnych tam jakichś magicznych poleceń ? ;)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dzięki takiej możliwości konfiguracyjnej to można sobie każdziutki pin posadzić nawet na innym porcie - jak się żywnie podoba i zawsze będzie działać
  • #5 9782875
    figa_miga
    Poziom 19  
    Posty: 585
    Pomógł: 4
    Ocena: 27
    Rzecz w tym że to LCD graficzne i chcę żeby cały obraz możliwie szybko się wpisał- dlatego wciskam na port całego bajta
  • Pomocny post
    #6 9783113
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #7 9783171
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    Stosując wstawki w asm można to zrobić w 8 krokach z wykorzystaniem 2 poleceń ROR i ROL (przesunięcie w prawo i przesunięcie w lewo z wykorzystaniem flagi 'C').
    Najpierw zmienną źródłową przesuwamy w prawo (ROR) bit najmniej znaczący ląduje w 'C' następnie zmienną docelową przesuwamy w lewo - na najmniej znaczący bit wpada to co jest w 'C' i tak osiem razy.

    Oczywiście można to zrobić również w C za pomocą '<<' i '>>'.
    Na początek sprawdzamy co jest w zmiennej źródłowej na pozycji najmniej znaczącej następnie wpisujemy to w najmniej znaczący bit zmiennej docelowej i przesuwamy zmienną źródłową w prawo a zmienną docelową w lewo i tak 8 razy.

    Jedna funkcja załatwia problem.
  • REKLAMA
  • #8 9783254
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #10 9783528
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    snnaap napisał:
    Nie wiem jak Tobie ale w c mi wychodzi 526 taktów - czy prędkość ta jest wystarczająca?

    Kod: text
    Zaloguj się, aby zobaczyć kod


    526 taktów to bardzo dużo jak na takie operacje. Ale nie dziwota skoro kolega np w pętli for

    używa dla zmiennej "i" zmieniającej swoją wartość w zakresie od 0 do 8 czyli wystarczyłby jeden BAJT. Tymczasem kolega niefrasobliwie dobiera sobie typ int (DWA BAJTY) - po co ??? no chyba po to żeby właśnie jak najmocniej utrudnić sobie życie i znacznie wydłużyć nie tylko działanie programu ale nawet zajętość (stosu/pamięci ram na taką zmienną dwubajtową)

    Proponuję sobie przemyśleć takie operacje - podobnie z typem zwracanej zmiennej - też int ??? i znowu funkcja traci nie tylko operacje na dwóch rejestrach ale i same obliczenia takich zmiennych przy głupim dodawaniu trwają dłużej.

    Warto się zapoznać z typem np:

    uint8_t

    bo to podstawa w przy takich operacjach.
  • #11 9783633
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    Cytat:
    Proponuję sobie przemyśleć takie operacje - podobnie z typem zwracanej zmiennej - też int ??? i znowu funkcja traci nie tylko operacje na dwóch rejestrach ale i same obliczenia takich zmiennych przy głupim dodawaniu trwają dłużej.

    Warto się zapoznać z typem np:

    uint8_t...



    Oczywiście, wybaczcie mi moją rozrzutność ;)

    Zmiana typu daje 190 taktów oszczędności (1/3 mniej - ładnie).
    Kod: text
    Zaloguj się, aby zobaczyć kod


    A teraz dla zabawy porównanie z najprostszy kodem w asm

    Kod: text
    Zaloguj się, aby zobaczyć kod


    całość zajmuje 18 taktów + oczywiście takty na przekazanie parametrów.

    Pozdrawiam
  • #12 9783732
    limak
    Poziom 13  
    Posty: 54
    Pomógł: 4
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    tak jest najszybciej tylko że marnujemy 256 bajtów flasha
  • #13 9784093
    Zbych_
    Poziom 25  
    Posty: 456
    Pomógł: 81
    Ocena: 6
    limak napisał:
    tak jest najszybciej tylko że marnujemy 256 bajtów flasha


    Na razie zmarnowałeś 256B RAMu i 256B flasha na inicjalizację :-P
  • #14 9784720
    limak
    Poziom 13  
    Posty: 54
    Pomógł: 4
    Ocena: 2
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    przecież napisałem że kosztem flasha (zapomniałem o RAMie) ale i tak to najszybsza metoda bo to prosty Lookup, potrzebuję chyba mniej niż 18 taktów
  • #15 9785033
    TWl
    Poziom 21  
    Posty: 337
    Pomógł: 42
    Ocena: 133
    A może tak?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pzdr
    TW
  • #16 9785791
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    W asemblerze to by było tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Tak na oko około 50 cykli.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik napotkał problem z podłączeniem wyświetlacza LCD do mikrokontrolera AVR, gdzie bity danych zostały zamienione. W odpowiedzi na pytanie, jak to naprawić programowo, uczestnicy dyskusji zasugerowali różne metody, w tym użycie operacji bitowych oraz tablic do odwracania bitów. Proponowano również wykorzystanie asemblera do szybszego przetwarzania, co może zredukować czas operacji. Wskazano na znaczenie użycia odpowiednich typów danych, takich jak uint8_t, aby zoptymalizować wydajność. Uczestnicy podzielili się przykładami kodu w C oraz asemblerze, które ilustrują różne podejścia do rozwiązania problemu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA