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

ATMEGA 16 Bascom. I/O jednocześnie

januss73 24 Maj 2010 16:01 2834 16
  • #1 8112595
    januss73
    Poziom 32  
    Wiem, że to proste pytanie. Przejrzenie paru tematów nie dało mi jednoznacznej dpowiedzi.

    Czy da się tak zrobić?

    portB ustawiony na wejście.

    pinB.1 podciągnięty do masy.

    Pod pinB.1 podpięty switch (podciągający do V+)

    dioda LED podpięta katodą do masy i anodą do pinB.1.

    Uda się tak zrobić, żeby kontroler reagował na switch? Chodzi o to że naciskam switch, kontroler robi coś tam i zapala diodę.
  • Pomocny post
    #2 8112605
    utak3r
    Poziom 25  
    Przełączać kierunek pinu da się, ale widzę tu mały problem logiczny: jak będziemy wejściem, led nie będzie świecił, jak będzie świecił led, nie będziemy mogli sczytać przycisku... musiałbyś bardzo szbko przełączać kierunek - ale nie wiem, ile czasu takie przełączenie trwa...
  • Pomocny post
    #3 8112625
    GSM
    Poziom 25  
    Witam,

    stan rejestrów DDRx jednoznacznie stanowi o tym czy dany port/pin jest ustawiony jako wejście czy też wyjście, nie ma stanów pośrednich...
    Poza tym, jak wciśniesz przycisk to ten LED i tak się zaświeci :roll:

    Pozdrawiam,
    GSM
  • #4 8112647
    januss73
    Poziom 32  
    Chodzi o to żeby led się zaświecił i tak został :)

    Takich pinów będzie więcej i pin nie będzie musiał reagować na switch w momencie kiedy led już będzie świecił. Reagować jako input będzie musiał dopiero gdy innym pinem led zostanie zgaszony i pin znów będzie low.

    O ile się orientuję nie powinno być problemu jeśli rejestrem ddrb będę mógł sterować nie jako deklaracją na początku programu, a gdzieś w pętli. Da się tak?

    Sory za może nie na poziomie pytania, z programowaniem uc mam do czynienia tyle co nic.
  • Pomocny post
    #5 8115037
    Maciekqbn
    Poziom 15  
    Pomijając fakt, że sam pomysł jest dziwny ... to powinno to działać tak jak planujesz.
    Kierunek portu (wartość rejestru ddr) możesz zmienić w dowolnym miejscu programu, nie tylko w deklaracji na początku.

    Czyli na początku programu deklarujesz pinb.1 jako wejście, zerujesz pinb.1 (reset). W programie sprawdzasz co jakis czas czy pinb.1 jest ustawiony (H). Jesli tak, do zmieniasz kierunek i ustawiasz stan wysoki. Oczywiście (jak już poprzednicy wspomnieli) w tym momencie tracisz możliwość odczytu stanu przycisku.

    W szereg z diodą wstaw rezystor, bo jak podasz stan wysoki na B.1 ustawiony jako wyjście, to możesz diodzie zaszkodzić - z AVR w stanie wysokim "wychodzi" napięcie o wartości bliskiej napięcia zasilania układu i wydajności 20mA. No chyba, że to jakaś dioda, która wymaga aż tak dużego prądu.
  • #6 8115667
    mirekk36
    Poziom 42  
    januss73 napisał:
    Uda się tak zrobić, żeby kontroler reagował na switch? Chodzi o to że naciskam switch, kontroler robi coś tam i zapala diodę.


    Ty lepiej powiedz co chcesz uzyskać tak ogólnie, to chętnie ci ludzie podpowiedzą jak to rozwiązać. Bo wymyśliłeś sposób iście cyrkowy, potrójne salto mortale z pętelką a w sumie tylko po to, żeby JEDEN RAZ zadziałało po resecie procesora. Nieco albo nawet bardzo bez sensu ;) no chyba że to ma jakiś dla ciebie głębszy sens.

    Poza tym wydziwiasz nieco z podłączaniem słicza do VCC zamiast do GND - musiałbyś zatem jeszcze dać rezystor podciągający do GND.

    I na co to wszystko ??? - skoro można to zrobić milion razy prościej - napisz tylko co chcesz uzyskać - proponuję. Bo tak wszyscy rozważają czy sztuczka się uda. Owszem uda się tylko po co?
  • Pomocny post
    #7 8115742
    michalko12
    Specjalista - Mikrokontrolery
    Musisz przyjąć że pin normalnie jest wyjściem i steruje diodą.
    Co jakiś czas zapamiętujesz stan wyjścia, przełączasz na wejście, odczekujesz moment na ustabilizowanie się stanu na wejściu i pobierasz stan wejścia a następnie przełączasz port na wyjście i odtwarzasz jego stan z przed odczytu stanu przycisku.
  • #8 8117961
    januss73
    Poziom 32  
    mirekk36 napisał:
    januss73 napisał:
    Uda się tak zrobić, żeby kontroler reagował na switch? Chodzi o to że naciskam switch, kontroler robi coś tam i zapala diodę.


    Ty lepiej powiedz co chcesz uzyskać tak ogólnie, to chętnie ci ludzie podpowiedzą jak to rozwiązać. Bo wymyśliłeś sposób iście cyrkowy, potrójne salto mortale z pętelką a w sumie tylko po to, żeby JEDEN RAZ zadziałało po resecie procesora. Nieco albo nawet bardzo bez sensu ;) no chyba że to ma jakiś dla ciebie głębszy sens.

    Poza tym wydziwiasz nieco z podłączaniem słicza do VCC zamiast do GND - musiałbyś zatem jeszcze dać rezystor podciągający do GND.

    I na co to wszystko ??? - skoro można to zrobić milion razy prościej - napisz tylko co chcesz uzyskać - proponuję. Bo tak wszyscy rozważają czy sztuczka się uda. Owszem uda się tylko po co?


    Dzięki za poprawienie wieczornego humoru (całkiem szczerze)

    Chodzi o to, że mam uc i ograniczoną ilość pinów i chcę uniknąć stosowania ekspanderów, bo zwykle większy kontroler wychodzi taniej jak mniejszy plus ekspander, no i mam mniej ic na pcb.
    A więc mam uc pod który podłączam multileksery, ot choćby 151. Na 151 idą 3 piny na A, B i C do sterowania. Do każdego wyjścia z multipleksera przyporządkowany jest jeden pin do swicha, który ustawia odpowiednio piny sterujące multipleksera. No i tu cały problem. Chcę Wciskać przycisk, multiplekser ustawia odpowiednie wyjście, czyli potrzebuję dla 151 8 switchy. Żeby zaoszczędzić sobie pinów uc chcę też pinami switchy zapalać diody, żeby mieć jakąś kontrolę nad tym co jest ustawione. To ma być po prostu taki dość rozbudowany selektor bez wyświetlacza.
    Chyba muszę w tym przypadku podciągać piny pod GND, bo inaczej nie zrealizuję funkcji switch/led na jednym pinie.
    Poza tym trochę doczytałem i doszedłem do wniosku, że chyba nie będę musiał nic mieszać w rejestrze ddrx bo"
    1. Ustawiam port na stałe jako wejście
    2. Taki port w stanie wysokim wyrzuca prąd, więc zapala leda
    3. W stane niskim ma poziom wysokiej impedancji dla tego podciągam pod GND. W ten sposób nie będzie świrował.
    4. Po wciśnięciu i ustawieniu na 1, czyli zapaleniu diody i ustawieniu multiplexera nie musi, a nawet nie powinien reagować na ponowne wciśnięcie.
    5. Po wciśnięciu switcha innego podobnego pinu multiplekser ustawi się odpowiednio, zapali się dioda tego innego switcha, a pin switcha poprzedniego znów będzie low i gotowy do odczytu.

    Jeśli mój tok rozumowania jest błędny idę po sznurek :)

    Dzięki wszystkim za dotychczasową pomoc.
  • #9 8118044
    mirekk36
    Poziom 42  
    No to może zastanów się (skoro już i tak chcesz zdecydować się na jakiś zewnętrzny scalak) np na Expander 16bitowy I2C PCF8575

    Nie dość, że w procku zużyjesz TYLKO 2 !!! piny na magistralę I2C to jeszcze będziesz miał do dyspozycji 16 pinów. Możesz sobie 8 z nich ustawić jako wejścia i podłączyć do nich swoje słicze. Natomiast kolejne 8 bitów ustawiasz jako wyjścia i podłączasz do nich najspokojniej w świecie swoje diody LED (też bezpośrednio do pinów bo mają odpowiednia wydajność prądową)

    Powiem więcej, układ ten będzie miał dla ciebie IDEALNĄ opcję, ponieważ ma wyjście INT. Oznacza to, że może on generować przerwanie gdy zostanie wciśnięcty jakiś klawisz. Gdy zostanie ono zgłoszone to wystarczy , że po szynie I2C sprawdzisz jeszcze raz czy i który klawisz lub klawisze są wciśnięte (bo może być kilka naraz nawet wciśniętych) i proszę bardzo - także po szynie I2C zapalasz sobie opdowiadające im diody LED (Wiesz jak to drastycznie upraszcza obsługę takiej klawiaturki ???? SZOK! - wiem bo sam takie klawiaturki robiłem tyle że na PCF8574 bo nie potrzebowałem aż tyle słiczy a do nich diod LED)

    a tylko 2 piny procesora zużyte ;)

    A jeśli przypadkowo zachce ci się mieć 16 słiczy i 16 diod LED to dajesz 2 takie scalaki na szynie I2C i proszę bardzo! .... a nadal tylko 2 piny procesora zużyte ;) i jaka wygoda bo wszystko ładnie od razu na przerwaniach.

    .... poza tym - może jakaś klawiatura matrycowa ????

    Dodano po 4 [minuty]:

    a zamiast iść po sznurek, idź po dobre piwko - to od razu olśnienia dostaniesz ;)
  • #10 8118378
    GSM
    Poziom 25  
    Akurat klawiatura matrycowa to moim zdaniem nieporozumienie w przypadku tak krótkiego selektora. Rozwiązanie jakie obmyślił autor wątku jest proste i całkiem eleganckie - nie ma przeciwwskazań by go nie stosować.
    Wszystko co potrzebne autorowi do realizacji tej ideii zostało już w tym wątku wyjaśnione.

    Pozdrawiam,
    GSM

    P.S.
    Co do wyjścia /INT ekspanderów, chcoiażby nowsze AVR'y posiadają takie coś takiego jak Pin Change Interrupt dla całego portu ;)
  • #11 8118399
    utak3r
    Poziom 25  
    Jedyny problem, jaki się jawi z taką metodą, to to, że należy w dokumentacji odnaleźć, ile czasu trzeba odczekać na ustabilizowanie się stanu na pinie, dopiero wtedy odczytać i przestawić kierunek. Może się okazać, że czas ten jest na tyle długi, że... dioda zacznie nam mrugać - ma ona dość małą bezwładność i reaguje na nawet krótkie czasy przerwania dopływu prądu.
  • #12 8118412
    Konto nie istnieje
    Poziom 1  
  • #13 8118459
    utak3r
    Poziom 25  
    Masz rację, obciążenie decyduje o tym. Sorry, zmulony lekami dziś jestem :)
  • #14 8118692
    mirekk36
    Poziom 42  
    GSM napisał:
    Akurat klawiatura matrycowa to moim zdaniem nieporozumienie w przypadku tak krótkiego selektora.


    - jakie nieporozumienie? o ile dobrze zrozumiałem (chyba że coś jednak źle) to chodzi i stworzenie klawiaturki 8 słiczy a do tego 8 diod LED. Jeśli tak to już klawiatura matrycowa 3x3 daje możliwość obsługi 8 słiczów a 8 diod LED można obsłużyć sobie dowolnym rejestrem przesuwnym. Wyjdzie się wprawdzie poza ilość 8 pinów procka no ale to już zaproponowałem do rozważenia.

    GSM napisał:
    Rozwiązanie jakie obmyślił autor wątku jest proste i całkiem eleganckie - nie ma przeciwwskazań by go nie stosować.


    co do eleganckości to bym polemizował, no ale każdy może mieć własne zdanie. Zrobić na pewno się da - tylko programowa zabawa z tym jest wg mnie bez sensu, skoro podstawowym ponoć założeniem było ograniczenie do minimum ilości pinów procka - stąd pomysł z expanderem PCF


    GSM napisał:
    P.S.
    Co do wyjścia /INT ekspanderów, chcoiażby nowsze AVR'y posiadają takie coś takiego jak Pin Change Interrupt dla całego portu ;)


    sorki, ale co ma piernik do wiatraka jeśli chodzi o zaproponowane rozwiązanie z PCF, który wykorzystuje tylko 2 piny (no trzy jeśli skorzystać z INT) procka (I2C) z możliwością podłączenia 8 słiczy .... a ..... zajęcia 8 linii procka korzystających z PCINT, który nawet miałby PCINT.

    Przy okazji warto zwrócić uwagę, że procek wspomniany w tytule tematu nie ma PCINT.

    Nie będę się oczywiście upierał, że rozwiązanie z expanderami PCF jest jedynie słusznym i najlepszym rozwiązaniem ;) .... każdy zrobi jak zechce. Tyle, że nieraz warto zawczasu przemyśleć sprawy programowej obsługi pewnych dziwnych rozwiązań sprzętowych. Bo zgadzam się , że oprogramowac można i to najróżniejsze rzeczy - tylko, że później wychodzi taka sztuka dla sztuki i gimnastyka bo przez taką dziwną obsługę a to timera brakuje, a to gdzieś czasu w przerwaniu, a to miejsca w pamięci flash itd

    Proponuję autorowi, żeby sobie najpierw na płytce stykowej przetestował jakieś rozwiązanie albo ze dwa i wtedy łatwiej będzie się na któreś zdecydować - gdy wyjdzie w praniu od strony programowej co i jak - tak na własnej skórze a nie tylko na bazie luźnych podpowiedzi, że przecież da się to oprogramować. szczególnie jeśli program będzie miał robić jeszcze wiele czy kilka innych rzeczy równocześnie.
  • #15 8118761
    GSM
    Poziom 25  
    Nieporozumienie w sensie dużo roboty, a do projektu który zakłada minimalizację ilości elementów i maksymalizację prostoty jest to jedno z lepszych rozwiązań, jeżeli zaś chcemy robić jakiś duży projekt to takie modułowe podejście jakie prezentujesz jest jak najbardziej na miejscu.

    Dlatego napisałem, że inne posiadają PCINT;)

    Pozdrawiam,
    GSM
  • #16 8119027
    Konto nie istnieje
    Poziom 1  
  • #17 8119212
    mirekk36
    Poziom 42  
    No sorki, ale coraz większe mega kombinacje widzę. atom1477 toż już jakbym ja miał dawać 30kilogramów rezystorów itp a cały czas miałbym na uwadze oszczędność pinów to zaproponowałbym już takie rozwiązanie, jak poniżej, jesli ktoś usilnie woli wkładać setki pchełek zamiast jednego scalaka PCF ;)

    chyba każdy słyszał i obiło mu się o uszy coś takiego jak klawiaturka analogowa - można podłączyć mnóstwo klawiszy a tylko JEDEN PIN !!!! procka wykorzystać.

    A wtedy jeśli są wolne piny to 8szt przeznaczyć na 8 diod LED. A jeśli nadal mało pinów to nadal będę polecał albo PCF8574 (8-bitowy expanderek) tylko 2 piny do obsługi bo już INT nie będzie potrzebny albo jakiś rejestr przesuwny np 74164 - i ze 2-3 piny do obsługi

    No pomyślcie ludziska o tym, że obsługa klawiszy jakiekolwiek by nie były powinna być jak najprostsza w programie całym, żeby mógł wszystko inne robić a nie główne zadanie to obsługa klawiatury.

    Poniżej schemat klawiaturki analogowej, wystarczy tylko dobrać rezystory żeby zrobić odpowiednie dzielniki napięcia a jako źródło odniesienia spokojnie można ustawić za pomocą bitów REFSx jako VCC. Dodam, że klawiszy można spokojnie o wiele więcej podłączyć do takiej klawiaturki, a programowa obsługa znowu PROSTA jak MEGA DRUT !!!

    ATMEGA 16 Bascom. I/O jednocześnie
REKLAMA