Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8] [C] Wyświetlacz 7seg - wyświetlanie liczby 4 - cyfrowej

02 Maj 2012 16:53 4149 18
  • Poziom 7  
    Witam. Mam problem z napisaniem programu, który na 4 wyświetlaczach 7seg wyświetli dowolną liczbę całkowitą od 0 do 9999. Na razie kod ma działać poprawnie dla liczb dwucyfrowych (warunki dla większych liczb napiszę analogicznie). Przedstawiam mój kod, proszę o pomoc w znalezieniu i poprawieniu błędu oraz o wskazanie nieprawidłowych nawyków, kiepskich rozwiązań.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    Ważne jest przede wszystkim jak te wyświetlacze siedmiosegmentowe zostaną podpięte do atmegi i w zależności od tego można coś dalej wtedy nad kodem myśleć, w sterowaniu statycznym potrzeba będzie bardzo dużo linii i w przypadku atmega8 poprostu zabraknie nóżek, ja bym zastosował jakies konwertery BCD do 7 segment, to drastycznie zmniejszy ilość nóżek, choć tak trzeba to będzie jeszcze jakoś odpowiednio multipleksować.
  • Poziom 7  
    Jeśli chodzi o podłączenie, to dysponuję płytką uruchomieniową EVBavr04 firmy Propox. Podłączenie przewodów wygląda w ten sposób:
    PD0-PD3 do A0-A3 (odpowiednie wyświetlacze)
    PB0-PB6 do sektorów A-G i PB7 do DP (Dp na razie nie używam)
  • Moderator Mikrokontrolery Projektowanie
    Czyli masz wyświetlanie multipleksowe. W efekcie musisz ko kolei "przemiatać" wyświetlacze, odświeżając ich zawartość. Twój kod oczywiście kompletnie tego nie robi. Jeśli chcesz to ściągnij przykłady do mojej książki (link w stopce), tam masz gotowy program jak to zrobić. Z samej analizy sporo się nauczysz.
  • Poziom 7  
    Panie Tomaszu, Pańską książkę mam w rękach od kilku dni i nie zdążyłem się z nią dokładnie zapoznać.
    W książce "AVR&ARM w praktyce" Borkowskiego znalazłem przykład, w którym na 2 wyświetlaczach z wykorzystaniem 2 pętli for wyświetlane są liczby od 0 do 99. Tam nie potrzeba użycia timerów i przerwań, dlatego chciałem napisać swój program w podobny sposób. Dlaczego ta metoda nie jest odpowiednia w moim przykładzie? Jeśli trzeba mogę wrzucić kod, o którym mówię (o ile prawa autorskie na to zezwalają).
  • Poziom 27  
    uint8_t cyfra1=liczba-cyfra0;

    ta linijka wogóle np dla 99 da: cyfra1= 99 - 9 (99%10) czyli 90 a chcesz raczej wyswietlić z tego co patrze w kod 9 wiec jak już coś zrób: cyfra1 = liczba - cyfra0*10;

    no a dla następnych dwóch analogicznie.
  • Poziom 7  
    stanleysts napisał:
    uint8_t cyfra1=liczba-cyfra0;

    ta linijka wogóle np dla 99 da: cyfra1= 99 - 9 (99%10) czyli 90 a chcesz raczej wyswietlić z tego co patrze w kod 9 wiec jak już coś zrób: cyfra1 = liczba - cyfra0*10;

    no a dla następnych dwóch analogicznie.

    trzeba całość podzielić przez 10, a nie pomnożyć.

    Po modyfikacji programu wyświetlacz pokazuje liczbę 55, a nie 54, jak powinien. Czy da się osiągnąć oczekiwane zachowanie programu bez wykorzystania timera? Chcę najpierw poznać prostszą metodę, aby później móc zacząć rzeczy trudniejsze.
    Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    Tak, oczywiście przepraszam za błąd. Zauważ, że drugi warunek jest też spełniony jeśli weźmiesz liczbę < 9, w takim wypadku masz dwa poprawne warunki. Dodatkowo zauważ, że o ile pierwszą cyfrę wyświetlisz dobrze, to druga Ci ją nadpisze bo nie masz multiplekowania, czyli wypisujesz 4ry a potem 5 do jednej i 5 do drugiej czyli 55. Twój układ nie wie do ktorego 7segmentowego ma wysłać następną daną i wysyła to samo na dwa, wydaje mi się, że bez szybkiego odświeżania co jakiś czas tego nie jestes w stanie zrobić na tak małej liczbie pinów
  • Moderator Mikrokontrolery Projektowanie
    BuahahaXD napisał:
    Panie Tomaszu, Pańską książkę mam w rękach od kilku dni i nie zdążyłem się z nią dokładnie zapoznać.
    W książce "AVR&ARM w praktyce" Borkowskiego znalazłem przykład, w którym na 2 wyświetlaczach z wykorzystaniem 2 pętli for wyświetlane są liczby od 0 do 99. Tam nie potrzeba użycia timerów i przerwań, dlatego chciałem napisać swój program w podobny sposób. Dlaczego ta metoda nie jest odpowiednia w moim przykładzie?


    Dlatego, że jest niepraktyczna. Aby poszczególne cyfry świeciły z taką samą jasnością, muszą być włączone przez ten sam czas. To się da łatwo zrobić, jeśli masz statyczne wyświetlanie (ale wtedy tracisz mnóstwo pinów), a w przypadku multipleksowania najłatwiej jest wykorzystać przerwania. Wtedy program sobie robi co chce i nie musisz się martwić wyświetlaniem.
  • Poziom 7  
    @stanleysts Tak, drugi warunek jest spełniony dla liczb <=9 ale po niej jest instrukcja else if, a nie zwykła if. Program sprawdza czy np liczba 5 jest <=9, odpowiedź jest prawdą. Dlatego ignoruje warunki else if.

    Mam jeszcze takie ogólne pytanie: jaka kolejność nauki jest według Was najłatwiejsza? Zależy mi na nauczeniu się w najbliższym czasie: przerwań, timerów, PWM, obsługi przetwornika ADC. Zauważyłem, że bardzo często do obsługi wszystkich innych rzeczy trzeba radzić sobie z przerwaniami. Czy w związku z tym powinienem od nich zacząć?
  • Poziom 27  
    @Buahahah sorki, nie zauważyłem else. Obojętnie od czego i tak się wszystkiego wypada nauczyć z tego co wymieniłeś, bo to jest użyteczne. Timery sobie możesz z PWM zrobić razem.
  • Poziom 13  
    Mam jedno pytanie skąd wiadomo że

    Kod: c
    Zaloguj się, aby zobaczyć kod


    te kody powyżej w systemie szesnastkowym to np. liczby 0,1,2,3,4 przecież np. kod cyfry 0 w szesnastkowym to 0x00 a nie 0xC0 proszę o pomoc w zrozumieniu.
  • Użytkownik usunął konto  
  • Poziom 13  
    Proszę jeszcze o jedno ,co znaczy czwarty z brzegu?-sprecyzuj
  • Poziom 32  
    A czy zapoznałeś się z Dokumentacją płytki?

    Na stronie produktu masz przykłady, w tym przykładowy kod sterownania wyświetlaczem 7seg.

    W w/w schematu wynika, że jest tam wyświetlacz ze wspólną anodą sterowaną tranzystorem.
    By zaświecić segmenty jakiejś cyfry trzeba podać 0 na odpowiednie segmenty i podać 0 na pozycji odpowiadającej wybranej pozycji wyświetlacza A0-A3. Tylko jednej.

    W kodzie jest (fragmenty):
    BuahahaXD napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zakładając, że podłączenia procka są jak podałeś, sterowanie PORTB (segmenty) jest OK, ale PORTD (linię A0-A3) jest sterowany źle.
    Dla kolejnych cyfr powinno być:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    x - nie używane w opisanym kodzie, ale nie wiem, czy czegoś tam nie podpiąłeś, więc sam ustal.
  • Użytkownik usunął konto  
  • Poziom 13  
    OK mrsajm0n zrozumiałem dokładnie o co chodzi z tymi segmentami i ich kodem .Zmylił mnie wcześniej taki zapis to w tym przypadku zera zapalają poszczególne segmenty wyświetlacza a jedynki logiczne to stan nie aktywny-tak to u mnie to działa.Dzięki za podpowiedź .Co prawda na mojej płytce testowej nie steruję bezpośrednio segmentami wyświetlaczami tylko robię to za pośrednictwem układów scalonych poprzez kod BCD w takim jak widać układzie.

    [atmega8] [C] Wyświetlacz 7seg - wyświetlanie liczby 4 - cyfrowej
  • Specjalista - Mikrokontrolery
    Nic na tym schemacie nei wskazuje na to, by miał być tu używany kod BCD. W celu wyświetlenia jednej cyfry do połączonych rejestrów przesuwających należy wsunąć kolejno dwa bajty - pierwszy zawierający bit wyboru cyfry, drugi z obrazem segmentów dla tej cyfry. Przy czterech cyfrach należy to robić w przerwaniu timera zgłaszanym z częstotliwością ok. 1200 Hz, po jednej cyfrze w każdym przerwaniu.
  • Poziom 13  
    Czy częstotliwość 1200Hz wynika z jakiegoś wyliczenia? jeśli tak to czym się sugerowałeś?