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.

Problem ze sterowaniem segmentami w 7-seg LED w bascom51

24 Paź 2007 20:04 1674 13
  • Poziom 12  
    Witam, od 2 miesięcy nie mogę sobie poradzić z właściwym sterowaniem segmentów wyświetlacza 7 segmentowego.
    Aby usprawnić sobie nieco pracę napisałem prosty program który wysyła na port wyświetlacza liczby z przedziału 1 do 255 ( czyli pełen zakres bin) a dodatkowo na wyświetlaczy LCD wyświetlana jest obecnie wysłana liczba w postaci dziesiętnej oraz binarnej. Chciałem w ten sposób zobaczyć jaka liczbę trzeba wysłać na wyświetlacz LED aby otrzymać cyfry 0 do 9
    Wszystko działa w symulacji kompilatora ( bascom51 ) jak należy, jednak po wgraniu po kontrolera 89C2051 czy też 89C4051 ( stosowałem różne aby wykluczyć uszkodzenie układu) . zaczynają się dziać "cuda" jak dla mnie całkowicie nie logiczne działanie:
    O ile wyświetlacz LCD prawidłowo odlicza dziesiętne 1-255
    to monitorując sygnały binarne portu P3 ( port wyświetlacza LED )
    wyświetlane w dolnej linijce LCD jestem zgłupiały - brak jakiej kol wiek logiki:
    po "przeszukaniu" zakresu 1-255 nie wyświetliły się całkowicie cyfry 2; 3 ; 4 na wyświetlaczu LED
    Dowcip polega na tym że kontrolery wysyłają nie prawidłowe kombinacje binarne sterujące segmentami , ale dlaczego????
    kilka wartości zapisałem:

    dziesiętne: binarne:

    10 00001000
    11 00001000
    12 00001100
    13 00001100
    14 00001110
    ...........................................
    xxx 00100000
    xx1 00000000
    xx2 00100001


    itd

    nie otrzymałem wspominanych kombinacji stanowiących 2; 3; 4 ponieważ wysłane sygnały nie są wysyłane w uporządkowanej kolejności
    .Dodam ze nic nie daje zmiana wyświetlacza wszystko wskazuje na ewidentny błąd kompilatora- czy któryś z kolegów spotkał się z takim przypadkiem?
    Będę wdzięczny za zainteresowanie i konkretne porady.
    załączam listing mojego prostego programu do skanowania portów kontrolerów :

    'Wysylanie na port P3 zmiennej R w celu ustalenie
    ' wartości liczb dziesietnych do sterowania wyświetlaczem 7 segmentowego LED


    Config Lcd = 20 * 2
    Cls
    Dim R As Byte , X As String * 10
    Dim C As Byte

    For R = 1 To 255
    P3 = R
    X = Hex(r)
    Locate 1 , 2
    Lcd R


    Locate 1 , 4
    Lcd "dziesietna :" ; " " ; R
    Locate 2 , 14
    Lcd X ; " " ; "HEX"

    Lowerline
    Locate 2 , 2

    Lcd P3.7 ; P3.6 ; P3.5 ; P3.4 ; P3.3 ; P3.2 ; P3.1 ; P3.0
    Print P3.7 ; P3.6 ; P3.5 ; P3.4 ; P3.3 ; P3.2 ; P3.1 ; P3.0
    Home
    Wait 1
    Waitms 500

    Next R

    End
  • Poziom 12  
    Nikt nie może mi pomóc?

    załączam kilka fotek z widokiem wyświetlacza LCD.
    Wyświetlacz LED jest w tej chwili odłączony aby wyeliminować jakieś ewentualne zwieranie.
    Próbowałem także użycia kompilatora nowszej wersji, ale efekt jest ten sam
  • Poziom 14  
    Witam kolegę.
    Wyświetlacz siedmiosegmentowy należy potraktować jako siedem diod ułożonych w cyfrę ze wspólną anodą lub katodą. Narysuj sobie na kartce taki wyświetlacz, oznacz kolejno segmenty a-f, a następnie rozpisz sobie liczbę binarną pamietając np że segment a jest najmłodszym bitem.

    Pozdrawiam Krzych
  • Poziom 25  
    Musisz pokazać elektronikę, czyli jak podłaczyłeś wyświetlacz LED do uP, bez tego nikt ci nie pomoże.
  • Poziom 12  
    Wiem ze kombinacja świecenia segmentów wyświetlacza tworzy cyfry.
    jeśli chodzi o podłączenie elektroniki to używam standardowej płytki uruchomieniowej AVT-2500

    sama elektronika myślę że nie ma w tym przypadku znaczenia gdyż tak jak pisałem ostatnio odłączyłem LED od kontrolera i mimo wszystko wysyłane stany na port P3 nie są takie jak powinny być.
    Proszę spojrzeć na program jaki napisałem i załadowałem do układu jest naprawdę prosty , a układ na port P3 wysyła jakieś głupoty- kolejność monitorowanych pinów na LCD jest prawidłowa proszę sprawdzić w programie


    Tak jak już wspomniałem napisałem ten program ze względu na to że nie mogłem dać sobie rady z ustaleniem jakie wartości nalerzy wysłać do wyświetlacza aby powstały cyfry 0-9 , a tu niestety nic do przodu
  • Poziom 39  
    nie rozumie sensu tego programu
    Cytat:
    napisałem ten program ze względu na to że nie mogłem dać sobie rady z ustaleniem jakie wartości nalerzy wysłać do wyświetlacza aby powstały cyfry 0-9 , a tu niestety nic do przodu

    tak jak wspomniał kolega wcześniej takie rzeczy robi się na kartce , gdzie możesz sobie w dowolny sposób przyporządkować segment do bitu portu
    wracając do programu jak chcesz interpretować na wyświetlaczu 7-segmentowym wartości powyżej 9 , pin p3.6 jest nie dostępny w 89c2051 , po co wysyłasz dane instrukcja Print , która korzysta z P3.0 i P3.1
    aby taki program miał sens musisz mieć założenie segment > pin (bit) liczby powyżej 9 dzielone na dwa wyświetlacze itd , szybszy jest ołówek , papier i trochę pomyśleć na pewno nie 2 miesiące
  • Poziom 12  
    Witam, zgadzam się z Tobą że nie potrzebnie użyłem instrukcji print.
    Jeśli chodzi o przyporządkowanie odpowiednim pinom segmentów wyświetlacza to tak właśnie jest zrobione ( małe zdjęcie z żółtą 8 )
    Po podłączeniu rezystorów do portu P1.0 i P1.1 kontroler wysyła prawidłowe sygnały do sterowania wyświetlacza:
    Czyli w zasadzie ok.
    ( zamieszczone zdjęcia przedstawiają stany z portu P1 )
    Ale przez te 2 miechy walczę z portem P3, po usunięciu instrukcji print i zbędnych dodatków : przeliczanie na HEX itp. w dalszym ciągu kontroler na port P3 wysyła głupoty
    00000000
    00000010
    00000010
    00000100

    przy 32 następuje wyzerowanie 00000000
    przy 33 00100001
    przy 34 00000010
    przy 35 00100011
    przy 36 00000100

    gdzie tu logika program ten sam co dla P1
    i Jak mam takie kombinacje przyporządkować segmentom wyświetlacza jeśli według niego 33 jest większe od 34
    sprawdzałem z 4 kontrolerami ( 2x 2051 i 2x 4051 ) efekt ten sam
    :?:
  • Poziom 12  
    [quote="bogdan_p"]nie rozumie sensu tego programu
    Cytat:


    Sens jest bardzo prosty przy takich głupotach jak mi wychodzą z P3 szkoda rysowania aby przyporządkować bity segmentom, dlatego chciałem aby kontroler wysyłał wszystkie kombinacje na port i jednocześnie jaka to wartość dziesiętna
    Nie muszę tłumaczyć takich chyba oczywistych rzeczy:
    wysłanie np dziesiętnej 6 powoduje zapalenie 1 ma wyswietlaczu
  • Poziom 39  
    dla mnie oczywistą oczywistością jest karta , ołówek i 5 minut , mam wartości bin później mogę je przekształcić w dowolny format
    wgrałem Twój program z pewnymi zmianami dla LCD 16*2 masz błąd z lokalizacji pozycji zaczynasz od 1 linia 2 pozycja aby później od 4 wyświetlać teks jak mają być wyświetlone liczby 3 cyfrowe
    program działa bez problemów tu masz kod
    Code:
    Config Lcd = 16 * 2
    
    Cursor Off
    Cls
    Dim R As Byte , X As String * 8
    For R = 1 To 255
    P3 = R
    X = Hex(r)
    Locate 1 , 1
    Lcd R
    Locate 1 , 5
    Lcd "dzies:" ; R
    Locate 2 , 12
    Lcd X ; "HEX"
    Lowerline
    Locate 2 , 1
    Lcd P3.7 ; P3.6 ; P3.5 ; P3.4 ; P3.3 ; P3.2 ; P3.1 ; P3.0
    Wait 1
    Home
    Next R
    End     
  • Poziom 12  
    Widzę że nie możemy się do końca zrozumieć, moim problemem nie jest program tylko fakt że po jego graniu do kontrolera C2051 czy też C4051
    na porcie P3 pojawiają mi sie głupoty- takie jak powyżej w licznych przykładach
    Ciekawostko jest że na porcie P1 wszystko działa jak należy, ale dlaczego nie na P3 ?

    Jeśli ktoś ma taką możliwość niech wgra programik do kontrolera i sprawdzi czy działa na P3 "zegar binarny"

    Tak jak pisałem wyżej nie muszę podłączać wyświetlacza LED po portu P3 na samym LCD widać że coś jest nie tak: wszystko opisałem powyżej
  • Poziom 39  
    przecież Twój program z małymi poprawkami wgrałem do 89c2051 i działa prawidłowo dla P3 , co mam nakręcić film z całym cyklem 0-255 jako dowód ?
    dlaczego nie podepniesz wyświetlacza Led i sprawdzisz faktyczny stan portu a nie to co masz na Lcd , jeżeli wychodzisz z założenia że to co jest na Lcd jest święte a nie sprawdzisz stanu faktycznego portu to minie znowu kilka miesięcy Twojej pracy i myślenia , masz setki przykładów gotowych kodów i sprawdziłeś chodź jeden ....... upierasz się tylko na tym co masz na Lcd
    życzę powodzenia przy takim założeniu !
  • Poziom 12  
    Nie, nie wychodzę z takiego założenia że to co na LCD to świętość, ale to po prostu pokrywało się z tym co miałem na LED.
    Jesteś jedyną osobą która zainteresowała się moim przypadkiem. Wgrywałem różne programy i efekt był ten sam, posiedziałem godzinkę i się zastanowiłem czemu na P1 jest ok natomiast na P3 głupoty bez względu na wkładany kontroler i co wcześniej pisałem najmłodszy bit pojawia się powyżej dziesiętnej 32 czyli:


    przy 32 następuje wyzerowanie 00000000
    przy 33 00100001
    przy 34 00000010
    przy 35 00100011

    Dziwna prawidłowość :?:
    Pomyślałem że na pogrubione bity zachowują sie jak by były sterowane przez jeden pin pod warunkiem że występują razem jednocześnie czyli
    00000001 był zerowany przez wyzerowany 00100000 i dla tego powyżej 32 zaczęły obydwie te pozycje migać gdy występowały na nich " 1 "

    Sprawdziłem omomierzem piny kontrolera w płycie testowej i eureka :idea: 2 piny miały ze sobą przejście.
    Wszystkie połączenia wykonałem staranie wiec byłem zszokowany


    [img]Problem ze sterowaniem segmentami w 7-seg LED w bascom51[/img]

    w dokumentacji do płytki była informacja jak dokonać modyfikacji połączeń jeden z przylutowanych kabelków w pobliży miejsca lutu wtopił
    się w sąsiednią ścieżkę :|

    Przepraszam za zawracanie tyłka - i przede wszystkim dziękuję za chęć pomocy
    pozdrawiam Marek N.
  • Poziom 12  
    Kolega Spięcie chyba chciałby aby wysłać na wyświetlacz LED informację binarną a on miałby niby sam przetłumaczyć na dziesiętną. Niestety kolego życie nie jest takie proste, wyświetlacz LCD ma wbudowany scalaczek- dekoder a LED go nie ma i albo trzeba sobie "przetłumaczyć" programowo albo (jak nie umiemy) kupić dekoder np. CD7447 itp. Wszystko co napisałeś się zgadza i twoje Atmelki są dobre! Jeżeli wyśw. LED masz podłączony tak jak na powyższym zrzucie, to aby na wyśw. LED pojawiła się cyfra 1 do portu musisz wysłać binarne 00000110, czyli dziesiętne 6 !!! I tak jeśli chcesz cyfrę 2 do do portu ślesz binarne 01011011 = dziesiętne 91 = 5B Hex !!!!!!!! Przypomnij sobie teorię o zapisie dziesiętnym, binarnym i szesnastkowym a zaoszczędzisz sporo miesięcy. Będziesz miał pytania - wal jak w dym

    Powodzenia !