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

[Atmega 32][Bascom] Celowy brak stanu

dawid512 12 Cze 2008 21:36 2046 10
  • #1 12 Cze 2008 21:36
    dawid512
    Poziom 32  

    Witam serdecznie forumowiczów.

    Mam z pozoru błachy problem. Mianowicie wiem jak wystawić stan wysoki i niski, niestety zaszła konieczność wystawienia na odpowiednią końcówkę portu "Braku stanu" czyli nie może to być 1 ani 0 dosłownie "pustka". Jak najprościej sobie z tym poradzić?

    0 10
  • Pomocny post
    #2 12 Cze 2008 21:42
    Zdzicho
    Poziom 24  

    Stan nieokreślony będzie w przypadku ustawienia portu jako wejście bez rezystora podciągającego.

    0
  • #3 12 Cze 2008 21:51
    dawid512
    Poziom 32  

    Czyli jeśli dobrze rozumiem aby celowo ustawić stan nieokreślony muszę za każdym razem ustawiać określoną końcówkę portu jako wejście?

    0
  • Pomocny post
    #4 12 Cze 2008 21:57
    ZbeeGin
    Poziom 38  

    Tak. Bo w takim stanie przerzutnik portu nie wymusza stanu logicznego z rejestru PORT a jedynie steruje tranzystorem, który służy jako podciąganie wejścia do zasilania (ekwiwalent rezystora ok. 50k).
    Dlatego do odpowiednich bitów DDRxy i PORTxy należy wpisać zera.

    0
  • #5 12 Cze 2008 22:41
    dawid512
    Poziom 32  

    Dziękuje panowie ale to nie koniec... Sprawa wygląda tak że multiplexuje wyświetlacze 7-segmentowe LED. Problem tkwi w tym że zasilane one są napięciem 12V. Stanem niskim zapalam odpowiedni segment zaś stanem wysokim go wygaszam. Cała istota sprawy jest taka że występuje różnica potencjałów i uc nie jest w stanie wygasić segmentów(bo 1 logiczna to 5V).
    Kombinuję jakby to ugryźć bez stosowania konwerterów napięć. Muszę więc jedynkę logiczną zastąpić stanem nie określonym ale jak to zrobić bo przecież kody dla segmentów są wpisywane w postaci binarnej.

    Pozdrawiam Dawid.

    0
  • #6 12 Cze 2008 22:44
    Balu
    Poziom 38  

    LOL:]
    Możesz spróbować sterować zamiast PORTem to DDRem.

    0
  • #7 12 Cze 2008 23:02
    dawid512
    Poziom 32  

    Tak tyle że czegoś takiego

    Code:
    DDRD = &B01101111 : &B10010000
    nie umieszczę w liniach data bo kompilator wywala mi błąd. Nie mogę także z góry ustawić DDRx bo musi się to zmieniać tak żeby otrzymać określoną cyfrę. Czyżby jedyne rozwiązanie to konwerter napięć TTL na CMOS?

    0
  • #8 12 Cze 2008 23:37
    Balu
    Poziom 38  

    Zapytam nieśmiało bo me nie wie, co to za zapis? z tym dwukropkiem?

    0
  • #9 13 Cze 2008 10:19
    dawid512
    Poziom 32  

    Code:
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , DDRD = &B01101111 : &B10010000


    Teraz jaśniej? Są to kody w postaci binarnej które są wystawiane bezpośrednio na port podczas multiplexowania. Jeżeli chcę mieć stan nieokreślony to muszę daną końcówkę ustawić jako wejście a resztę jako wyjścia i po wstawiać im 0.

    0
  • Pomocny post
    #10 13 Cze 2008 11:11
    marek_Łódź
    Poziom 36  

    dawid512 napisał:
    Dziękuje panowie ale to nie koniec... Sprawa wygląda tak że multiplexuje wyświetlacze 7-segmentowe LED. Problem tkwi w tym że zasilane one są napięciem 12V. Stanem niskim zapalam odpowiedni segment zaś stanem wysokim go wygaszam. Cała istota sprawy jest taka że występuje różnica potencjałów i uc nie jest w stanie wygasić segmentów(bo 1 logiczna to 5V).
    Kombinuję jakby to ugryźć bez stosowania konwerterów napięć. Muszę więc jedynkę logiczną zastąpić stanem nie określonym ale jak to zrobić bo przecież kody dla segmentów są wpisywane w postaci binarnej.

    Pozdrawiam Dawid.
    To może być dość bolesne :( . Podanie 12V przez segment wyświetlacza bezposrednio na port, nawet ustawiony jako wejście będzie skutkowało zamknięciem obwodu przez diody na wejściu portu do VCC. Segmenty nie tylko będą świecić, ale ich prąd może spalić port. Tak więc problem nie jest na poziomie programu, ale w sprzęcie. Zastosuj układy OC (ULN2803) i problem rozwiązany.

    Jeśli chodzi o rozwiązania programowe, to o ile mi wiadomo, w BASCOMIE możesz w biegu przekonfigurować pin z wejścia na wyjście i viceversa. Gdyby kompilator się na to wypinał, zawsze możesz to zrobic wstawką asemblerową, ale tak jak wcześniej napisałem układ i tak nie zapracuje.

    0
  • #11 14 Cze 2008 00:08
    dawid512
    Poziom 32  

    Tak się składa że mam w swoim module uruchomieniowym ten układzik (ULN2803). Po wykonaniu testów okazuje się że był to strzał w dziesiątkę bo przecież układ ULN2803 wystawia 0 po podaniu mu 1, zaś gdy poda się 0 to nie wystawia nic czyli to co było zamierzane :). Ponadto prąd jaki płynie w obwodzie segment-ULN2803 wynosi 27mA czyli jednak powyżej tego co może wytrzymać port.

    Dziękuję serdecznie za pomoc i zamykam temat.

    Pozdrawiam Dawid.

    0