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 - Sterowanie 8 Led, 2 switche. Nie działa.

TDA2593 25 Paź 2015 18:17 1158 8
  • #1 25 Paź 2015 18:17
    TDA2593
    Poziom 9  

    Witam.
    To moje 1_sze próby z językiem C.
    Procesor po załadowaniu poniższego programu na Porcie D ma stan niski (świecą diody LED/ zestaw ZL...AVR), oraz brak jest reakcji na zwarcie do masy pinów z Portu C. Wyciąłem połowę programu/ ta postać ułatwia "analizę"... i dalej mam to samo... Wersja 1/2 poniżej.

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Ponadto mam jeszcze pytania:
    * co oznacza i jak działa wyrażenie if(!PORTD) ? (jeżeli stan niski na PORTD???)
    * co oznacza i jak działa wyrażenie PORTD >>= 1; ?

    Pozdrawiam.

    0 8
  • Pomocny post
    #2 25 Paź 2015 18:27
    Wojciech.
    Poziom 31  

    TDA2593 napisał:
    Witam.
    To moje 1_sze próby z językiem C.
    Procesor po załadowaniu poniższego programu na Porcie D ma stan niski (świecą diody LED/ zestaw ZL...AVR), oraz brak jest reakcji na zwarcie do masy pinów z Portu C. Wyciąłem połowę programu/ ta postać ułatwia "analizę"... i dalej mam to samo... Wersja 1/2 poniżej.


    Atmega 8 - Sterowanie 8 Led, 2 switche. Nie działa.

    Ponadto mam jeszcze pytania:
    * co oznacza i jak działa wyrażenie if(!PORTD) ? (jeżeli stan niski na PORTD???)
    * co oznacza i jak działa wyrażenie PORTD >>= 1; ?

    Pozdrawiam.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    -1
  • Pomocny post
    #3 25 Paź 2015 20:02
    BlueDraco
    Specjalista - Mikrokontrolery

    TDA2593:
    Odpowiedź na nurtujące Cię pytania znajdziesz w każdym podręczniku do języka C.
    if (!PORTD)
    to po prostu krótsza forma zapisu
    if (PORTD == 0)

    Wojciech:
    PORTD =(0<<PDx)

    To dokładnie to samo, co

    PORTD = 0 << 1000;

    i to samo co

    PORTD = 0;

    0
  • #4 25 Paź 2015 21:49
    TDA2593
    Poziom 9  

    Dzięki za Pomoc.

    Niestety zmiany te nie wpłynęły w żaden sposób na działanie programu. Dalej na całym PORTD jest stan niski i brak reakcji na poziom niski na pinach PORTU C.

    Mam oczywiście książkę odnośnie języka C, tylko niestety w moim wieku po ponad 20 letnim doświadczeniu w serwisie TV CRT, przeczytaniu mnóstwa opracowań, książek odnośnie teorii tv "kineskopowej", techniki VCR, DVD, gdy teraz te kiedyś drogocenne rzeczy stały się MAKULATURĄ :cry: , więc na razie nie sięgam do książek i korzystam z kursów internetowych... ech taka mała refleksja...

    Pozdrawiam.

    0
  • Pomocny post
    #5 25 Paź 2015 22:40
    szczywronek
    Poziom 27  

    Podstawą pomocy jest komplet informacji od pytającego. W szczególności:
    - schemat lub opis połączeń - ok podałeś oznaczenie płytki... ale przypuszczam, że mało komu będzie się chciało szukać schematu
    - opis "co program powinien robić" oraz "co program robi w rzeczywistości" - to co obserwujesz, wynika dokładnie z Twojego programu... nie wiadomo natomiast co chciałeś otrzymać toteż trudno wskazać gdzie popełniłeś błąd

    Poza tym musisz być dokładny: w pierwszy poście piszesz o stanie niskim na porcie D, w ostatnim poście już o porcie B.
    Uzupełnij brakujące informacje i zamieść listing z wprowadzonymi zmianami ;)

    0
  • Pomocny post
    #6 26 Paź 2015 12:40
    el2010tmp
    Poziom 25  

    Brakuje klamer, być może miało być tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ten zapis: PORTD >>= 1; przesuwa zawartość portu D o jeden bit w prawo jednak port nie jest nigdzie ustawiany.

    Spróbuj tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Zwiększyłem opóźnienia aby ułatwić analizę.

    0
  • #7 06 Gru 2015 10:37
    TDA2593
    Poziom 9  

    Dziękuje za Odpowiedzi i Pomoc.

    Zrobiłem postępy w [C], ale niestety nie potrafię rozwiązac dalej tego problemu... Definicje są jasne, ale problem z zastosowaniem w praktyce...

    Program powinien:
    * za pomocą PC1 zmieniać po kolei stan pin_ów z 1 na 0 (załączać LED) od PD0...PD7
    * za pomocą PC0 zmieniać po kolei stan pin_ów z 0 na 1 (wygaszać LED) od PD7...PD0
    * Pomijam/ wykluczam funkcję PB1
    Schematu nie będę przedstawiał ponieważ problem jest po stronie softu.

    Dzięki modyfikacji Kolegi el2010tmp (po dopisaniu: PORTD=0b11000000;// po wyzerowaniu portu wypada go ponownie ustawić ). W układzie po właczeniu na Porcie PD pojawia się stan 0 i przy pomocy PC0 można wymuszać 1 (wygaszać LED) kolejno na dwóch pinach:
    a. 00000000 (po właczeniu zasilania)
    b. 00000011
    c. 00000110
    d. 00001100
    e. 00011000....

    Pin PC1 "nie działa"...

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Pozdrawiam.

    0
  • Pomocny post
    #8 06 Gru 2015 12:15
    dondu
    Moderator Mikrokontrolery Projektowanie

    TDA2593 napisał:
    Pin PC1 "nie działa"...

    Bo w programie nie obsługujesz tego przycisku w żaden sposób.

    Nie stosuj takiego apisu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    stosując jednocześnie takie:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    bo prosisz się o kłopoty. Stosuj tylko i wyłącznie ten drugi sposób - kod ma być czytelny zawsze i wszędzie.

    Przy okazji: Nie definiuj F_CPU w kodzie programu z tych powodów: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    0
  • Pomocny post
    #9 08 Gru 2015 22:51
    2675900
    Użytkownik usunął konto  
  Szukaj w 5mln produktów