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

Atmega8 - Jak ustawić niski stan na wyjściach portu C (0..3)?

karol17 13 Sty 2013 18:44 3075 15
  • #1 11784114
    karol17
    Poziom 15  
    Witam, robię urządzenie, oparte na Atmega8 które ma po zwarciu switcha wyświetlić jego wartość (0..9) na wyświetlaczu 7 segmentowym, który będzie sterowany dekoderem kodu ABCD na 7 segm. .Całość wygląda tak:
    Atmega8 - Jak ustawić niski stan na wyjściach portu C (0..3)? Atmega8 - Jak ustawić niski stan na wyjściach portu C (0..3)?
    Jeżeli chodzi o switche to proszę się nie sugerować schematem , bo zostały już poprawione (pierwotnie zwierały wejścia do masy , mimo że nie były załączone)
    Problem polega na tym ,że na wyjściach procesora (portC 0..3) wciąż jest stan wysoki , próbowałem program przerabiać (było kilka wersji) zrobiłem też program, który tylko ustawi stany niskie na wyjściach, a te i tak są wysokie (resetowałem Atmege).Po wciśnięciu switcha pojawiają się niskie stany na wszystkich wyjściach , obojętnie który przycisk wcisnę, gdy puszczę wraca stan wysoki .Wszystko idzie cacy ,kompiluje, buduje, wgrywa, odczytuje z procesora.
    Fuse bity:
    Atmega8 - Jak ustawić niski stan na wyjściach portu C (0..3)?

    Z góry dziękuję za odp. :D
  • #2 11784277
    Mari@@@n
    Poziom 19  
    Kolego robisz błąd w instrukcjach warunkowych if sprawdzasz tam stan PIND w twoim przypadku powinno być PORTD.
  • #3 11784302
    karol17
    Poziom 15  
    Cytat z Forbotu:
    "Jeśli linię we/wy skonfigurowano jako wejście, poziom napięcia na wyprowadzeniu, niski czy wysoki, sprawdza się odczytując wartość odpowiadającego tej linii bitu w rejestrze PINx (Port Input Pins Address), oczywiście wartość 0 oznacza stan niski, 1 stan wysoki. Dodatkowo, gdy linia jest wejściem i odpowiadający tej linii bit w rejestrze PORTx ma wartość 1, wtedy wyprowadzenie jest wewnętrznie podciągnięta do napięcia zasilania." Czyli w końcu jednak odczytywanie to PORTx

    Nie , na Forbocie w kursie wciąż używany jest PINx do odczytu.
    Zmiana na PORT u mnie nic nie dała.
  • #4 11784484
    Mari@@@n
    Poziom 19  
    Stan portu można sprawdzać na kilka sposobów. Pod tym linkiem jest temat o sprawdzaniu stanów poszczególnych pinów https://www.elektroda.pl/rtvforum/topic722165.html osobiście sam często używam makra

    if(bit_is_set(PINB, PB3))

    i analogicznie

    if(bit_is_clear(PINB, PB3)).

    Pozdrawiam
  • #5 11784566
    karol17
    Poziom 15  
    Ale czemu są stany wysokie? Przecież nic nie jest naciśnięte.
    Sam kolega odczytuje używając PINx
    U mnie z użyciem makra wyglądało by to tak?
    if(bit_is_clear(PIND,PD0)); dla cyfry 0
  • #6 11785144
    dondu
    Moderator na urlopie...
    Do odczytu stanu przycisku podłączonego do pinu, używa się PINx.

    np.

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

    a dlaczego tak? Dlatego, że:

    karol17 napisał:
    Ale czemu są stany wysokie? Przecież nic nie jest naciśnięte.

    Ponieważ włączone są wewnętrzne rezystory pull-up, podciągające pin do Vcc.
    Naciśnięcie przycisku powoduje zwarcie do masy, czyli zero na pinie.

    Innymi słowy przycisk naciśnięty to 0, przycisk puszczony to 1.

    Reszty dowiesz się tutaj: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
  • #7 11785545
    karol17
    Poziom 15  
    Wiem, że są podciągnięte do zasilania.
    Ale czy warunek w if (PIND == 0xFE) nie da nam wartości "prawda" gdy wcisnę guzik pierwszy , czy PIND nie będzie równy 11111110 ? Będzie.
    Nadal nie wiem co jest przyczyną.
  • #8 11785573
    dondu
    Moderator na urlopie...
    karol17 napisał:
    Wiem, że są podciągnięte do zasilania.
    Ale czy warunek w if (PIND == 0xFE) nie da nam wartości "prawda" gdy wcisnę guzik pierwszy , czy PIND nie będzie równy 11111110 ? Będzie.
    Nadal nie wiem co jest przyczyną.

    Jeżeli będzie wciśnięty tylko i wyłącznie przycisk S1 to da Ci wartość TRUE, czyli warunek spełniony.
    Ale jeżeli będzie naciśnięty jeszcze inny przycisk, to warunek nie będzie spełniony.
    Dlatego warto sprawdzać bit a nie cały port, choć oczywiście mogą być wyjątki od tej zasady.

    Pokaż cały aktualny program i opisz jego zachowanie.
    No i może dodatkowo zdjęcia jak to masz zmontowane.

    Jak sprawdzasz stan wysoki na wyjściach portu PC?

    EDIT:
    Poza tym nie zwracasz uwagi warnning'i, a to 10 stopień piekiełka.
  • #9 11786740
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeśli ten schemat w EAGLE jest prawdziwy, to przyciski nie są połączone z masą. To wyjaśnia, dlaczego wejścia są zawsze w stanie wysokim.
  • #11 11787313
    Freddy
    Poziom 43  
    Jak nie ma masy, popatrz dobrze. Przynajmniej jeden switch jest do masy podpięty (PB1) i procesor też.
  • #12 11789380
    karol17
    Poziom 15  
    Panowie żaden switch nie zwiera do masy. Na razie wkradł się tak głupi błąd ,że się nie przyznam :D Jutro zaprogramuje ponownie i zobaczymy co będzie.
  • #13 11789414
    Freddy
    Poziom 43  
    karol17 napisał:
    Panowie żaden switch nie zwiera do masy. Na razie wkradł się tak głupi błąd ,że się nie przyznam :D Jutro zaprogramuje ponownie i zobaczymy co będzie.

    Przepraszam bardzo ... aaa do czego, bo schematy jeszcze umie chyba czytać :?:
    Popraw schemat w takim razie, albo wywal wszystko do kosza.
  • #14 11790802
    Konto nie istnieje
    Poziom 1  
  • #15 11790841
    Freddy
    Poziom 43  
    Ależ jest, jest.
    Nie ma kropki, nie ma połączenia, a do masy zwiera tylko jeden switch.
    Atmega8 - Jak ustawić niski stan na wyjściach portu C (0..3)?
  • #16 11793549
    karol17
    Poziom 15  
    Głupi błąd był taki ,że Atmega była odwrotnie w podstawce :D
    Gdy odcinałem ścieżki od switchów do masy (trzeba było) to odciąłem też masę Atmegi, mimo tego program wgrywał się ładnie, szło nawet ściągnąć go z Atmegi.
    Switche już dawno zostały obrócone , co napisałem w pierwszym poście i nie zwierały nic do masy.Więc przepraszam za mój głupi błąd który jednak nie był bezpośrednią przyczyną problemu , teraz wszystko działa pięknie.Dziękuje za zainteresowanie , ale nie żebym miał jakieś pretensje ale np.
    Wartość odczytuje się poprzez PINx a nie PORTx
    "Jeżeli chodzi o switche to proszę się nie sugerować schematem , bo zostały już poprawione (pierwotnie zwierały wejścia do masy , mimo że nie były załączone)"
    To tyle jeśli chodzi o switche.
    To ,że nie ma kropki w Eagle na schemacie nie oznacza braku połączenia, proszę sobie element podłączony bez kropek spróbować przenieść to ścieżki lezą za nim, klikając Show też to widać.
    Dziękuje bardzo temat do zamknięcia.
REKLAMA