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

[C] Atmega konfiguracja pinów jako wejścia

23 Lut 2013 02:50 1827 2
  • Poziom 9  
    Witam!

    Pół dnia się głowię i jakoś pojąć nie mogę zrozumieć, dlaczego atmega mi nie chce poprawnie odczytywać tego, co dzieje się na wejściu.

    Otóż ustawiam PORTD w następujący sposób:

    Code:
    DDRD = 0b11111000;


    Pierwsze trzy PINy portu D jako wejścia, gdyż są to przyciski. Pozostałe piny jako wyjścia, bo są do nich podpięte diody. Sprawdziłem miernikiem - na wejściu jest stan wysoki (jest napięcie), gdy przycisk nie jest wciśnięty. Gdy wciskam przycisk, PIN zwierany jest do masy i napięcie się zeruje. Stąd wnioskuję, że gdy (PIND & 1) == 1 przycisk nie jest wciśnięty, a gdy (PIND & 1) == 0 przycisk jest wciśnięty.
    Na pewno wiem, że gdy na wyjściu jest stan niski, to dioda się świeci.

    Piszę więc program:
    Code:

    #include <avr/io.h>

    int main(void)
    {   
    DDRD = 0b11111000; // pierwsze trzy bity jako wejścia, pozostałych 5 jako wyjścia;
    PORTD = 0b11111000; // na wyjściach stan wysoki, żeby diody były zgaszone
       while(1)
       {
          if((PIND & 0b00000001) == 0) // jeśli pierwszy przycisk jest wciśnięty
          {
          PORTD = 0b11110000; // to zapal pierwszą diodę
          }
       }
    }


    Po tym programie oczekiwałem, że po podegraniu wszystkie diody będą zgaszone, a dopiero gdy wcisnę przycisk, jedna z nich się zapali. Okazuje się, że dioda świeci niezależnie od tego, co dzieje się z przyciskiem.

    Kolejny krok to dopisanie drugiego warunku:
    Code:
    #include <avr/io.h>
    

    int main(void)
    {   
    DDRD = 0b11111000;
    PORTD = 0b11111000;
       while(1)
       {
          if((PIND & 0b00000001) == 0)
          {
          PORTD = 0b11110000; // zapal diodę
          }
          else
          {
          PORTD = 0b11111000; // zgaś diodę
          }
       }
    }


    I to chyba tutaj najlepiej widać co jest nie tak. Otóż przy takim programie dioda lekko świeci, przygasa, chwilę świeci, chwilę nie świeci - dopiero gdy trzymam wciśnięty przycisk, świeci jak należy, bez wahań, silnym światłem. Wygląda więc na to, że gdy nie jest wciśnięty przycisk, mikrokontroler nie wie co dzieje się na wejściu, albo zbiera stamtąd losowe wartości (zmieniające się bardzo często). Tylko tak umiem sobie wytłumaczyć, że dioda wtedy przygasa, jakby co takt zegara dawano jej i zabierano napięcie.

    Pewnie to coś banalnego, tylko ja nie mogę tego zauważyć. Pomóżcie proszę, bo chciałbym rozwiązać ten problem - dlaczego mimo że nie wciskam przycisku, dioda świeci?

    Pozdrawiam!
  • Moderator Mikrokontrolery Projektowanie
    Witaj.

    rogi555 napisał:
    Po tym programie oczekiwałem, że po podegraniu wszystkie diody będą zgaszone, a dopiero gdy wcisnę przycisk, jedna z nich się zapali. Okazuje się, że dioda świeci niezależnie od tego, co dzieje się z przyciskiem.

    Nie pokazałeś schematu więc będę wróżył - brak zewnętrznego rezystora pull-up podciągającego piny przycisków do Vcc. Zamiast tego możesz włączyć programowo pull-upy wewnętrzne, ale tego nie robisz. W takiej sytuacji pin ustawiny jako wejście gdy przycisk nie jest wciśnięty (przycisk zwierający do masy) zbiera zakłócenia stając się "antenką": http://mikrokontrolery.blogspot.com/2011/04/zakocenia-w-pracy-mikrokontrolerow.html

    Wewnętrzne pull-up'y włączysz ustawiając jedynki, czyli

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W takich przypadkach zawsze pokazuj schemat i program bo to nierozerwalna całość:
    http://mikrokontrolery.blogspot.com/2011/04/fora-dyskusyjne-sa-bardzo-pomocne.html

    Poza tym zapraszamy do właściwego działu: https://www.elektroda.pl/rtvforum/forum12.html

    EDIT:
    Ode mnie w prezencie 25 pkt, bo masz zero, a na pewno się przydadzą :-)
  • Poziom 9  
    Bardzo dziękuję, teraz wszystko śmiga :) Dzięki też za polecenie bloga i oczywiście za punkty. Pozdrawiam!