Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega 8 - Czytanie stanu wejścia w zależności od wyjścia

Nollie 30 Mar 2016 17:40 1281 10
  • #1
    Nollie
    Level 7  
    Cześć,

    chciałbym zwrócić się z pytaniem (prawdopodobnie banalnym dla was, dlatego proszę nie odsyłajcie mnie do google - przebrnąłem przez całe...), mianowicie:

    Próbuje zrobić tester ciągłości przewodu. Wg mojego pomysłu miałoby to wyglądać następująco: PORTD 0x01 ustawiam jako wyjście w stanie wysokim, następnie podłączam je do PORTB 0x01 i jeżeli wykryje tam "1" - przewód jest ciągły, jeżeli nie - jest przerwa w obwodzie. Niestety, nie wiem jak wykonać to programowo - poniżej zamieszczam sposób w jaki próbowałem to zrobić i byłbym niezmiernie wdzięczny jeżeli naprowadzilibyście mnie na prawidłowy tok myślenia.



    Code: c
    Log in, to see the code


    Moje połączenia wyglądają następująco:
    (w załączniku - brak wystarczającej ilości postów do udostępniania linków)


    Z góry dziękuje za pomoc.
  • Helpful post
    #2
    yokoon
    Level 29  
    Witam.
    Sprawdzenie stanu na pinie:

    Code: c
    Log in, to see the code
  • Helpful post
    #3
    User removed account
    User removed account  
  • Helpful post
    #4
    el2010tmp
    Level 25  
    Nollie wrote:
    if (PINB && (1<<PB0)) //jezeli wykryje na PB0 "1"

    To jest iloczyn logiczny a powinien być binarny:
    Code: c
    Log in, to see the code

    Poza tym jest OK

    Możesz jednak zastosować podciągnięcie na PB0 i zwierać go do masy (zaoszczędzisz jeden pin). Wówczas warunek będzie wyglądał tak:
    Code: c
    Log in, to see the code
  • #5
    dondu
    Moderator on vacation ...
    Przede wszystkim kurs C z kompilatorem online: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    bo:

    el2010tmp wrote:
    Nollie wrote:
    if (PINB && (1<<PB0)) //jezeli wykryje na PB0 "1"

    To jest iloczyn logiczny a powinien być binarny:
    Code: c
    Log in, to see the code


    i do tego AVR: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html

    Poza tym, gdy wklejasz kod na forum to komentarze także muszą być poprawne, gdyż wtedy wyłapujemy błędy, które robisz:

    Code: c
    Log in, to see the code

    Powyższa linijka jest poprawna, ale komentarz błędny.
  • #6
    Nollie
    Level 7  
    Dzieki za odpowiedzi. Udało mi sie to zrobic, ale mam kolejne pytanie jak można by to uprościć. W obecnej wersji mam podłączone kolejne wyjscia PD0...7 do wejśc PB0...7. Jednak czy tak naprawdę potrzebuje tych wszystkich wyjść? Czy istnieje jakis "przełącznik" dzieki któremu mógłbym używać tylko jednego wyjścia PD0?

    Tj. próbuje zrobic tester wiązki. dla pierwszej iteracji miałbym "jakis przełącznik" w pozycji dla pierwszego przewodu i oczekiwałbym sygnału na PB0. Jezeli sie pojawi - pierwszy przewód z wiązki przewodzi. Następnie wyłączam wyjście PD0. W kolejnej iteracji przełączam przełącznik na pozycje dla drugiego przewodu wiązki i załączam PD0 - oczekuje sygnału na PB1. Itd aż do 8 przewodu wiązki.

    Moje pytanie, gdzie powinienem szukać takiego "przełącznika"? Powinien byc sterowany z innego wyjścia sterownika. Jak nazywa sie takie cudeńko?

    Z góry dziękuje za dalsze odpowiedzi.
  • #7
    JacekCz
    Level 39  
    Nollie wrote:
    Dzieki za odpowiedzi. Udało mi sie to zrobic, ale mam kolejne pytanie jak można by to uprościć. W obecnej wersji mam podłączone kolejne wyjscia PD0...7 do wejśc PB0...7. Jednak czy tak naprawdę potrzebuje tych wszystkich wyjść? Czy istnieje jakis "przełącznik" dzieki któremu mógłbym używać tylko jednego wyjścia PD0?

    Tj. próbuje zrobic tester wiązki. dla pierwszej iteracji miałbym "jakis przełącznik" w pozycji dla pierwszego przewodu i oczekiwałbym sygnału na PB0. Jezeli sie pojawi - pierwszy przewód z wiązki przewodzi. Następnie wyłączam wyjście PD0. W kolejnej iteracji przełączam przełącznik na pozycje dla drugiego przewodu wiązki i załączam PD0 - oczekuje sygnału na PB1. Itd aż do 8 przewodu wiązki.

    Moje pytanie, gdzie powinienem szukać takiego "przełącznika"? Powinien byc sterowany z innego wyjścia sterownika. Jak nazywa sie takie cudeńko?



    To co piszesz (nie do końca zrozumiałem) ma podobieństwa do sterowania matrycowego. Przysłowiowy wyłącznik nie byłby wpięty pomiędzy masę a pin, tylko diodami między bity "portu selektora" a bit "wejścia". Zastrzegam, nie do końca rozumiem, taka intuicja mi się odzywa.
    Porty wyjściowe (czyli selektora) nie mają dwóch stanów 0 i 1, tylko mają "stan trzeci" o wysokiej impedancji. Jakoś to sobie przemyśl.
  • Helpful post
    #8
    BlueDraco
    MCUs specialist
    Nie ma nic prostszego, niż połączenie każdego końca przewodu do innej linii portu uC. Minimalistyczne testowanie wiązki polega na tym, że ustawiasz wszystkie linie poza jedną jako wejścia podciągnięte do plusa, jedną jako wyjście w stanie 0 i sprawdzasz, czy masz dokładnie jedno wejście w stanie 0. I tak dla każdej linii. Jeśli brakuje Ci linii portów - weź mikrokontroler z większą liczbą nóżek - zawsze będzie taniej i łatwiej niż kombinowanie z zewnętrznymi układami.
  • #9
    Nollie
    Level 7  
    @BlueDraco, takie rozwiazanie byłoby dobre, ale chciałem aby ten układ pełnił jednocześnie role testera zwarć, a w Twoim układzie chyba wtedy ich nie wykryje ( jezeli wszystkie wejścia beda podpięte do jednego wyjścia ). Czy rejestr przesuwny rozwiązałby moj problem? Czy zle kombinuje?
  • #10
    BlueDraco
    MCUs specialist
    Właśnie taki układ, o jakim piszę wykrywa zwarcia. Nigdzie nie pisałem o jednym wyjściu - czytaj uważnie. Każdy koniec każdego przewodu podłączasz do innej linii portu uC.
  • Helpful post
    #11
    emarcus
    Level 38  
    Nollie wrote:
    [b]takie rozwiazanie byłoby dobre, ale chciałem aby ten układ pełnił jednocześnie role testera zwarć, a w Twoim układzie chyba wtedy ich nie wykryje ( jezeli wszystkie wejścia beda podpięte do jednego wyjścia ). Czy zle kombinuje?


    Czy zle kombinuje?
    Nie całkiem źle, lecz nie dokładnie... W zasadzie budujesz "Continuity Tester".
    'Continuity'- znaczy mniej więcej jak 'ciągłosc' - co jest wynikiem zwarcia dwóch odcinków przewodu.
    Jeżeli masz do wytestowania na przykład wiązkę 8 przewodów, to podłączając je do oddzielnych wejśc dowolnego portu , masz mozliwośc scanowania tego układu w stylu podobnym do keypad 4x4. Jeżeli wykryjesz odwzorowany 'naciśnięty któryś przycisk' znaczy że masz te 2 linie zwarte. Obsługa takiej klawiatury jest standardem w każdym środowisku IDE; W AtmelStudio i Arduino - odpowiednia library; w Basic-Bascom jest wbudowa w IDE. Możesz napisac własną procedurę scanowania portu co nie zmienia konceptu.
    Możesz wprowadzic pewne zmiany do procesu scanowania odnośnie timingów i ewentualności zwarcia więcej niż dwóch przewodów, czyli analogia do naciśnięcia równocześnie więcej niż jeden przycisk.
    Wynik testu możesz pokazac na didach albo nawet wyświetlic przygotowane informacje na LCD

    Quote:


    Czy rejestr przesuwny rozwiązałby moj problem?


    Tu processor pełni tę funkcję.

    e marcus