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

Dlaczego diody żarzą się na atmega16 mimo ustawienia PORTB?

yahman 29 Lut 2012 13:54 1866 15
REKLAMA
  • #1 10614711
    yahman
    Poziom 16  
    Witam.

    Zaczynam przygodę z mikrokontrolerami i napotkałem pewien problem który nie wiem z czego wynika.

    W dokumentacji wyczytałem, że wartość początkowa rejestru RORTB wynosi 0.
    Napisałem krótki kod, żeby przyswoić sobie jak to wszytko działa:

    int main(void)
    { DDRB = 0xFF;
    DDRA = 0b00000000;

    while (1)
    { if(bit_is_set(PINA, PA1)) PORTB =0b00000001;
    else PORTB =0b00000010;
    }

    Po wgraniu okazuje się że diody cały czas się żarzą. Nie wiem skąd problem wynika. Czy to po prostu musi tak być, że stan na PINB musi być zawsze jasno określony? Zamierzałem po prostu przez przyciski podawać stan wysoki, a przyjmować że domyślnie jest niski.

    Może coś robię źle ?
  • REKLAMA
  • #2 10614774
    dondu
    Moderator na urlopie...
    Wygląda na to, że nie masz rezystora pull-up na przycisku, ani zewnętrznego, ani nie włączasz wewnętrznego.
    Żeby włączyć wewnętrzny rezystor pull-up konfigurując pracę portu na początku programu, powinieneś ustawić w PORTA pin PA1.

    Pokaż schemat, bo nie tylko to co napisałem powyżej może być przyczyną problemu.

    Wstawiając kod używaj znaczników SYNTAX dla kodu C.
  • #3 10614854
    yahman
    Poziom 16  
    W jaki sposób ustawić ten rezystor pull-up?

    W dtr jest coś takiego :
    Wpisanie 1 do PORTxn, podczas gdy pin skonfigurowany jest jako wyjście, spowoduje ustawienie stanu wysokiego.

    xn t jest np A1?

    schematu na razie praktycznie niema, na żywca do nóżek podpinam diody, cele edukacyjne.
  • #4 10614865
    dondu
    Moderator na urlopie...
    yahman napisał:
    W jaki sposób ustawić ten rezystor pull-up, bo w przykładach nic nie mogę znaleźć ?

    Tak samo ja włączasz diodę tylko rozkazem PORTA - ustaw odpowiedni bit.

    yahman napisał:
    schematu na razie praktycznie niema, na żywca do nóżek podpinam diody, cele edukacyjne.

    No to witam na pierwszym stopniu Piekła początkujących.
    Narysuj choćby na kartce.
  • REKLAMA
  • #5 10614933
    yahman
    Poziom 16  
    Zmieniłem trochę program.

    diody zasilam w ten sposób:
    Dlaczego diody żarzą się na atmega16 mimo ustawienia PORTB?

    ale w dalszym ciągu bez podania masy na wejście 2 diody się świecą.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 10614960
    dondu
    Moderator na urlopie...
    Schemat całego układu, a nie tylko podłączenia jednej diody.
    Skoro nie używasz programu do schematów, to narysuj na kartce i załącz.
    Tak podłączona dioda świeci gdy na wyjściu ustawisz zero.

    Teraz ustawiłeś porty prawidłowo.

    yahman napisał:
    ale w dalszym ciągu bez podania masy na wejście 2 diody się świecą.

    Napisz jakiego działania oczekujesz. Która dioda kiedy ma świecić?
  • REKLAMA
  • #7 10614975
    yahman
    Poziom 16  
    Oczekuję, że po podaniu masy na PIN2 rejestru A zapalać się będzie dioda 2
    -" else PORTB =0b11111101;"
    a jeśli nic nie podłączymy pali się tylko dioda 1
    "if(bit_is_set(PINA, PA1)) PORTB =0b11111110;"



    w sumie teraz widzę, że trochę na około do tego podszedłem. zaraz spróbuje z "bit_is_clear", ale jeśli mam ustawiony pull-up to warunek po if'ie nie powinien działać ?
  • REKLAMA
  • #9 10615320
    yahman
    Poziom 16  
    Dlaczego diody żarzą się na atmega16 mimo ustawienia PORTB?

    Jako wejścia używam PA1

    Jako wyjść PB0 i PB1
  • #10 10615338
    dondu
    Moderator na urlopie...
    Od razu lepiej. Musisz co najmniej podciągnąć pin RESET do Vcc. rezystorem od 4,7k od 10k. Bez tego narażasz mikrokontroler na ciągły stan resetu. Zrób to i sprawdź czy będzie działać poprawnie.

    Niezależnie od tego, warto byś zapoznał się z tym: Minimalne podłączanie pinów mikrokontrolera


    EDIT:
    Nie podłączyłeś pinu 30 (AVCC).
    AREF - poczytaj dokładnie zanim podłączysz do +5V.
  • #11 10615518
    yahman
    Poziom 16  
    Pomyliłem się w pośpiechu w rzeczywistości nie mam podłączone AREF tylko AVCC.

    Co do programu już działa, ale używam if(bit_is_clear(PINA, PA1)) PORTB =0b11111110;
    i wtedy jak podpinam masę to wszystko działa.

    Zastanawiam się tylko cały czas dlaczego jak miałem:
    if(bit_is_set(PINA, PA1)) PORTB =0b11111110; rejestr A ustawiony na pull-down
    i podpinałem wejście do VCC to nie działało - w sensie paliły się dwei diody.
  • #12 10615555
    dondu
    Moderator na urlopie...
    yahman napisał:
    Zastanawiam się tylko cały czas dlaczego jak miałem:
    if(bit_is_set(PINA, PA1)) PORTB =0b11111110; rejestr A ustawiony na pull-down
    i podpinałem wejście do VCC to nie działało - w sensie paliły się dwei diody.

    Ten mikrokontroler nie ma rezystorów pull-down. Dlatego jeżeli miałeś go wyłączony, a wejście nie podpięte do żadnego potencjału, to łapie on wszelkie zakłócenia, na które mikrokontroler odpowiednio reaguje programem. Zakłócenie mogło powodować, że raz odczytywał 1, a raz 0 przez co zapalał obie diody na przemian (bardzo szybko).

    Jeżeli miałeś pull up wyłączony, ale wymuszałeś na nim stan wysoki podpinając pod Vcc, to twój program powinien był zaświecać tylko jedną diodę, tę na PB0.

    Jeżeli świeciły się obie, to prawdopodobnie chodziło o niepodpięty RESET, o którym pisałem wcześniej - zrób eksperymenty mając już wiedzę :)

    I na koniec:
    Zawsze dbaj o prawidłowe podłączenie mikrokontrolera i zaczynaj od przygotowania schematu, przynajmniej zanim zapytasz na forum :)
  • #13 10615591
    yahman
    Poziom 16  
    Już wszytko jasne, faktycznie nie sprawdziłem że nie ma "pull-down"

    Dzięki za uwagi, będę pamiętał.


    Mam jeszcze jedno pytanie z innej beczki, szukam już jakiś czas jak rozumieć oznaczenia typu:

    PORTB ^=_BV(7);
    PORTB |= _BV(2); czy to znaczy, że sumuje bitwo wyjście z bitem z 00000100 i wynik jest wystawiany na wyjściu ?

    wiem, że te symbole operacji bitowych, ale dlaczego przeglądając proste przykłady ludzie stosują takie zabiegi, zamiast wprost wysterować wyjście?
  • #14 10615691
    dondu
    Moderator na urlopie...
    yahman napisał:
    Mam jeszcze jedno pytanie z innej beczki, szukam już jakiś czas jak rozumieć oznaczenia typu:

    PORTB ^=_BV(7);
    PORTB |= _BV(2); czy to znaczy, że sumuje bitwo wyjście z bitem z 00000100 i wynik jest wystawiany na wyjściu ?

    wiem, że te symbole operacji bitowych, ale dlaczego przeglądając proste przykłady ludzie stosują takie zabiegi, zamiast wprost wysterować wyjście?

    Są różne metody operacji na bitach. Ja preferuję bez stosowania makr _BV() itp. Używam przesuwania bitowego wraz z nazwami pinów. Używanie nazw pinów zamiast liczb hex czy binarnych daje wielką przejrzystość kodu, i łatwość jego przenoszenie pomiędzy różnymi mikrokontrolerami. Dodatkowo po pół roku nie musisz zaglądać do datasheet by sprawdzić co oznacza 6 bit na przykład w SFIOR, tylko widzisz, że to ADTS1, bo takiej nazwy używasz w kodzie.

    Czyli zamiast:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    stosuję:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Poza tym, nie zawsze chcesz lub możesz zmieniać wszystkie bity, czasami trzeba tylko jeden z nich.

    Szczegóły tutaj oraz w pułapkach AVRów
  • #15 10645422
    Sławek-K
    Poziom 15  
    Kolega dondu jest tu fachowcem ,więc ma w 100% rację.
    Ja natomiast dorzucę (też jako początkujący w C) małą sugestię (która się zresztą potwierdziła na forum).
    AVRy (ja miałem ATmega 32) maja te rezystory podciągające rzędu 40-50k omów. Przy małych płytkach w domowych warunkach wszystko jest Ok. Sytuacja się zmienia gdy wejście jest podłączone np przez 0,5m przewód i np w pobliżu są jakieś silniki (czy inne urządzenia z polem EM). Wtedy rezystor ten zwyczajnie jest za duży i należy zmniejszyć (dołożyć zewnętrzny). Miałem taki właśnie przypadek (już na początku programowania kłody pod nogi) i stan na wyjściu uP czasami zmieniał się inaczej niż to wynikało z mojego bardzo prostego programu . W niektórych sytuacjach warto to wziąć pod uwagę.
  • #16 10645485
    dondu
    Moderator na urlopie...
    Sławek-K napisał:
    Kolega dondu jest tu fachowcem ,więc ma w 100% rację.

    O nie, ja także popełniam błędy :) np. tutaj

    Sławek-K napisał:
    W niektórych sytuacjach warto to wziąć pod uwagę.

    To bardzo słuszna uwaga. Jednakże autor tematu chyba nie ma tego problemu.
REKLAMA