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

Gray na 7 segmentowy - jak?

c_04 11 Cze 2010 09:05 5171 18
  • #1 8177791
    c_04
    Poziom 21  
    Witam
    Kompletnie nie znam sie na programowaniu i nawet nie za bardzo wiem od czego zaczac ale sciagnalem z neta jakas demonstracje napisana przez kogos majaca tlumaczyc kod ASCII na 16 segmentowy. Pomyslalem, ze powinno byc proste zmienic przyporzadkowanie kodu ASCII do konkretnych znakow podmieniajac im to co ma wystapic na wyjsciu pamieci - bo wlasnie tak chce to zbudowac... Wgrac w pamiec EEPROM taki maly wsad ktory by mi przetlumaczyl konkretne stany na wejsciach adresowych na inne ale na wyjsciach. Po jakims czasie wymalowalem cos takiego:

    ;
    ;***************************************************
    ;***************************************************
    ;********************    decoder v.1   *********************
    ;*******************   gray to 7seg   *********************
    ;***************************************************
    ;***************************************************
    ;
          .list
    .equ SegmA = 1<<0
    .equ SegmB = 1<<1
    .equ SegmC = 1<<2
    .equ SegmD = 1<<3
    .equ SegmE = 1<<4
    .equ SegmF = 1<<5
    .equ SegmG = 1<<6
    .equ SegmH = 1<<7
    .equ Space = 0
    ;
    
          .cseg
          .org 0
    
    ;     znak kod=0x00 'gray 0 dis C1'
          .dw SegmB+SegmC+SegmH
    ;     znak kod=0x01 'gray 1 dis C2'
          .dw SegmA+SegmB+SegmD+SegmE+SegmG+SegmH
    ;     znak kod=0x02 'gray 2 dis C4'
          .dw SegmB+SegmC+SegmF+SegmG+SegmH
    ;     znak kod=0x03 'gray 3 dis C3'
          .dw SegmA+SegmB+SegmC+SegmD+SegmG+SegmH
    ;     znak kod=0x04 'gray 4 dis C8'
          .dw SegmA+SegmB+SegmC+SegmD+SegmE+SegmF+SegmG+SegmH
    ;     znak kod=0x05 'gray 5 dis C7'
          .dw SegmA+SegmB+SegmC+SegmH
    ;     znak kod=0x06 'gray 6 dis C5'
          .dw SegmA+SegmC+SegmD+SegmF+SegmG+SegmH
    ;     znak kod=0x07 'gray 7 dis C6'
          .dw SegmA+SegmC+SegmD+SegmE+SegmF+SegmG+SegmH
    ;     znak kod=0x08 'gray 8 dis 16'
          .dw SegmA+SegmC+SegmD+SegmE+SegmF+SegmG
    ;     znak kod=0x09 'gray 9 dis 15'
          .dw SegmA+SegmC+SegmD+SegmF+SegmG
    ;     znak kod=0x10 'gray 10 dis 13'
          .dw SegmA+SegmB+SegmC+SegmD+SegmG
    ;     znak kod=0x11 'gray 11 dis 14'
          .dw SegmB+SegmC+SegmF+SegmG
    ;     znak kod=0x12 'gray 12 dis C9'
          .dw SegmA+SegmB+SegmC+SegmD+SegmF+SegmG+SegmH
    ;     znak kod=0x13 'gray 13 dis 10'
          .dw SegmA+SegmB+SegmC+SegmD+SegmE+SegmF
    ;     znak kod=0x14 'gray 14 dis 12'
          .dw SegmA+SegmB+SegmD+SegmE+SegmG
    ;     znak kod=0x15 'gray 15 dis 11'
          .dw SegmB+SegmC
    ;     znak kod=0x16
          .dw Space
    .exit


    Mam pytanie czy jezeli pamiec np 27c128 bedzie miala te puste komorki to musze dopisac pozostale kombinacje wejsc adresujacych czy wystarczy, ze jest ich tylko 8, a pozostale nie musza byc. Tzn chodzi mi czy w przypadku kiedy pamiec ma np 16 wejsc adresowych tj A0-A15 (np) to czy musze dopisac linie equ segmI, J, K?
    I w koncu jak sprawdzic czy ten "program" dziala? Potrzebuje jakiegos kompilatora ale sciagnalem z neta jakis, ktory wyswietlil mi komunikat, ze .list nie jest poprawnym rozkazem (illegal).
    Prosze o pomoc. Chcialbym to wgrac i miec to z glowy. Na wejsciu ma byc obrotowy zadajnik w kodzie graya zwierajacy do masy czyli te 8 wejsc adresowych normalnie bede mial na stanie wysokim, tyle ze w pozycji 1 zadajnik ustawi im wszystkim 0000. Na wyjscia chce podpiac 2 wyswietlacze LED 7 segmentowe z tym, ze w tym pokazujacym 10 na stale bedzie swiecic 1 i kiedy oba wyswietlacze beda mialy pokazywac jednosci czyli od 1 do 9 to dodatkowo zaswiecany ma byc na 1 wyswietlaczu C co z 1 da 0.
    Pozdrawiam

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • #2 8178185
    arnoldziq
    VIP Zasłużony dla elektroda
    Jakiego procesora lub uC dotyczy zamieszczony kod ?
  • #3 8178198
    c_04
    Poziom 21  
    To nie dotyczy zadnego procesora. Zadaje stany na wejsciach adresowych za pomoca enkodera czy jak to sie zwie (taki jakby przelacznik o 16 pozycjach). I z wyjsc O0-O7 chce odczytywac na wyswietlaczu LED juz cyferki. Cala zabawa dotyczy pamieci EPROM, EEPROM czy jak zwal te kasowane UV.
    Dziekuje za jakis ruch w temacie:)
  • #4 8178219
    arnoldziq
    VIP Zasłużony dla elektroda
    Z tego co się orientuję, proszę mnie poprawić, jeżeli się mylę, to większość enkoderów pokazuje ustawienia w kodzie BCD.
    Czy pamięci o których kolega wspominał, są w stanie przyjąć tego typu adresowanie?
    Jak kolega chce wyzwolić trigger w pamięci aby pokazała stan/zawartość konkretnego adresu na pinach wyjściowych ?
  • #5 8178239
    c_04
    Poziom 21  
    No wlasnie problem polega na tym ze w urzadzeniu mam adresowanie w kodzie graya, a odczytac chce dziesietnie... czyli komplikacja bylaby sporawa gdyby to chciec np na bramkach;)
    A pamiec mowimy o tej nie szeregowej tylko rownoleglej... wszystkie wyjscia sa dostepne naraz. Nie ma taktowania. Zadajnikiem jest ten przelacznik. Chce to zrobic najprosciej jak sie da.
    Ahhh no nie wzialem pod uwage ze to 4 bity. Musze to jeszcze raz chzba przemyslec.

    Tu jest lista jak wygladac maja stany wejsciowe na wejscia adresowe, a co na wyjsciach musialbym to przekodowac na 7 segmentow (w tym "programie" juz to zrobilem)
    Gray na 7 segmentowy - jak?
  • #6 8178364
    arnoldziq
    VIP Zasłużony dla elektroda
    Ja bym to jednak na bramkach zrobił.
    Wiesz co zadajesz enkoderem, wiesz co chcesz uzyskać. Tablice Karnaugh’a, minimalizacja i sądzę że w kilku, może kilkunastu, bramkach się zamkniesz.
  • #7 8178422
    c_04
    Poziom 21  
    A tu jeszcze tabliczka stanow na wyjsciu. Na bramkach probowalem ale cos mi to nie chcialo dzialac. Tu bylby tylko jeden uklad - ta wlasnie pamiec.
    Gray na 7 segmentowy - jak?
    Prog w pierwszej kolumnie ma odpowiadac zadanemu kodowi jak w poprzedniej tabelce. Wyjscia O0-O7 sa przyporzadkowane poszczegolnym segmentom wyswietlaczy - wyjatkiem jest O7 ktory steruje jakby 4 sekcjami naraz. W ogole to pierwszy projekt zrobilem na enkoderze takim z 3 nogami ale on tez nie dzialal. Masa bramek tam byla ale wszystko na nic. Chyba ze zbuduje programator reczny do takich kosci 27c...28c...29c na przelacznikach;)
    To schemat tego ustrojstwa:
    Gray na 7 segmentowy - jak?
    Ale to liczyc mialo tylko do 8 i zmieniac nazwe banku np A0-A7 i B0-B7. Z tego co pamietam to pokazywac mialo kolko na dole i kiedy doliczylo do 8 pokazywac mialo kolko u gory - cos takiego o0-o7 i *0-*7. Wszystko zalezy od konfiguracji co sie pospina zeby pokazywalo... nie ma za wiele mozliwosci bo mozna tylko pokazac 2 zestawienia.
  • #8 8183988
    Dr.Vee
    VIP Zasłużony dla elektroda
    Kolego c_04 w tym dziale prowadzimy dyskusje na temat pisania programów, a nie procedur programowania flash/eprom/eeprom itp.

    Jeśli chodzi o rozwiązanie Twojego problemu to masz ze 3 wyjścia:
    1) zaimplementować wszystko na procesorze i napisać odpowiedni program (dział mikrokontrolery),
    2) użyć pamięci o 8 wejściach adresowych i 16 wyjściach, lub 2x pamięć o 8 wejściach adresowych i 8 wyjściach, a następnie wygenerować odpowiedni wsad do tej pamięci. Taki wsad można prosto wygenerować pisząc program w dowolnym języku programowania.
    3) podążyć za radą kolegi arnoldziq i opisać wszystko za pomocą równań/VHDL i zaimplementować na bramkach/w układzie CPLD (dział mikrokontrolery - układy programowalne).

    Pozdrawiam,
    Dr.Vee
  • #9 8184285
    Xitami
    Poziom 29  
    Dr.Vee napisał:
    [...]
    2) użyć pamięci o 8 wejściach adresowych i 16 wyjściach, lub 2x pamięć o 8 wejściach adresowych i 8 wyjściach, a następnie wygenerować odpowiedni wsad do tej pamięci. Taki wsad można prosto wygenerować pisząc program w dowolnym języku programowania.
    [...]

    Wystarczy pamięć o 7 wyjściach. Dodajmy do tego jakiś takt wybierający cyfrę i wpuśćmy go jako piąty bit adresu.
  • #10 8184325
    c_04
    Poziom 21  
    Kolego Dr Vee - w pierwszym poscie zamiescilem "program" i wokol tego krazy temat. Zamiescilem tez schemat podobnego rozwiazania opartego na bramkach, tablice stanow jakie chce miec na wejsciach adresowych i wyjscich. Napisalem tez w pierwszym poscie iz zupelnie nie znam sie na programowaniu wiec podsuwanie mi rozwiazan z procesorami troche mija sie z celem. Z tego co mi sie wydaje w/w program jest w assemblerze - i o to wlasnie pytam. Co mam zrobic zeby moc go wrzucic do pamieci? Wystarczy ze skopiuje taki zapis i wkleje w okno programatora (jakis Willem)?
    Wyraznie napisalem, ze potrzebuje 4 bitowego wejscia i 8 bitowego wyjscia - zreszta na to wskazuja nawet tablice, ktore zrobilem zeby kolegom ulatwic zaznajomienie sie z tematem. Na wejscia podaje 4 bitowy kod Graya, a z wyjsc otrzymuje juz informacje potrzebna do sterowania wyswietlaczy. Co do ukladu na bramkach okazal sie troche bardziej skomplikowany poniewaz mial troche inne zadania. Enkoder byl 2 bitowy. Wyjscia byly osobno: w kodzie Graya i dla wyswietlaczy LED.
    Kol Xitami - nie za bardzo rozumiem Twoja idee. Dlaczego 7 bitow na wyjsciu i akurat 5 ma byc taktujacym? W moim zamysle bylo uzycie tylk pamieci bez zadnych innych ukladow. Pamiec w ktorej wsad obejmowalby tlumaczenie stanow wejscia na stany wyjscia. Stanow jest 16.
    Pozdrawiam i dziekuje za odpowiedzi.
  • #11 8185233
    Dr.Vee
    VIP Zasłużony dla elektroda
    To co napisałeś w 1 poście przypomina dyrektywy asemblera '51.
    Być może przetworzenie tego asemblerem dla tego procesora (np. asem-51) pozwoli Ci wygenerować plik HEX do wgrania do pamięci.
    Żeby to działało musisz na nieużywane wejścia adresowe podać stan 0.
    Więcej dowiesz się w dziale Mikrokontrolery '51.

    Jeszcze prościej byłoby utworzyć plik BIN z odpowiednią zawartością za pomocą jakiegoś hex edytora.

    Pozdrawiam,
    Dr.Vee
  • #12 8185799
    c_04
    Poziom 21  
    Tak - wlasnie o takie podlaczenie mi chodzi. Nieuzywane 4 bity zwarte do masy.
    A tutaj znalazlem ten artykul opisujacy zabawe z pamieciami do sterownania wyswietlaczy alfanumerycznych.
    http://elportal.pl/index.php?module=ContentExpress&func=display&ceid=426
    Tylko dalej nie wiem jak wygenerowac te wsad i nawet nie wiem czy jest poprawny. Co prawda autor cos pisze o pisaniu programu w AVR Studio ale nie wiem czy to sie nada do tego konkretnego celu tj wygenerowanie wsadu takiego, ktory moglbym zrzucic do pamieci programatorem.
  • #13 8185862
    Dr.Vee
    VIP Zasłużony dla elektroda
    elportal.pl napisał:
    Do otrzymania wsadu dla pamięci EPROM został użyty kompilator języka asembler dla mikrokontrolerów AVR (trochę nietypowa rola kompilatora).

    To nie wyjaśnia czego należy użyć do generacji wsadu do pamięci?
    Pierwszy wynik w googlach to manual do programu.

    Przenoszę do działu Mikrokontrolery AVR, tam Ci pomogą z użyciem tego asemblera.
  • #14 8186058
    c_04
    Poziom 21  
    Sciagnalem cos z neta, nazywa sie to gavrasm i po wrzuceniu tego mojego pliku textowego wygenerowalo mi plik hex, a w nim taka oto zawartosc:
    
    :020000020000FC
    :100000008600DB00E600CF00FF008700ED00FD006A
    :100010007D006D004F006600EF003F005B000600B2
    :020020000000DE
    :00000001FF
    

    Wygenerowalo tez plik lst - chyba jakis informacyjny/kontrolnym a w nim:
    
    Compiled:    13.06.2010, 17:08:55
    Pass:        2
         1: ;
         2: ;***************************************************
         3: ;***************************************************
         4: ;*****************    decoder v.1   ****************
         5: ;*****************   gray to 7seg   ****************
         6: ;***************************************************
         7: ;***************************************************
         8: ;
         9:       .list
        10: .equ SegmA = 1<<0
        11: .equ SegmB = 1<<1
        12: .equ SegmC = 1<<2
        13: .equ SegmD = 1<<3
        14: .equ SegmE = 1<<4
        15: .equ SegmF = 1<<5
        16: .equ SegmG = 1<<6
        17: .equ SegmH = 1<<7
        18: .equ Space = 0
        19: ;
        20: 
        21:       .cseg
        22:       .org 0
        23: 
        24: ;     znak kod=0x00 'gray 0 dis C1'
        25:       .dw SegmB+SegmC+SegmH
            000000 0086
        26: ;     znak kod=0x01 'gray 1 dis C2'
        27:       .dw SegmA+SegmB+SegmD+SegmE+SegmG+SegmH
            000001 00DB
        28: ;     znak kod=0x02 'gray 2 dis C4'
        29:       .dw SegmB+SegmC+SegmF+SegmG+SegmH
            000002 00E6
        30: ;     znak kod=0x03 'gray 3 dis C3'
        31:       .dw SegmA+SegmB+SegmC+SegmD+SegmG+SegmH
            000003 00CF
        32: ;     znak kod=0x04 'gray 4 dis C8'
        33:       .dw SegmA+SegmB+SegmC+SegmD+SegmE+SegmF+SegmG+SegmH
            000004 00FF
        34: ;     znak kod=0x05 'gray 5 dis C7'
        35:       .dw SegmA+SegmB+SegmC+SegmH
            000005 0087
        36: ;     znak kod=0x06 'gray 6 dis C5'
        37:       .dw SegmA+SegmC+SegmD+SegmF+SegmG+SegmH
            000006 00ED
        38: ;     znak kod=0x07 'gray 7 dis C6'
        39:       .dw SegmA+SegmC+SegmD+SegmE+SegmF+SegmG+SegmH
            000007 00FD
        40: ;     znak kod=0x08 'gray 8 dis 16'
        41:       .dw SegmA+SegmC+SegmD+SegmE+SegmF+SegmG
            000008 007D
        42: ;     znak kod=0x09 'gray 9 dis 15'
        43:       .dw SegmA+SegmC+SegmD+SegmF+SegmG
            000009 006D
        44: ;     znak kod=0x10 'gray 10 dis 13'
        45:       .dw SegmA+SegmB+SegmC+SegmD+SegmG
            00000A 004F
        46: ;     znak kod=0x11 'gray 11 dis 14'
        47:       .dw SegmB+SegmC+SegmF+SegmG
            00000B 0066
        48: ;     znak kod=0x12 'gray 12 dis C9'
        49:       .dw SegmA+SegmB+SegmC+SegmD+SegmF+SegmG+SegmH
            00000C 00EF
        50: ;     znak kod=0x13 'gray 13 dis 10'
        51:       .dw SegmA+SegmB+SegmC+SegmD+SegmE+SegmF
            00000D 003F
        52: ;     znak kod=0x14 'gray 14 dis 12'
        53:       .dw SegmA+SegmB+SegmD+SegmE+SegmG
            00000E 005B
        54: ;     znak kod=0x15 'gray 15 dis 11'
        55:       .dw SegmB+SegmC
            00000F 0006
        56: ;     znak kod=0x16
        57:       .dw Space
            000010 0000
        58: .exit
     -> Warning 006: No device defined, no syntax checking!
    
    Program             :        0 words.
    Constants           :       17 words.
    Total program memory:       17 words.
    Eeprom space        :        0 bytes.
    Data segment        :        0 bytes.
    Compilation completed, no errors.
    Compilation endet 13.06.2010, 17:08:55
    


    I to tyle? Juz moglbym wrzucac to do pamieci? Tzn ten hex.
  • #15 8186229
    PiotrPitucha
    Poziom 34  
    Witam
    Jeśli Cię dobrze zrozumiałem to na wejściu do pamięci ( liniach adresowych ) podajesz kod Graya na na wyjściu masz mieć podpięty wyświetlacz ?
    Jeśli tak to musisz sobie zrobić tabelkę:
    kod Graya > wyjście 7 segment
    pamiętając że LCD będzie Ci świecić jeśli na wyjściu będziesz miał zero logiczne, bo na duży prąd w stanie wysokim bym nie liczył.
    Teraz bierzesz dowolny hexedytor i we wszystkie pola wpisujesz FF hexadecymalnie.
    Następnie w komórki o adresie wynikającym z kodu Graya ( wprowadź do Windowsowego kalkulatora po kolei bity z kodu Graya i zamień je na hex ) wprowadzasz to co masz w tabeli jako wyjście 7 segment.
    Operację powtarzasz dla wszystkich kodów ( pewnie jest tego niewiele ) i zapisujesz plik w formacie HEX, następnie udajesz się do dowolnego serwisu komputerowego gdzie Ci wpiszą to do pamięci.
    Piotr
  • #16 8186527
    c_04
    Poziom 21  
    Tak - tak wlasnie ma sie to odbywac. Na wejscie adresow kod graya, a na wyjsciach stany odpowiednie dla wyswitlacza tylko, ze LED ze wsplna katoda. Wiec sterujace musza byc 1. Jezeli nie bedzie dzialalo bezposrednio z pamieci to podepne jakis bufor ew cos takiego np uln2003 tylko on chyba dziala jako bramka NOT ale to bez wiekszego znaczenia bo istotna jest przeciez idea. Zawsze mozna odwrocic wyswietlane stany wpisujac odwrotnosc tego co jest teraz. Programator mam tylko nigdy go nie uzywalem bo nie mam pojecia o programowaniu:) Ale mam nadzieje, ze kiedys zalape o co w tym chodzi i ta zabawe z pamiecia eprom traltuje jako taki zalazek. Wprowadzenie do paru komend, ktore nie za bardzo wiem co robia ale wiem jaki ma byc tego skutek. Przede wszystkim bylo dla mnie istotne jak odbywa sie adresowanie wejsc. Kiedys chcialem wrzucic w taka pamiec plik dzwiekowy WAV ale wlasnie jeszcze jestem za krotki zeby wiedziec jak zaadresowac pamiec zeby np zaladowane 2 pliki odtwarzaly mi sie od konkretnych adresow i co trzeba wyciac z takiego pliku wav, ktore mam zapisane na komputerze zeby on poprawnie dzialal z pamieci eprom. Ale po kolei;)
    Co do wpisywania adresow do pamieci recznie - nie mam pojecia jak rozpoznac jaki adres wejsciowy jest ktorym w programie, a odpowiada ktoremu w kostce.
    Pozdrawiam
  • Pomocny post
    #17 8186771
    PiotrPitucha
    Poziom 34  
    Witam
    Jak masz programator to pewnie masz w oprogramowaniu zawarty edytor.
    W edytorze z lewej strony masz początek adresu a na górze mniej znaczącą część, w komórkach na ich skrzyżowaniu wpiszesz wartość powiedzmy X
    -------0 1 2 3 4 5 6 7 8 9 A B C D E F
    0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0001 0 0 0 0 0 0 0 x 0 0 0 0 0 0 0 0
    0002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    czyli adres pod który wpisałeś wartość X to 00017 bo jest na przecięciu 0001 i 7
    Pozostałe pola po wykasowaniu pamięci mają wartość FF co dla Ciebie może być kłopotliwe bo Ty sterujesz jedynkami więc poszukaj funkcji FILL i wpisz do edytora same zera przed wprowadzaniem danych
    Piotr
  • #18 8187470
    Nawigator
    Poziom 33  
    Ja w takiej sytuacji kupiłbym setkę diód, dwa wyświetlacze i kilka rezystorów i na płytce uniwersalnej zlutował dekoder jak ze starej książki.
    Sukces murowany, działa w ciemno.
    Następnie nauczył bym się jednak kilku instrukcji asemblera np. AVR i napisał programik (max. 10 rozkazów) i tabelkę stanów (256 znaków) czyli tłumacz pomiędzy wejściem a wyjściem.
    Nawet kwarcu nie trzeba a przydać ta wiedza się może na zaś.

    N.

    PS. Aha nawet wystarczy tabelka 32 stany bo wejście jest przecież 4-bitowe...
  • #19 8229027
    c_04
    Poziom 21  
    kol Nawigator - czy w pierwszym poscie to nie jest jakis "program" realizujacy ta funkcje ktora chce uzyskac? Stanow jest 16 - czyli jeszcze prosciej:)
    Pytam wlasciwie czy po wrzuceniu tego programu do pamieci tj po przekonwertowaniu przez jakis edytor do HEX podajac na wejscia stany z tabelki gdzies powyzej uzyskam stany na wyjsciu z tej drugiej tabelki. Nie chce sie bawic w jakies dekodery majace wielkosc wanny i pelniace prostackie funkcje tj dekodowanie 16 roznych kombinacji na 16 innych. Diod by trzeba chyba z milion do uzyskania tego co mozna zrobic na pamieci. Kiedys ktos mowil mi zeby wpisac recznie wartosci w hex edytorze i teraz tutaj jeden z kolegow tez mi to sugerowal - zreszta kolega tutaj opisal to w bardziej przejrzysty sposob za co dam mu "pomogl" chociaz to nie rozwiazuje mojego problemu ale za przyczynienie sie za poglebienie mojej obecnej wiedzy nt programowania - nalezy mu sie:).
REKLAMA