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

Jak ustawić 10 pinów portów w stan wysoki za pomocą wskaźników?

sandarak24 20 Lut 2012 11:00 1988 24
  • #1 10571386
    sandarak24
    Poziom 12  
    Chciałbym stworzyć tablicę, w której będę miał ustawionych 10 pinów różnych portów w stan wysoki.
    Prawdopodobnie trzeba użyć wskaźników, tylko wszelkie próby nic nie dają.:)
    Może ktoś coś podpowie?:)
  • #2 10571679
    Konto nie istnieje
    Konto nie istnieje  
  • #3 10572212
    sandarak24
    Poziom 12  
    To może podpowiedź, jak po kolei powinienem się za to zabrać :?:
  • #4 10572268
    Konto nie istnieje
    Konto nie istnieje  
  • #6 10572332
    Konto nie istnieje
    Konto nie istnieje  
  • #7 10572696
    sandarak24
    Poziom 12  
    Wydaje mi się że jasno okręśliłem problem, który chce rozwiązać, potrzebuję po prostu tablicę, w której będę miał włączone różne piny z różnych portów w stan wysoki, a potrzebne mi to jest do sterowania pewnym układem scalonym. Myślę że nie ma sensu żebym opisywał głebiej zagadnienie.
  • #8 10572763
    mirekk36
    Poziom 42  
    sandarak24 napisał:
    Wydaje mi się że jasno okręśliłem problem, który chce rozwiązać, potrzebuję po prostu tablicę, w której będę miał włączone różne piny z różnych portów w stan wysoki, a potrzebne mi to jest do sterowania pewnym układem scalonym. Myślę że nie ma sensu żebym opisywał głebiej zagadnienie.


    Masz rację nie opisuj dalej i głębiej zagadnienia, bo być może zmierzasz w ślepy zaułek albo idziesz niewłaściwą drogą - ale co tam, nie ważne.

    A tu jak sam widzisz opis i pomysł jest na tyle pokręcony, że człowiek tzn jeden z kolegów próbuje zgadywać co poeta miał na myśli ale mu się nie udaje. Takim sposobem to temat jeszcze potrwa przez pięć stron i się nie dogadacie.

    Dlatego panie kochany, jak się oczekuje precyzyjnej podpowiedzi/porady - to właśnie się dogłębnie opisuje zagadnienie a nie tak jak ty to robisz.

    Pytania wbrew pozorom też trzeba umieć zadawać.
  • #9 10572827
    sandarak24
    Poziom 12  
    Załóżmy że potrzebuje mieć tablicę 5-elementową, której elementami będą: pin3 portu A, pin 4 portu B, pin1 portu C, pin 6 portu E i pin 2 portu F ustawione w stan wysoki. Dlatego chce mieć taką tablicę bo chce ją indeksować w pętli, pozbędę się dzięki temu kilku ifów i ułatwi mi to napisanie pewnej funkcji.
  • #10 10572829
    Konto nie istnieje
    Konto nie istnieje  
  • #11 10573608
    szelus
    Poziom 34  
    :arrow: sandrak24
    Chcesz mieć tablicę, gdzie będziesz miał wpisane numery portów i bitów do ustawienia w programie w stan wysoki? O to chodzi? Bo, prawdę mówiąc, też nie rozumiem, co znaczy, że porty ustawione w tablicy...
    W każdym razie, jeżeli chodzi chodzi o to, co napisałem, to np.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Powyższy kod robi, co ma robić, ale z góry zaznaczam, że nie jest to prawdopodobnie najbardziej efektywny sposób. Kod działający na wskaźnikach odczytywanych z tablicy z założenia nie będzie super szybki na AVR.
    W dodatku, w ten sposób utworzysz kopię tablicy my_ports[] zarówno w pamięci flash jak i RAM. Aby oszczędzić RAM należałoby skorzystać z PROGMEM co dodatkowo skomplikuje ten kod zarówno na poziomie źródłowym (funkcje pgm_read_...) jak i wynikowym.
  • #12 10576979
    tehaceole

    Poziom 28  
    Kolega sandrak24 dawkuje nam informacje, stopniując napięcie niczym Alfred Hitchcock... Od dobrych paru godzin zachodzę w głowę: co Kolega chce osiągnąć? Kod podany przez Kolegę szelus zadziała zgodnie z założeniami Autora, tylko czy Autor przedstawił nam już wszystkie założenia?
    Co koledze da zastosowanie powyższego kodu w swoim programie? Osobiście, gdy potrzebuję "grupowo" sterować naraz wieloma pinami, to korzystam ze sprawdzonych procedur podobnych do tych:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    gdzie SET_xx i CLR_xx to
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Oczywiście powyższy kod wymaga przerobienia, aby sterować 10 różnymi pinami zamiast czterema (i to jeszcze w trybie półbajtowym), ale to nie stanowi żadnego problemu. No chyba, że obwód sterujący miałby jakieś "ALE" do funkcji resetdata(). Lecz to także nie stanowi problemu - wystarczy zmodyfikować sposób ustawiania/kasowania bitów z pominięciem tej funkcji.
    Wywoływałby Kolega tylko funkcję ZapiszPorty(Liczba) gdzie Liczba to uint16_t zawierający stany portów.

    Powyższe rozwiązanie (lub jemu podobne) używane jest przez tysiące programistów (przynajmniej do obsługi LCD alfanumerycznego), więc chyba takie złe nie jest.


    Tak rozmyślając o Kolegi problemie zaczyna mi świtać pewna myśl... Pisząc obsługę klawiszy i wejść do mojego urządzenia, dla ułatwienia najpierw mapowałem sobie wszystkie 8 wykorzystywanych (na różnych portach) wejść do jednej zmiennej uint8_t, następnie to ta zmienna była poddawana dalszej obróbce. Kolega zdaje się chce zrobić operację odwrotną...

    Proponowałbym przyjrzeć się funkcji SuperDebounce z książki Kolegi Mirka (inną wariację tego typu funkcji znalazłem ostatnio gdzieś w necie, plus oczywiście moja jej odmiana a także wiele innych odmian Kolegów). Nadal jednak nie rozumiem po co Koledze to tablicowanie i zapętlanie :)
  • #13 10577029
    Konto nie istnieje
    Konto nie istnieje  
  • #14 10577315
    sandarak24
    Poziom 12  
    Nie wiem skąd taka nerwowość, przecież jak ktoś nie chce odpowiadać to niech nie odpowiada, poza tym skorzystałem z podpowiedzi i napisałem coś takiego

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>

    #define PORTA_ADDR (0x1B)
    #define PORTB_ADDR (0x18)
    #define PORTC_ADDR (0x15)
    #define PORTD_ADDR (0x12)
    #define PORTE_ADDR (0x03)
    #define PORTF_ADDR (0x62)

    typedef enum Ports_Idx_Tag
    {
    PORT_A_IDX = 0,
    PORT_B_IDX,
    PORT_C_IDX,
    PORT_D_IDX,
    PORT_E_IDX,
    PORT_F_IDX,
    PORT_NUM_IDX
    } Ports_Idx_T;

    static uint8_t ports_tab[] =
    {
    PORTA_ADDR,
    PORTB_ADDR,
    PORTC_ADDR,
    PORTD_ADDR,
    PORTE_ADDR,
    PORTF_ADDR
    };


    int main(void)
    {
    uint8_t i;

    for(i = 0; i < PORT_NUM_IDX; i++)
    {
    *(volatile uint8_t *)(ports_tab[i]) = 0x22;
    }

    return EXIT_SUCCESS;

    Dodano po 2 [minuty]:

    Poza tym nie denerwujcie sie na mnie tak, od 3 miesięcy programuje i może jeszcze nie umiem tak wszystkiego ładnie ubrać w słowa i określić szczegółowo.

    Dodano po 1 [sekundy]:

    Poza tym nie denerwujcie sie na mnie tak, od 3 miesięcy programuje i może jeszcze nie umiem tak wszystkiego ładnie ubrać w słowa i określić szczegółowo.
  • #15 10581188
    sandarak24
    Poziom 12  
    A tutaj jest kod programu który służy do wyświetlania znakow na matrycach LED 5x7, które wysterowywane sa przez uklady MBI5026 podpięte do Atmegi128. A cała rzecz polega na tym ze w funkcji Matrix chciałbym sie pozbyć ifów i elsów tak żeby to robić w jednej pętli.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 10581221
    mirekk36
    Poziom 42  
    A widzisz -jak byś od razu to napisał - to tak jak mówiłem ktoś szybko podpowiedziałby ci, że to co próbujesz zrobić to totalne nieporozumienie i wcale nie ma co ślepo brnąć tą drogą. Temat wyświetlania znaków na wyświetlaczach graficznych wszelkiej maści nie jest nowy i są nawet już oklepane sposoby - proste sposoby jak to się robi. A ty próbujesz wymyślać koło od nowa i w tajemniczy sposób pytasz jak rozwijać pomysły, które prowadzą do nikąd - mowa tu oczywiście o tej tablicy bitowej dla portów.
  • #17 10581300
    sandarak24
    Poziom 12  
    Więc może jakoś rozwiążemy kwestie tych ifów :) :?:

    Zwracam koledze uwagę, że na tym forum, regulamin obowiązuje każdego użytkownika.
    3.1.13. (10.9, 15) Zabronione jest publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych.
    [zumek]
  • #18 10585527
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #19 10586730
    szelus
    Poziom 34  
    @sandrak24
    Niestety, dalej nie wyjaśniłeś, co chcesz osiągnąć i trzeba się domyślać. Z Twojego programu paru rzeczy nie rozumiem bez tych wyjaśnień.
    1. Znak jest zdefiniowany przez 16*5 = 80 bitów? To znaczy, że jeden znak zajmuje dwie matryce?
    2. W programie obsługujesz trzy układy MBI. Masz ich więcej i planujesz obsłużyć wszystkie? Dobrze rozumiem?
    3. Zwróć uwagę, że bit może przyjmować tylko wartości 0 i 1 (o ile nie stosujesz logiki rozmytej :wink:). Jak już sprawdzisz, że bit nie jest jedynką, to znaczy, że jest zerem i nie ma sensu tego dodatkowo sprawdzać (aczkolwiek kompilator i tak powinien usunąć to sprawdzenie).
    4. Jeżeli bity masz rozproszone faktycznie po wielu portach, to if-y wcale nie są takie złe. Możesz ewentualnie nieco uprościć zapis:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Niestety, makro ma tutaj swoje wady - jest sprytne, ale nie widać, że pierwszy argument nie może być zmienną i nie można użyć pętli for. Dlatego lepiej unikać takich sztuczek z konkatenacją, zdefiniować stałe na numer portu i bitu dla każdej linii i takie argumenty przekazywać do makra.

    5. W mikrokonrolerach pisanie "generycznego" kodu przeważnie jest kosztowne. Najlepsze efekty uzyskuje się dopasowując do siebie sprzęt i oprogramowanie. Biorąc to pod uwagę, jeżeli np. masz układy MBI na dwóch portach i kolejnych bitach, można zapis podzielić na dwie części, w każdej składając kawałek bajtu z zawartości tablicy znaków i następnie wysyłać go na port:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Nie jestem przekonany, czy byłoby to lepsze rozwiązanie w tym przypadku.
  • #20 10586965
    Konto nie istnieje
    Konto nie istnieje  
  • #21 10587368
    mirekk36
    Poziom 42  
    Saabotaz napisał:

    Żeby było śmieszniej to każdy próbuje napisać program do sterowania matryc które nawet nie wiadomo jak i przez co są podłączone.


    ;) i to mi się najbardziej podoba - no, ale może komuś się uda trafić z podpowiedzią i wstrzeli się akurat w schemat autora - tymczasem to kolejna zagadka hmmm rebus z jego strony.
  • #22 10591316
    sandarak24
    Poziom 12  
    Dziękuje Szelus bardzo konkretny opis.
    Mam 13 układów MBI mam każdy podłączony do innego portu, tablica w której siedzą znaki, dlatego taka jest bo chciałem żeby było po kolei zgodnie z kodem ASCII, czyli pierwszy wymiar służy jako indeks a drugi jako odpowiednia kombinacja bitów do wyświetlenia odpowiedniego znaku.Układ MBI ma 16 wyjść, ja używam 12(5 wierszy i 7 kolumn). nie wpisałem jeszcze wszystkich znaków do tej tablicy. Sterowanie przez SPI nie wchodzi w tym momencie w gre bo już płytka jest tak wykonana że MBI nie są ze sobą połączone. Poza tym uważam że jak mam tyle portów to mimo wszystko łatwiej jest nimi sterować z osobna każdym niż przez SPI.
  • #23 10591492
    Konto nie istnieje
    Konto nie istnieje  
  • #24 10591603
    sandarak24
    Poziom 12  
    Ale akurat ja potrzebuje mieć konkretną ilość matryc, a dokładnie 13, poza tym skoro już tak jest to nie da sie tego zmienić, więc trzeba sobi radzić z tym co jest. Dzięki za pomoc i wiele niemiłych uwag.

    Dodano po 1 [minuty]:

    Koledze Szelusowi dziękuje za cenne uwagi. Jedyny który po prostu pomógł a nie zjechał.
  • #25 10608748
    szelus
    Poziom 34  
    Jednak głównie sam jesteś sobie winien, bo zamiast od razu podać szczegóły, to zadajesz mało konkretne pytania oczekując, że wszyscy się domyślą o co Co chodzi. Twoje pierwsze pytanie sugerowało już, że robisz coś dziwnego, ale bez szczegółów to trzeba wróżki...

    Owszem, czasami tak jest, że układ został zrobiony bez sensu i trzeba się z tym męczyć, ale w takiej sytuacji, oczekując pomocy tym bardziej należałoby podać szczegóły Twojego rozwiązania. Teraz, jak już wiem, że faktycznie jak pisał Saabotaż próbujesz dziwacznie rozwiązać multipleksowanie, to mógłbym podać Ci parę pomysłów jak to zrobić efektywniej na tym sprzęcie, co masz. Ale ciągle brak detali (które porty, które linie MBI sterują kolumnami, a które wierszami itd.), a naprawdę nie chce mi się już opisywać wariantowo wielu rozwiązań, bo może coś podpasuje do Twojego układu.
    Np. jeżeli już nie masz układów MBI podłączonych pod SPI, to korzystając z funkcji LE prawdopodobnie można sobie odpuścić wysyłanie czterech z 16 bitów, ale znowu - zależy co i jak masz połączone.
    Poza tym, odczytywanie z tablicy zawartości kolumny nie ma sensu, bo i tak tam może być tylko jedna jedynka i w dodatku ta sama dla wszystkich matryc.
    itp. itd.
REKLAMA