Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

kalkulator przystosowany do płytki z podwójnym siedmiosegmentowym wyświetlaczem

11 Nov 2013 16:52 3456 12
  • Level 2  
    Witam serdecznie,

    Mam problem z napsianiem programu w vhdl który wykorzystuje siedmiosegmentowy wyswietlacz podwójny oraz przyciski. Program ten ma być prostym kalkulatorem.
    Pierwsze ma być wprowadzona jedna liczba, później druga przycieskiem kolejno 1 i 2 a nastepnie trzeba wybrać działanie sumy lub różnicy tych liczb przysickiem 3 lub 4.
    Wynik ma zostać wyświetlony na wyświetlaczu.
    Znalazłem na forum podobny temat niestety nie wiem jednak jak zmodyfikować ten program aby działał na podwójnym wyświetlaczu gdyż jest on przystosowany do poczwórnego:

    https://www.elektroda.pl/rtvforum/topic1628377.html

    Jeśli ktoś może mi pomóc to proszę o napisanie jak mogę to zmodyfikować aby było poprawnie.
    Z góry bardzo dziękuje!
    Czy Twoje urządzenia IoT są bezpieczne? [Webinar 22.06.2021, g.9.00]. Zarejestruj się za darmo
  • MCUs specialist
    Nie wiem, co to jest "wyświetlacz dwusegmentowy", ale z podstaw logiki wynika, że taki wyświetlacz mógłby wyświetlać liczby z zakresu od 0 do 3. Do wyświetlania liczb używa się zazwyczaj wyświetlaczy 7-segmentowych o liczbie cyfr odpowiedniej do zastosowania. Musisz wię zapewne użyć dwucyfrowego wyświetlacza 7-segmentowego
  • Level 2  
    w takim razie nieco źle zredagowałem mój tekst. Chodzi o to ze w linku który załączyłem wykorzystane są 4 wyświetlacze, natomiast mój kalkulator ma posiadać tylko 2. Więc potrzebuje pomocy w tym aby ktoś poradził mi jak przekształcić ten program bo próbuje to zrobić i cały czas mi nie wychodzi.


    Program ma być napisany do tej płytki:

    kalkulator przystosowany do płytki z podwójnym siedmiosegmentowym wyświetlaczem
  • Level 15  
    Wrzuć swój program z opisem. No i napisz co ci dokładnie nie wychodzi, jakie są efekty? Wiesz które wyprowadzenie odpowiada za konkretny segment wyświetlacza? Czy jest to wyświetlacz ze wspólną katodą/anodą?
  • Level 2  
    Zmieniłem nieco polecenie a mianowicie

    Chodzi cały czas o program dotyczący płytki którą umieściłem powyżej:

    - wprowadzam pierwszą liczbę trzema pierwszymi przyciskami od lewej tak aby jej wartość wskazywały trzy pierwsze diody nad tymi przyciskami w postaci binarnej (max wartość liczby 7)
    - następnie wprowadzam drugą liczbę w taki sam sposób kolejnymi trzema przyciskami czyli czwartym, piątym i szóstym i wyświetlam jej wartość na diodach powyżej tych przycisków
    - kolejnym etapem ma być wybranie działania + (przyciskiem kolejnym czyli siódmym) lub działania - (przyciskiem ósmym)
    - po tym na wyświetlaczu ma ukazać się wynik wybranego działania

    Napisałem program zamieszczony poniżej, jednak musi występować jakiś błąd bo wyświetlacz nie wskazuje poprawnie.
    Bardzo proszę o pomoc i z góry dziękuje.
    Code: Verilog
    Log in, to see the code
  • Level 15  
    W pierwszych dwóch procesach jak rozumiem chcesz wykonać ustawianie tej cyfry, to zamiast takiego dziwnego i chyba błędnego kodu zrób negację bitu, będziesz miał też zapewne drgający styk, tj. przy jednym naciśnięciu instrukcja wykona się więcej niż jeden raz. Dawno używałem VHDL'a, mogę nie pamiętać składki. Np.

    if s1='0' then L1(0)=~L1(0);
    if s2='0) then L1(1)=~L1(1);


    A co to robi?:
    Code: vhdl
    Log in, to see the code


    Nie lepiej tak, wykorzystując to co wcześniej napisałeś:
    Code: vhdl
    Log in, to see the code
  • Level 2  
    Niestety takie rozwiązanie nie działa, gdyż nie może być dwa razy proces od wyniku użyty i wyskakuje błąd. Może jakieś inne rozwiązanie ktoś proponuje?

    W dalszym ciągu proszę o pomoc!
  • Level 15  
    Tj. nie mogą zostać użyte dwa procesy w których jest zmieniany wynik? To wrzuć to w jeden prces, w listę czułości wrzuć s7 i s8 i pózniej:
    Code: vhdl
    Log in, to see the code
  • Level 28  
    slabo znam vhdl, wiec nie wypowiadam sie
    o roznych 'detalach', typu co powinno byc, a co
    nie np. po 'process';
    skompiluj w narzedziu ktore masz dostepne i uwaznie
    przeczytaj ostrzezenia;


    zapis:
    Code: vhdl
    Log in, to see the code


    jest niejednoznaczny,
    s1=0 then znaczy, ze jesli s1 rowne jest zero, to bezwarunkowo
    L1 ma przyjac jakas wartosc, zaraz potem jest;
    if s1='0' and s3='0', co 'kloci' sie z linijka powyzej;

    zrob z s1, s2, s3 wektor i if-elseif zamien na 'case'
    od tego wektora, ew.
    powinno byc jakos tak:

    if s2='0' and s3='0' and s1='0' then ...
    elsif s2='0' and s3='0' then
    itd., masz zla kolejnosc priorytetow;

    dokladnie to samo odnosi sie do kolejnego procesu (s4,s5,s6);

    tutaj:
    process(suma,clk)
    begin
    if rising_edge(clk) then
    if suma = "0000" then
    wynik <= roznica;
    else
    wynik <= suma;
    end if;
    end if;
    end process;

    nie rozumiem intencji autora;

    jesli testujesz na jakiejs plytce, nie w symulacji,
    to dodatkowo dochodzi problem drgania stykow s1-s8,
    jesli nie sa odfiltrowane jakos sprzetowo, to musisz
    dodac taki filtr do swojego kodu;

    j.

    ---
    poprawiono, jakas literowka mi sie wkradla w slowie 'ostrzezenia'
  • Level 15  
    Quote:
    jest niejednoznaczny,
    s1=0 then znaczy, ze jesli s1 rowne jest zero, to bezwarunkowo
    L1 ma przyjac jakas wartosc, zaraz potem jest;
    if s1='0' and s3='0', co 'kloci' sie z linijka powyzej;

    zrob z s1, s2, s3 wektor i if-elseif zamien na 'case'
    od tego wektora, ew.
    powinno byc jakos tak:

    if s2='0' and s3='0' and s1='0' then ...
    elsif s2='0' and s3='0' then
    itd., masz zla kolejnosc priorytetow;

    dokladnie to samo odnosi sie do kolejnego procesu (s4,s5,s6);


    Właśnie o tym pisałem, w tym przypadku znacznie lepiej jest zrobić negację bitu a nie pisać nie wiadomo ile warunków, mniej więcej tak to powinno wyglądać(mogą być błędy wynikające ze składni, jednak logika powinna być właśnie taka):
    Code: vhdl
    Log in, to see the code
  • Level 28  
    miszaa88 wrote:

    Właśnie o tym pisałem, w tym przypadku znacznie lepiej jest zrobić/.../


    chcialem pokazac inicjatorowi watku gdzie zrobil blad merytoryczny,
    'logiczny', nie jak to mozna napisac lepiej, ladniej, efektywniej;
    w tej sprawie oczywiscie masz racje, ale obawiam sie, ze kolega zmienilby
    kod wedle sugestii i dalej nie wiedzial, dlaczego jego wersja dziala blednie;

    j.
  • Level 2  
    dosyć ciekawy program
    ale interesuje mnie (tak z czystej ciekawości) jak dodac mnozenie i dzielenie do tego kalkulatora
  • Level 15  
    Mnożenie to wszak nic innego jak dodawanie do siebie jakiejś liczby określona ilość razy. Tak też należy to zrobić. Zalecam wykorzystanie funkcji case. Dzielnie zrobiłbym tak jak w szkole uczyliśmy się dzielić pisemnie.
    Oczywiście raczej na pewno można wykorzystać gotowe, przeznaczone do tego biblioteki..... Jednak nigdy tego nie robiłem.