Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak zaprogramować uC do prostych funkcji logicznych?

greg16 11 Jul 2011 23:39 2759 16
Computer Controls
  • #1
    greg16
    Level 15  
    Witam kolegów.
    Mam do was takie pytanie, gdyż nie jestem pewien.
    Mianowicie od czasu do czasu potrzebuje zrobić jakiś układ logiczny, który ma realizować jakąś tam funkcje.
    Jak do tej pory robiłem takie rzeczy układach seri 74xx.
    Czasami jest to zbyt skomplikowane i chciałbym zrobić coś takiego na uC.
    Układ potrafię zbudować, zaprogramować piny I/O.
    Problem mam z programem, który ma realizować zadaną funkcje np. na wejście podaję jakieś tam stany i na wyjściu chce mieć jakieś tam stany.
    Czy ktoś z kolegów mógłby mi poradzić jakimi najlepiej funkcjami to realizować? Ewentualnie jakiś przykład.
    Ja myślałem nad funkcjami If ... Then i funkcjami do odczytu przycisków. Środowisko to BASCOM.
    Pozdrawiam.
  • Computer Controls
  • #2
    tmf
    Moderator of Microcontroller designs
    Najprościej to wejścia podpiąć pod wejścia przerwań procesora ustawione na zbocze sygnału. W procedurze obsługi przerwania realizujesz funkcję logiczną, w pętli głównej programu nie robisz nic :)
    Swoją drogą to do tak prostych rzeczy IMHO można wykorzystać pamięć - generujesz tabelę prawdy dla funkcji i jej wyniki zapisujesz w pamięci. Na linie adresowe podajesz argumenty, na liniach danych masz wynik.
  • #3
    drzasiek
    CNC specialists
    A Bascom nie posiada operatorów logicznych? Bo pisać to na instrukcjach warunkowych to tragedia. I tak musisz tablicę karnaugh zrobić, żeby wiedzieć co w których warunkach i instrukcjach pisać a jak już masz tabelę to prościej na pamięci jak pisał tmf.
    Jeśli chcesz na uC to lepiej wykorzystać operatory logiczne. Nie znam BASCOMA ale AND i NOT musi być bo co by to był za język. A Jak masz AND i NOT to masz NAND. A jak masz NAND to masz już wszystko. Wystarczy napisać proste funckcje na każdą funkcję logiczną i wrzucasz stan poszczególnych portów jako argumenty funkcji. Nie trzeba do tego dużej wiedzy, wystarczy odrobina wyobraźni i znajomość kilku praw z Cyfrówki :)
  • Computer Controls
  • #6
    tmf
    Moderator of Microcontroller designs
    Albo CPLD, mniej elementów dodatkowych. Gaskoin, no właśnie zapomniałem, że mamy XXI wiek i mi te FPGA umknęło :)
  • #7
    drzasiek
    CNC specialists
    Ale najtaniej i najprościej dla autora będzie chyba na uC jednak. Taka Atmega 8 w SMD kosztuje 5-6 zł a sporo bramek i całych funkcji logicznych można zrobić. I w porównaniu z pamięcią nie ograniczają linie adresowe i linie danych.
  • #8
    tmf
    Moderator of Microcontroller designs
    Bo ja wiem, za ok. 10zł ma się niezłego CPLD z czasem propagacji 2,5ns, co jest nieosiągalne dla CPU. Z drugiej strony funkcja posiadająca więcej niż 16 argumentów? W tanim CPU i tak dużo więcej nie zrealizujesz bo nie będziesz miał tylu pinów IO. No i jednak taki WebISE Xilinxa, czy inne z Altery jest przyjemniejsze niż nauka programowania mikrokontrolerów - rysujesz schemat i już masz to co chciałeś, w dodatku można sobie to ładnie potestować. Oczywiście ostatecznie jest to kwestia osobistych preferencji. W każdym razie możliwości są szerokie.
  • #9
    gaskoin
    Level 38  
    Dlategóż i napisałem o FPGA(CPLD). Jak tme pisze są całkiem niedrogie, wywalanie 8zł na atmege to najzwyczajniejsze marnotrawienie pieniędzy :)

    Nie mam tylko pojęcia jak z programowaniem takich układów
  • #11
    drzasiek
    CNC specialists
    tmf wrote:
    No i jednak taki WebISE Xilinxa, czy inne z Altery jest przyjemniejsze niż nauka programowania mikrokontrolerów - rysujesz schemat i już masz to co chciałeś, w dodatku można sobie to ładnie potestować.

    Pracowałem na laboratorium na "tych z Altery". Tam był co prawda jakiś dydaktyczny zestaw, ale realizacja algorytmu ta sama. I nie powiem, żeby przekładanie bramkami logicznym czy całymi układami i łączenie tego było przyjemniejsze od pisania programu. Ale to już od gustu zależy chyba, to było fajne ale nie tak fajne jak oprogramowywanie uC :) Autor pisze, że programować trochę umie, ma programator, wie jak zacząć więc już podstawę ma. Jeśli układy nie muszą być szybkie i wykonuje tylko od czasu do czasu jakieś proste to ja uważam, że uC jest lepszym rozwiązaniem. Oczywiście pod wieloma względami nie dorówna FPGA ale do prostych zadań jak najbardziej.
  • #12
    Osmo
    Level 18  
    tmf, mógłbyś napisać coś więcej o programowaniu układów CPLD ?

    Bawiłem się układami programowalnymi na labkach, ale tam mieliśmy gotowy zestaw startowy + my tworzyliśmy schemat i 'kompilowaliśmy' go a ćwiczeniowiec programował układ, wiec dalej nie wiele z tego wiem. Wiele więcej elektroniki nie będę miał bowiem studiuje informatykę.
  • #13
    tmf
    Moderator of Microcontroller designs
    drzasiek: ja nie mówię, że to jedyne koszerne rozwiązanie jest :) Chodzi raczej o pokazanie możliwości, a nie mówienie, że jedno jest dobre, a drugie be. Z Alterą nie miałem styczności, ale mam płytki rozwojowe do Xilinxa (Spartan) i fajne to jest. WebISE też mi pasuje, chociaż na początek to można dostać zawrotu głowy. Ale można i klasycznie programować i rysować schematy, co więcej dostępne są gotowe biblioteki elementów i wychodzi to ciekawie.
    Osmo: jako programator można użyć gołego LPT, chociaż lepiej z małym buforem. Na stronie Xilinxa masz w notach schematy takiego programatora, w najprostszej wersji to pare rezystorów. Tu masz mniej więcej opis jakie są opcje:
    http://www.xilinx.com/itp/3_1i/pdf/docs/jtg/jtg.pdf
    Schematy sobie wygooglasz. Właściwie to się to programuje tak jak współczesne mikrokontrolery.
    Też przy okazji mówię - na układach programowalnych się nie znam, to coś co czeka na swój dzień, a zanim nadejdzie układy się kurzą :)
  • #14
    Fajfer2
    Level 20  
    Może raczej nie chodzi o to jak podłączyć i skonfigurować uC ale o to jak sformułować dane zagadnienie - tzn. czy ma to być układ logiczny, czy też automat (Moora, Mealego).
    Według takich kryteriów można już myśleć o ogólnym szkielecie programu (kiedy lepiej stosować switch, a kiedy if). Zastosowanie uC lub FPGA/CPLD to już sprawa wymaganych szybkości (docelowego urządzenia). Chociaż warto pobawić się obydwoma rodzajami programowania.
  • #15
    tymon_x
    Level 30  
    greg16 wrote:
    Mam do was takie pytanie gdyż nie jestem pewny. Mianowicie od czasu do czasu potrzebuje zrobić jakiś układ logiczny który ma realizować jakas tam funkcje . Jak do tej pory robilem takie rzeczy układach seri 74xx.

    Idealnie nadadzą do tego się układy CPLD, 32/36 makrocelle kupisz już za 5 zł. A funkcje logiczne cię nie ograniczają, możesz zrobić całkowicie asynchronicznie i niezależnie od siebie czy synchronicznie taktowane zegarem.

    Do ładowania konfiguracji możesz Sobie zrobić na FTDI, i załadować tak produkty Altery, Xilinx i Lattice'a. Takie coś czasem stosuje, w uniwersalnym formacie svf (notabene też się tak da zaprogramować AVR ;) ) czy xsvf. Ale szczerze FTDI nadaje się tylko do CPLD, bo czas streamingu jest dość długi (jak dla mnie), przy zegarze 1MHz coś a'la parę sekund (72-144 makrocelle). Do FPGA zdecydowanie polecam kupić dedykowane podróbki/oryginalne JTAGi. I tu nie chodzi tylko o czas, ale o współpracę np. dedykowanymi soft-procesorami z oprogramowaniem (Microblaze, Nios-II i Mico32/8).

    Godne polecenia CPLD są układy Lattice'a, szczególnie wchodzące teraz na rynek MachXO2, które mają zintegrowane w krzemie interfejsy SPI, I2C czy pamięć RAM (nie trzeba marnować logiki). Większości działa w szerokim zakresie napięć (3.3V - 1.2V), ale spokojnie każdy z producentów sprzedaje z IO zgodnymi z 5V (XC95xxXL Xilinx'a).

    Narzędzia do zabawy z logiką są całkowicie za darmo (Xilinx ISE, Altera Quartus, Lattice'a Diamond/ISPLever).

    drzasiek wrote:
    Ale najtaniej i najprościej dla autora będzie chyba na uC jednak. Taka Atmega 8 w SMD kosztuje 5-6 zł a sporo bramek i całych funkcji logicznych można zrobić.

    CPLD kupisz za 5-6 zł, i zrobisz kombinacyjnie, szybko (z częstotliwością nawet 200MHz), niezależnie od siebie funkcje logiczne i etc, a w ATmega ?, zegar do 20MHz, szeregowe przetwarzanie instrukcji, marnotrawstwo na obsługę przerwań (bo musi reagować na świat doczesny) etc.

    drzasiek wrote:
    I w porównaniu z pamięcią nie ograniczają linie adresowe i linie danych.

    I to właśnie mikrokontroler Cię ogranicza, masz kilka sygnałów do przetworzenia, to musisz najlepiej zużyć cały port, w układach programowalnych podłączasz jak chcesz i ile chcesz.

    Do konfiguracji możesz użyć jednego z języków opisu sprzętowego HDL (Verilog/VHDL) (polecam) czy rysować w schematic'u (dobre dla początkujących).

    greg16 wrote:
    ... napisać coś więcej o programowaniu układów CPLD ?

    Kompedium wiedzy na temat CPLD/FPGA
  • #16
    Fajfer2
    Level 20  
    No a mają one możliwość generowania kodu dla opisu za pomocą grafu ?

    Jeśli chodzi o uC to mają większe możliwości gdy idzie o rozbudowę softu, dodanie jakiś skomplikowanych obliczeń, nie pochłonie większości zasobów pamięci, a w wersji sprzętowej to może być problem. Robiłem kiedyś taki projekt odbiornika RC5 w VHDL, szło to zrobić, nawet w miarę przejrzyście wyglądało.
    Ale jakoś ciężej by mi przychodziło abstrakcyjne myślenie o danym zagadnieniu jeśli muszę w symulacji sprawdzać takty zegara i reakcje poszczególnych bloków (które sam utworzyłem). Bardziej to przypomina w tym sensie projektowanie z użyciem asemblera (mimo że VHDL bardzo przypomina Pascal, C). No chyba żeby robić coś takiego jak połączenie (nie wiem czy tak się da) zaprojektowanych jednostek + zaprojektowany w tym samym układzie automat i teraz pisać do niego mikrokod. A jak zasoby pozwolą, to zaimplementować choćby nawet '51 lub AVR(y?)+ nasz własny układ sprzętowej obróbki danych - wszystko w jednym FPGA.
  • #17
    tymon_x
    Level 30  
    Fajfer2 wrote:
    No a mają one możliwość generowania kodu dla opisu za pomocą grafu ?

    Są darmowe narzędzia, które przekształcają graficzny graf (kółka, strzałki etc) na pełny opis HDL jako FSM (Finite State Machine), jest tego pełno. Ja tam preferuje ręczny coding maszyny.
    Fajfer2 wrote:
    Jeśli chodzi o uC to mają większe możliwości gdy idzie o rozbudowę softu, dodanie jakiś skomplikowanych obliczeń, nie pochłonie większości zasobów pamięci, a w wersji sprzętowej to może być problem. Robiłem kiedyś taki projekt odbiornika RC5 w VHDL, szło to zrobić, nawet w miarę przejrzyście wyglądało.

    Zdecydowanie nie, i zdecydowanie nie wolno ograniczać się do jednego typu scalaka, w szczególności uC, bo to jest przesada z deczka, jak można zrobić to na innych układach i prościej. Mikroproprocesor bije na głowę uC, to mam je wykorzystywać ? Mimo, że obecnie robię projekty na ARM9 oraz Cortex-A8, to nie będę ich tam pchał, gdzie nie trzeba, bo poco mi obsługa OpenGL z iMX50 ? A CPLD do zastosowań funkcji logicznych, obsługi pamięci (jako kontroler framebuffer'a) czy jako generatory do wyświetlaczy TFT są dla mnie niezastąpione, jako dodatkowe wsparcie dla uC. Każdy scalak ma Swoje przeznaczenie, a jak kolega autor korzystał z poczciwych układów logicznych, to najrozsądniejszym wyborem są właśnie układy CPLD.
    Gdyby nie FPGA, to cała elektronika cyfrowa by jeszcze raczkowała. CPLD nie nadają się do takich rzeczy jak piszesz, to jak szukanie dziury w całym. To samo mogę napisać, że Linuxa nie postawię na uC (brak np MMU itp).
    Fajfer2 wrote:
    Ale jakoś ciężej by mi przychodziło abstrakcyjne myślenie o danym zagadnieniu jeśli muszę w symulacji sprawdzać takty zegara i reakcje poszczególnych bloków (które sam utworzyłem). Bardziej to przypomina w tym sensie projektowanie z użyciem asemblera (mimo że VHDL bardzo przypomina Pascal, C).

    Jeśli nie rajcuje cię takie sprawdzanie, to istnieje takie coś jak SystemC czy System Verilog, gdzie można testować układy abstrakcyjnie w C++, w ten sposób testuje się OS przed wypuczeniem na daną architekturę. W dodatku sam Verilog ładnie i szlachetnie można łączyć z C czy z funkcjami np. Matlab'a. Typowa symulacja (testbench), jest faktycznie na poziomie sprzętu, ale takie testy jakie chciałeś zrobić z RC5, to powinieneś skorzystać z SystemC.
    Fajfer2 wrote:
    No chyba żeby robić coś takiego jak połączenie (nie wiem czy tak się da) zaprojektowanych jednostek + zaprojektowany w tym samym układzie automat i teraz pisać do niego mikrokod.

    CPLD + pamięć zewnętrzna flash na rozkazy lub inne źródło, sprawdza się i się tak stosuje i praktykuje. Via Picoblaze...
    Fajfer2 wrote:
    A jak zasoby pozwolą, to zaimplementować choćby nawet '51 lub AVR(y?)+ nasz własny układ sprzętowej obróbki danych - wszystko w jednym FPGA.

    Jest sporo ciekawszych soft-procesorów niż wyżej wymienione,... Są FPGA z wbudowanym rdzeniem np. nawet z Cortex-M3, a nawet dodają matryce analogowe FPAA, istne cudeńka.