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 8 - Czytanie stanu wejścia w zależności od wyjścia

Nollie 30 Mar 2016 17:40 954 10
  • #1 30 Mar 2016 17:40
    Nollie
    Poziom 4  

    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.



    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.

    0 10
  • Pomocny post
    #2 30 Mar 2016 17:55
    yokoon
    Poziom 28  

    Witam.
    Sprawdzenie stanu na pinie:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #3 30 Mar 2016 18:16
    2675900
    Użytkownik usunął konto  
  • Pomocny post
    #4 30 Mar 2016 19:29
    el2010tmp
    Poziom 25  

    Nollie napisał:
    if (PINB && (1<<PB0)) //jezeli wykryje na PB0 "1"

    To jest iloczyn logiczny a powinien być binarny:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    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:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 30 Mar 2016 20:37
    dondu
    Moderator Mikrokontrolery Projektowanie

    Przede wszystkim kurs C z kompilatorem online: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    bo:

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

    To jest iloczyn logiczny a powinien być binarny:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    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:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Powyższa linijka jest poprawna, ale komentarz błędny.

    0
  • #6 31 Mar 2016 12:47
    Nollie
    Poziom 4  

    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.

    0
  • #7 31 Mar 2016 12:52
    JacekCz
    Poziom 35  

    Nollie napisał:
    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.

    0
  • Pomocny post
    #8 31 Mar 2016 13:28
    BlueDraco
    Specjalista - Mikrokontrolery

    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.

    0
  • #9 31 Mar 2016 13:41
    Nollie
    Poziom 4  

    @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?

    0
  • #10 31 Mar 2016 17:01
    BlueDraco
    Specjalista - Mikrokontrolery

    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.

    0
  • Pomocny post
    #11 31 Mar 2016 18:34
    emarcus
    Poziom 34  

    Nollie napisał:
    [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

    Cytat:


    Czy rejestr przesuwny rozwiązałby moj problem?


    Tu processor pełni tę funkcję.

    e marcus

    0