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

[Atmega 32][Bascom] Celowy brak stanu

dawid512 12 Cze 2008 21:36 2283 10
  • #1 5240358
    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ć?
  • Pomocny post
    #2 5240388
    Zdzicho
    Poziom 25  
    Stan nieokreślony będzie w przypadku ustawienia portu jako wejście bez rezystora podciągającego.
  • #3 5240436
    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?
  • Pomocny post
    #4 5240455
    ZbeeGin
    Poziom 39  
    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.
  • #5 5240603
    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.
  • #7 5240700
    dawid512
    Poziom 32  
    Tak tyle że czegoś takiego
    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?
  • #9 5241410
    dawid512
    Poziom 32  
    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.
  • Pomocny post
    #10 5241540
    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.
  • #11 5244117
    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.
REKLAMA