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.

ADC i LED 7-seg, wynik postaci x.xx na wyświetlaczu.

19 Lis 2007 18:30 2082 20
  • Poziom 32  
    Witam mam taki o to programik do mierzenia napiecia przy uzyciu ADC.
    Problem polega na tym ze na lcd wszystko gra ale chcialbym to zrobic na LED 7 segmentow. Zrobilem to juz tylko ze wyswietla mi tylko calosci bez przecinka. Do wyswietlania mam swoj program w ktorym wyswietlacze sa oznaczone jako A , B , C , D. Wystarczy ze wpisze A=5 i na 1 wysw. pojawia sie 5. Wie ktos jak to zrobic aby uzyskac wynik w postaci "x.xx" na tych wyswietlaczach?

    kod programu:
    Code:
    $regfile = "m32def.dat"
    
    $crystal = 8000000

    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2

    Config Adc = Single , Prescaler = Auto , Reference = Avcc







    Dim Wart_ac As Word

    Dim V As Single

    Dim Wart_nap As String * 3


    Start Adc

    Cls

    Do

    Wart_ac = Getadc(1)

    Cls

     V = Wart_ac * 0.0049





    Wart_nap = Fusing(v , "#.&&")

    Lcd "Napiecie:" ; Wart_nap

    Waitms 100

    Loop
    End
  • Poziom 28  
    musisz mieć dociągnięte DP do procesora i w momencie gdy będziesz coś wyświetlał na danym wyświetlaczu jednocześnie zaświecić DP.
  • Poziom 32  
    A mozesz troche jasniej mi to wytlumaczyc? Co to jest to DP? Jestem poczatkujacy w tych sprawach...
  • Poziom 28  
    Każdy wyświetlacz ma 7 segmentów cyfry plus dodatkowy "segment" kropki czyli Dot Point (DP). Możesz wszystkich wyświetlaczy połączyć razem te kropki na jedną linie i wtedy w momencie gdy wybrany jest dany wyświetlacz to go zapalić. Część po przecinku to sobie normalnie matematycznie wyodrębniasz.
  • Poziom 32  
    Cytat:
    Część po przecinku to sobie normalnie matematycznie wyodrębniasz.


    Nie wiem dokladnie o co chodzi:( mozesz troszke jasniej? moze na jakims przykladzie?
  • Poziom 28  
    jeżeli masz liczbę w postaci:

    liczba = dziesiatki jednosci . ulamek

    dziesiatki=liczba/10
    i wynik robisz jako całkowitą i masz wyodrębnione dziesiątki - wyświetlasz na wyświetlaczu 1

    jednosci=liczba-(10*dziesiatki)
    i wyświetlasz na wyświetlaczu 2

    ulamek= liczba*10 - dziesiatki*100 - jednostki * 10
    i wyświetlasz na wyświetlaczu 3.

    (chyba się nie pomyliłem przy tych mnożeniach ;) )
    Dodatkowo na wyświetlaczu 2 zapalasz na stale ta kropke.
  • Poziom 39  
    dawid512 napisał:
    Cytat:
    Część po przecinku to sobie normalnie matematycznie wyodrębniasz.


    Nie wiem dokladnie o co chodzi:( mozesz troszke jasniej? moze na jakims przykladzie?

    Kolega snow ma rację , ale nie koniecznie musi to być "matematycznie" :)
    Załóżmy , że po pomiarze i obliczeniu napięcia w zmiennej SINGLE , użyjesz instrukcji FUSING , do konwersji SINGLE na STRING.Po tych zabiegach , zmienna Wart_nap zawiera ciąg cyfr , rozdzielonych przecinkiem np. "1.35".Maska w instrukcji FUSING spowoduje , że zmienna Wart_nap będzie ZAWSZE 4-znakowa , bez względu na zmierzoną wartość napięcia(w zakresie 0-5V) , a przecinek ZAWSZE będzie się znajdował na drugiej pozycji , licząc znaki w zmiennej Wart_nap od lewej.Teraz należy skopiować 1-szy znak ze zmiennej Wart_nap , do innej (tymczasowej) zmiennej typu STRING , po czym zamienić ten znak(jedną cyfrę) na liczbę i zapisać np.w zmiennej A.Identycznie postąpić dla 3 i 4 znaku w zmiennej Wart_nap.
    Po takim zabiegu , zmienna A=1,B=3,C=5.Kropkę(DP) możesz zaświecić na stałe , ponieważ jej pozycja nie będzie się zmieniać.
    Do wszystkich opisanych operacji , masz gotowe instrukcje w Bascom-ie , musisz je tylko(?) odszukać.

    Piotrek

    PS
    Nie jest to oczywiście , jedyna droga do celu ;)
  • Poziom 28  
    Pewnie tak też można, tyle że Bascom jest mi obcy ;)
  • Poziom 32  
    Cytat:
    Teraz należy skopiować 1-szy znak ze zmiennej Wart_nap , do innej (tymczasowej) zmiennej typu STRING , po czym zamienić ten znak(jedną cyfrę) na liczbę i zapisać np.w zmiennej A.


    Wszystko pieknie cos rozumiem tylko nie wiem jak to zrobic w bascom:( . Prosze o mały przykład...
  • Poziom 39  
    dawid512 napisał:
    ...Wszystko pieknie cos rozumiem tylko nie wiem jak to zrobic w bascom:( ...

    Tu masz zestaw procedur Bascoma , operujących na zmiennych typu STRING.
    ASC , UCASE , LCASE , TRIM , SPLIT , LTRIM , INSTR , SPACE , STRING , RTRIM , LEFT , LEN , MID , RIGHT , VAL , STR , CHR , CHECKSUM , HEX , HEXVAL
    Zapoznaj się z nimi i wykorzystaj.
    Zwróć szczególną uwagę na MID i VAL :)

    Piotrek
  • Poziom 32  
    Poczytałem ale... dalej nic z tego nie rozumiem:( chyba tylko gotowy przyklad mi pomorze.
  • Pomocny post
    Poziom 39  
    dawid512 napisał:
    Poczytałem ale... dalej nic z tego nie rozumiem:(

    Na to niestety , nie mam wpływu :|


    dawid512 napisał:
    chyba tylko gotowy przyklad mi pomorze.

    Ok.
    Code:

    Dim Liczba As String * 4 , Cyfra As String * 1
    Dim Tysiace As Byte , Setki As Byte , Dziesiatki As Byte , Jednosci As Byte
    Liczba = "2007"
    Cyfra = Mid(liczba , 1 , 1)
    Tysiace = Val(cyfra)
    Cyfra = Mid(liczba , 2 , 1)
    Setki = Val(cyfra)
    Cyfra = Mid(liczba , 3 , 1)
    Dziesiatki = Val(cyfra)
    Cyfra = Mid(liczba , 4 , 1)
    Jednosci = Val(cyfra)



    Piotrek
  • Poziom 32  
    Witam!

    Niestety dalej mam problem:(. Podales fajny przyklad tylko ze u ciebie jest takie cos " Liczba = "2007" " . Powiedz mi jak przerobic moje " V = Wart_ac * 0.0049 " ktore jest typu single na twoje " Liczba = "2007" " bo u mnie wynik tego dzialania jest w postaci "x.yy" a moze da sie to zrobic aby wynik byl bez przecinka i skladalby sie z 3 cyfr a kropke bym dolozyl na wysw oddzielnie.
  • Poziom 39  
    dawid512 napisał:
    Witam!

    Niestety dalej mam problem:(. Podales fajny przyklad tylko ze u ciebie jest takie cos " Liczba = "2007" " . Powiedz mi jak przerobic moje " V = Wart_ac * 0.0049 " ktore jest typu single na twoje " Liczba = "2007" " bo u mnie wynik tego dzialania jest w postaci "x.yy" a moze da sie to zrobic aby wynik byl bez przecinka i skladalby sie z 3 cyfr a kropke bym dolozyl na wysw oddzielnie.

    Przecież już to opisałem , w swoim pierwszym poście tego tematu :|
    Code:

    V = Wart_ac * 0.0049
    Liczba=Fusing(V , "#.&&")

    Dalej już wiesz(?) ;)

    Piotrek
  • Poziom 11  
    [quote="zumek"]
    dawid512 napisał:
    Cytat:
    Część po przecinku to sobie normalnie matematycznie wyodrębniasz.

    Nie wiem dokladnie o co chodzi:( mozesz troszke jasniej? moze na jakims przykladzie?

    Kolega snow ma rację , ale nie koniecznie musi to być "matematycznie" :)
    Załóżmy , że po pomiarze i obliczeniu napięcia w zmiennej SINGLE , użyjesz instrukcji FUSING , do konwersji SINGLE na STRING.Po tych zabiegach , zmienna Wart_nap zawiera ciąg cyfr , rozdzielonych przecinkiem np. "1.35".Maska w instrukcji FUSING spowoduje , że zmienna Wart_nap będzie ZAWSZE 4-znakowa , bez względu na zmierzoną wartość napięcia(w zakresie 0-5V) , a przecinek ZAWSZE będzie się znajdował na drugiej pozycji , licząc znaki w zmiennej Wart_nap od lewej.Teraz należy skopiować 1-szy znak ze zmiennej Wart_nap , do innej (tymczasowej) zmiennej typu STRING , po czym zamienić ten znak(jedną cyfrę) na liczbę i zapisać np.w zmiennej A.Identycznie postąpić dla 3 i 4 znaku w zmiennej Wart_nap.
    Po takim zabiegu , zmienna A=1,B=3,C=5.Kropkę(DP) możesz zaświecić na stałe , ponieważ jej pozycja nie będzie się zmieniać.
    Do wszystkich opisanych operacji , masz gotowe instrukcje w Bascom-ie , musisz je tylko(?) odszukać.



    Mam taki problem. Jeżeli mam wynik taki jak w tym przykładzie to wszystko wyświetla dobrze, wynik max 5.00
    Ale chce pomnożyć ten wynik przez 4 i wtedy będzie max 20.0 (maskę ustawiłem "#.#") Zmieniłem odczytywanie znaków pomijając 3 bo to przecinek w tym wypadku.
    Jeżeli liczba jest większa od 10.0 to wszystko jest dobrze wyświetlane ale jeżeli wynik wynosi np. 8.0 to na wyświetlaczu jest źle bo jest (80.0)

    Co mogę z tym zrobić żeby wynik był 8.0 lub ewentualnie 08.0
  • Poziom 32  
    Witam.

    Ja mam zrobione cos takiego:

    Code:

    Wart = Setki

    Wart = Makebcd(wart)

    B = Wart And &B00001111

    Shift Wart , Right , 4

    A = Wart


    Wart jest jako word a setki jako byte. Dziala to tak ze w momencie gdy bedzie np 9 to wyskoczy 09. A i B to wyswietlacze.

    Pozdrawiam
  • Poziom 11  
    dawid512 napisał:
    Witam.

    Ja mam zrobione cos takiego:

    Code:

    Wart = Setki

    Wart = Makebcd(wart)

    B = Wart And &B00001111

    Shift Wart , Right , 4

    A = Wart


    Wart jest jako word a setki jako byte. Dziala to tak ze w momencie gdy bedzie np 9 to wyskoczy 09. A i B to wyswietlacze.

    Pozdrawiam


    Coś chyba nie tak napisałeś
  • Poziom 32  
    Cytat:
    Coś chyba nie tak napisałeś


    A probowales to w praktyce? Sprobuj wykorzystac ten kod. Zamiast setki wpisz jakas liczbe np. 43 i zobaczysz co sie stanie. Jesli wpiszesz liczbe ponizej 10 np 8 to na dwoch wyswietlaczach ( u mnie A i B) wyskoczy 08.
    Jesli masz liczbe np. 5.45 to wydzielasz sobie kazda z tych liczb i wyswietlasz jedna liczbe na jednym wyswietlaczu a wydzielona liczbe 5 na pierwszych dwoch przez moj kod. Nie mam teraz jak zrobic fotki zeby ci pokazac. Sprobuj i napisz jak dziala.
  • Poziom 11  
    Zrobiłem trochę inaczej, do mojego wyniku (np 15.5) dodałem 100 czyli (115.5) i odczytałem A z drugiej pozycji, B i następne podobnie.
    Teraz jak wyjdzie 8.8 to mam wynik 108.8 a na LED-ach mam 08.8 i to chciałem mieć
  • Poziom 32  
    Powiem Ci ze fajnie to wykąbinowales ale musisz dodatkowe liczby wydzielac a z moim kodem byłoby szybciej ale twoje rozwiazanie jest tez prawidlowe.

    Pozdrawiam.
  • Poziom 11  
    Już zauważyłem dla czego mi nie działało. "Setki" to miał być mój wynik, a ja tam nic nie wstawiłem i nie miało prawa działać.
    W wolnej chwili przetestuje jeszcze raz Twoje rozwiązanie.