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

[Atmega16][C] Napięcie na pinie

tmazur 01 Cze 2011 23:21 1199 18
REKLAMA
  • #1 9568192
    tmazur
    Poziom 10  
    Witam,

    Sytuacja ma miejsce na pinie nr 0 portu A. Ustawiam stan wysoki na pinie w sposób

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


    co daje napięcie 3.7V. Następnie ustawiam stan niski w sposób

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


    co daje napięcie 1.9V, czyli niejako dalej "1". Jest to port analogowy atmegi, może ma to jakiś wpływ, trzeba coś ustawić o czym nie doczytałem. Dodam, że napięcie zasilania jest stabilne i wynosi 4.5V. Z góry dziękuję za pomoc.

    Sprawdziłem sytuację na porcie B i wyglada to niemalże identycznie(4.5V i 2.3V). Dodam jeszcze kod konfigurujący porty:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9568329
    hexen2k
    Poziom 16  
    trochę poprawiony kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z tego kodu wynika że PORTB ustawiasz jako wejścia, potem ustawiasz pin B0 jako wyjście, następnie ustawiasz wejścia PORTB bez pullup'a - na B0 jedynie jest wyjście i na nim jest stan niski ustawiany, na końcu na B1 robisz pullup'a...

    Na którym pinie chcesz coś zrobić i co dokładnie chcesz uzyskać ? wejście/wyjście stan niski/wysoki ?
  • #3 9568340
    tmazur
    Poziom 10  
    Przepraszam za przemienne używanie portów A i B, ale chciałem sprawdzić zachowanie na innym porcie. Więc tak B0 powinno być wyjście, B1 wejście. Wejście działa bez problemu, problem jest jedynie z wejściem. Stan wyjścia B0 zależy od stanu licznika zwiększanego przez przycisk podłączony do pinu B1. Obsługa licznika i jego stanu jest prawidłowa(mam podgląd na LCD). Jedyny problem jest z tym stanem niskim na pinie B0.
  • #5 9568360
    tmazur
    Poziom 10  
    Tak.
  • REKLAMA
  • #7 9568366
    tmazur
    Poziom 10  
    To jest chyba nieistotne jako że sytuacja występuje na portach A i B. Czy stan niski ustawiam w odpowiedni sposób(za pomocą tego XORa)?
  • #8 9568368
    dondu
    Moderator na urlopie...
    tmazur napisał:
    To jest chyba nieistotne jako że sytuacja występuje na portach A i B.

    Może nie, ale skoro szukasz błędu, to warto to sprawdzić, bo to ten sam pin.

    tmazur napisał:
    Czy stan niski ustawiam w odpowiedni sposób(za pomocą tego XORa)?

    Jeżeli wcześniej była tam 1 to XOR jest prawidłowy dla pin0

    Masz schemat swojego projektu?
  • #9 9568375
    tmazur
    Poziom 10  
    Heh chyba sobie rozwiązałem problem. Gdy ustawie stan zerowy w sposób następujący:

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


    To wszystko działa. Co jest złego w zapisie podanym wyżej? Jak się to powinno robić? Wiem, że powyższy zapis jest niemile widziany, ale przynajmniej pewny. ;)
  • #11 9568389
    tmazur
    Poziom 10  
    Na razie najważniejsze jest to że układ działa :D Sytuacja taka sama na portach A i B. Zapis z użyciem XOR musi być w jakiś sposób błędny.
  • REKLAMA
  • #13 9568395
    tmazur
    Poziom 10  
    Nie mam schematu, a jakie optymalizacje mam to nie wiem. Jutro postaram się dojść do źródła problemu. Dodam tylko, że miałem problem z funkcją "abs" operującą na zmiennej double. Użyłem if'a i więcej się nad tym nie zastanawiałem, ale może coś jest na rzeczy ;)
  • REKLAMA
  • #14 9568396
    dondu
    Moderator na urlopie...
    To nie idź dalej dopóki nie wyjaśnisz dlaczego tak podstawowy kod nie działa Ci prawidłowo. Optymalizacja powinna być ustawiona na -0s.
    I schemat także zrób bo coś w kościach mi mówi, że coś masz nie tak.
  • #15 9568413
    tmazur
    Poziom 10  
    Układ nie układ, napięcie sprawdzałem bezpośrednio na pinie ;)
  • #16 9568414
    dondu
    Moderator na urlopie...
    Nie znam Ciebie, więc wybacz, że nadal będę się upierał w sprawie schematu, ponieważ niejednokrotnie mieliśmy tutaj przypadki, gdzie okazywało się, iż w tym tkwi problem. nie twierdzę, że tak jest w Twoim przypadku.
    Oczywiście zrobisz jak zechcesz. Pozdrawiam i życzę spokojnej nocy.
  • Pomocny post
    #17 9568621
    Fredy
    Poziom 27  
    Jeśli ten pin ustawiony masz jako wyjście - czyli dodałeś wcześniej DDRA|=(1<<0);
    to stawiam na to że masz pętlę w której robisz notorycznie PORTA^=(1<<0); i dlatego masz tam naprawdę przebieg prostokątny.
    Zatrzymaj program po tym XOR (daj tam dużego Delaya) i dopiero potem sprawdź napięcie.
  • #18 9568635
    szelus
    Poziom 34  
    Chciałbym zwrócić uwagę, że autor pokazał tylko maleńki fragmencik programu (nawet nie tyle ;)). Więc trudno wróżyć....
    Ale obstawiałbym, że ustawianie/kasowanie stanu portu odbywa się w pętli, tzn. wielokrotnie. O ile wielokrotny OR oczywiście nie szkodzi, to wielokrotny XOR da w efekcie falę prostokątną (na przemian 0 i 1) - obserwowane zwykłym miernikiem da średnią wartość napięcia.
    Do kasowania zdecydowanie lepiej używać kombinacji z AND.
    tmazur napisał:
    Wiem, że powyższy zapis jest niemile widziany, ale przynajmniej pewny.

    Nie wiem, gdzie to wyczytałeś, ale ktoś Cię w błąd wprowadził.
    ----
    p.s Ups, Fredy był szybszy ;)
  • #19 9569010
    tmazur
    Poziom 10  
    Dokładnie o to chodziło. Na rozwiązanie problemu wpadłem idąc spać. Dziękuję wszystkim za pomoc.
REKLAMA