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

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

dawid512 19 Lis 2007 18:30 2379 20
REKLAMA
  • #1 4498637
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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:
    $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
  • REKLAMA
  • #2 4498976
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    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.
  • #3 4499797
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    A mozesz troche jasniej mi to wytlumaczyc? Co to jest to DP? Jestem poczatkujacy w tych sprawach...
  • #4 4500265
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    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.
  • #5 4501354
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    Cytat:
    Część po przecinku to sobie normalnie matematycznie wyodrębniasz.


    Nie wiem dokladnie o co chodzi:( mozesz troszke jasniej? moze na jakims przykladzie?
  • #6 4501865
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    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.
  • REKLAMA
  • #7 4501934
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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 ;)
  • #8 4502026
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Pewnie tak też można, tyle że Bascom jest mi obcy ;)
  • #9 4502755
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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...
  • #10 4503942
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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
  • #11 4508375
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    Poczytałem ale... dalej nic z tego nie rozumiem:( chyba tylko gotowy przyklad mi pomorze.
  • REKLAMA
  • Pomocny post
    #12 4508433
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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.
    
    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
  • #13 4509280
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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.
  • #14 4509986
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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 :|
    
    V = Wart_ac * 0.0049
    Liczba=Fusing(V , "#.&&")
    

    Dalej już wiesz(?) ;)

    Piotrek
  • #15 4673707
    huba301
    Poziom 12  
    Posty: 41
    Pomógł: 1
    Ocena: 4
    [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
  • #16 4675120
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    Witam.

    Ja mam zrobione cos takiego:

    
    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
  • #17 4677183
    huba301
    Poziom 12  
    Posty: 41
    Pomógł: 1
    Ocena: 4
    dawid512 napisał:
    Witam.

    Ja mam zrobione cos takiego:

    
    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ś
  • REKLAMA
  • #18 4677298
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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.
  • #19 4677384
    huba301
    Poziom 12  
    Posty: 41
    Pomógł: 1
    Ocena: 4
    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ć
  • #20 4677403
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    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.
  • #21 4677426
    huba301
    Poziom 12  
    Posty: 41
    Pomógł: 1
    Ocena: 4
    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.

Podsumowanie tematu

✨ Dyskusja dotyczy wyświetlania wyniku pomiaru napięcia ADC w formacie "x.xx" na wyświetlaczach LED 7-segmentowych, gdzie użytkownik ma już działający program wyświetlający wartości całkowite bez przecinka. Problem polega na implementacji przecinka dziesiętnego (kropki dziesiętnej) na wyświetlaczach 7-seg. Uczestnicy wyjaśnili, że każdy wyświetlacz 7-seg posiada dodatkowy segment DP (Dot Point), który odpowiada za wyświetlenie kropki dziesiętnej i należy go osobno sterować. Proponowano matematyczne wydzielenie cyfr dziesiątek, jedności i części ułamkowej z wartości zmiennoprzecinkowej, a następnie przypisanie ich do poszczególnych wyświetlaczy oznaczonych jako A, B, C, D. Wskazano na użycie funkcji FUSING w Bascom do konwersji wartości typu Single na łańcuch znaków z ustaloną maską formatu, co umożliwia łatwe wyodrębnienie poszczególnych cyfr i przecinka. Podkreślono konieczność sterowania segmentem DP na wyświetlaczu, aby pokazać przecinek. Zaproponowano także przykłady użycia funkcji MID i VAL do ekstrakcji i konwersji znaków na liczby. W dalszej części omówiono problem wyświetlania wartości powyżej 10.0 i formatowania liczb z zerami wiodącymi (np. 08.0) poprzez manipulacje BCD i przesunięcia bitowe. Przedstawiono przykładowe fragmenty kodu Bascom, które pozwalają na rozbicie łańcucha znaków na poszczególne cyfry i ich wyświetlenie na segmentach LED. Dyskusja obejmuje zagadnienia konwersji typów, formatowania wyświetlania, sterowania segmentem DP oraz praktyczne implementacje w języku Bascom dla mikrokontrolera Atmel ATmega32.
Wygenerowane przez model językowy.
REKLAMA