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

Atmega 8 - Dwanaście mignięć diody - kod nie działa, prośba o sprawdzenie błędów

sp5gbw 23 Sie 2015 09:32 2007 29
  • #1 14940712
    sp5gbw
    Poziom 17  
    Dioda po włączeniu zasilania miała mignąć 12 razy i zgasnąć. Może ktoś znajdzie mi błąd. Bardzo proszę o pomoc.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 14940729
    Tomasz Gutewicz
    Poziom 12  
    Pokaż schemat lub chociaż opisz gdzie i jak podłączona dioda.
  • #4 14940796
    piotrva
    VIP Zasłużony dla elektroda
    Dalej F_CPU deklaruj w opcjach projektu.
    Na podstawie innego tematu - przesiądź się na Atmel Studio zamiast Win AVR, bo ono jest przestarzałe.
  • #5 14941135
    sp5gbw
    Poziom 17  
    Tak pomyłki z unsigned i; poprawiłem ale i tak układ nie działa. A dioda włączona jest do PB0 PB1. Podczas kompilacji wypisuje mi mnóstwo errorów z których nic nie rozumiem (moja znajomość angielskiego średnia).
  • #7 14941244
    sp5gbw
    Poziom 17  
    Rezystor nie jest konieczny. Ta dioda z innym programem działa poprawnie.
  • #9 14941299
    szczywronek
    Poziom 28  
    sp5gbw napisał:
    Rezystor nie jest konieczny.
    Jest.
    sp5gbw napisał:
    Ta dioda z innym programem działa poprawnie.
    No to używaj tamtego programu.
    Cytat:
    A dioda włączona jest do PB0 PB1.
    Dioda nie jest elementem symetrycznym. Gdzie jest podłączona katoda a gdzie anoda?

    Bez schematu i logu z kompilacji ten wątek będzie się naprawdę ciągnął długo i nieszczęśliwie ;)
  • #10 14941615
    Bartosz36
    Poziom 12  
    Bez znaczenia gdzie katoda, gdzie anoda. Jako WYJŚCIA ustawione są zarówno piny PB0 jak i PB1, ponieważ: DDRB = 0x03.
    (Chyba, że są dwie diody ale nie zostało to konkretnie dopowiedziane :P )
    Podepnij diodę dłuższą nóżką do pinu PB0 (bo ten właśnie pin ustawiasz na stan wysoki) a krótką nóżkę połącz z pinem GND procesora, zastosuj też choćby malutki rezystor przy diodzie, jak wspomnieli koledzy powyżej.
    Zastosuj to co powyżej i powiedz jaki będzie rezultat.

    Powodzenia ;)
  • #11 14941643
    szczywronek
    Poziom 28  
    Bartosz36 napisał:
    Bez znaczenia gdzie katoda, gdzie anoda. Jako WYJŚCIA ustawione są zarówno piny PB0 jak i PB1, ponieważ: DDRB = 0x03.
    Mhm jasne. To podłącz anodę do PB1 i spróbuj zaświecić diodę programem pokazanym przez Autora wątku ;] Zmiany hardware'owe raczej nie pomogą na (tajemnicze) błędy kompilacji, o których wspomina Autor ;)
  • #12 14941680
    Bartosz36
    Poziom 12  
    szczywronek napisał:
    To podłącz anodę do PB1 i spróbuj zaświecić diodę programem pokazanym przez Autora wątku ;]
    Autor tematu w swoim programie ustawił zarówno PB0 jak i PB1 jako wyjścia, więc podłączanie anody do PB1 jest bez sensu. Ponieważ w pętli operuje jedynie na stanie pinu PB0 to zaproponowałem mu rozwiązanie sprzętowe uwzględniające pętlę for().
    W przypadku rozwiązania software'owego autor musiałby zmienić jedynie linijkę DDRB = 0x03 na DDRB = 0x01 i to mogłoby rozwiązać problem.
    Mój błąd to polecenie autorowi rozwiązania wymagającego dłuższego wytłumaczenia, jednak oba sposoby zaprowadzą do rozwiązania problemu :)

    Pozdrawiam
  • #13 14941717
    szczywronek
    Poziom 28  
    Bartosz36 napisał:
    podłączanie anody do PB1 jest bez sensu.
    Dlatego właśnie pytałem o szczegóły podłączenia :)
    Bartosz36 napisał:
    Mój błąd
    Od razu błąd :D gdyby to ode mnie zależało też bym podłączył diodę od pinu do gnd lub vcc :roll:
  • #14 14941748
    piotrva
    VIP Zasłużony dla elektroda
    @Bartosz36 To gdzie jest anoda a gdzie katoda ma znaczenie i to duże :D
    Po drugie zmiana w rejestrze DDRB sugerowana przez Ciebie bez zmiany hardware spowoduje to, że dioda w ogóle nie zaświeci po pin PB2 będzie wejściem :D
  • #15 14941779
    Bartosz36
    Poziom 12  
    piotrva napisał:
    pin PB2 będzie wejściem
    Kto tu mówi o PB2? Autor wykorzystuje piny PB0 i PB1, pod te piny także podłączył diodę (w taki, bądź inny sposób...) i na tym bazuje moja odpowiedź. Ale
    piotrva napisał:
    To gdzie jest anoda a gdzie katoda ma znaczenie i to duże
    Z tym się zgadzam w pełni :). W pierwszej mojej odpowiedzi (gdy mówię o znaczeniu podłączenia katody i anody) chodziło mi o konkretny przypadek, w którym autor tematu ustawił nóżki procesora jako wyjścia, pod które owa dioda była podpięta. Dla ustawienia zastosowanego początkowo przez autora podłączenie nóżek diody jest bez znaczenia, bo ich zmiana nic nie zmieni w działaniu diody.
  • #16 14941799
    piotrva
    VIP Zasłużony dla elektroda
    Chodziło mi o PB1 - jeśli w takiej konfiguracji LED podpięty jest między PB0 i PB1 to wtedy w ogóle nie zaświeci lub zaświeci ledwo, ledwo (przez wewnętrzny pull-up atmegi)

    Bartosz36 napisał:
    W przypadku rozwiązania software'owego autor musiałby zmienić jedynie linijkę DDRB = 0x03 na DDRB = 0x01 i to mogłoby rozwiązać problem.
  • #17 14941814
    Bartosz36
    Poziom 12  
    Faktycznie zapomniałem o wewnętrznym pull-up. W takim przypadku pierwsze rozwiązanie zaproponowane przeze mnie (sprzętowe z podpięciem katody do GND) może być rozwiązaniem problemu.
  • #18 14941847
    szczywronek
    Poziom 28  
    Eeee anoda do GND to raczej średni pomysł :D Tak czy siak chciałem przypomnieć, że Autor wspominał o errorach przy kompilacji programu.
    Do problemów sprzętowych jeszcze dojdziemy... najpierw niech program się skompiluje u Autora wątku ;)
  • #19 14941854
    Bartosz36
    Poziom 12  
    szczywronek napisał:
    anoda do GND
    Poprawiłem, dzięki :(
  • #21 14943505
    sp5gbw
    Poziom 17  
    Niestety wiem o tym doskonale i staram się ją uzupełnić. A z listingiem było tak: ściągnięty programik z książki działa bez zarzutu z pętlą nieskończoną . Uzupełniłem ją ustaleniem zmiennej i i zamiast dwóch średników w nawiasach pętli nieskończonej umieściłem skończoną. W efekcie kompilacja nie następuje - dlaczego??

    Dzięki za zwrócenie mi uwagi o braku wyszczególnienia błędów kompilacji.Chcąc naprawić błąd,jeszcze raz przeanalizowałem wszystkie uwagi kolegów i po wielu próbach SUKCES!!!Mój program ruszył i działa zgodnie z oczekiwaniem. Może komuś się przyda.
    Program, który po włączeniu zasilania do mikroprocesora Atmega8, generuje potrzebną ilość impulsów z częstotliwością 5kHz (co do 5kHz to nie jestem pewien, trudno to zmierzyć).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #22 14943820
    Bartosz36
    Poziom 12  
    W mikrokontrolerze nie istnieje coś takiego jak koniec programu, stąd return 0; jest zbędnym elementem listingu. Normalnie kompilatory potrafią sobie z tym poradzić (jeśli dobrze pamiętam zastępując return 0 pętlą nieskończoną) ale najwidoczniej Twój kompilator nie działa w taki sposób i nie podoba mu się zakończenie programu. Nie napisałeś nawet z jakiego kompilatora, środowiska korzystasz, więc ciężko Ci pomóc... :(

    Dodano po 7 [minuty]:

    Dodam jeszcze, że odpaliłem podany przez Ciebie kod w swoim Atmel Studio 6.2 i po poprawieniu dwóch znanych już syntax'ów program działa prawidłowo.
    Spróbuj pętlę for() umieścić w nieskończonej pętli while(true), usunąć koniecznie return 0 i wtedy zobaczymy... o tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i na tym zakończ program.

    Aha... przy takiej zmianie dioda będzie migać w nieskończoność. Dla efektu jaki chcesz uzyskać, mógłbyś zrobić to tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #23 14944252
    sp5gbw
    Poziom 17  
    Dzięki koledze "bartosz" za zainteresowanie się moim problemem. Uwagi pomogły mi w korekcie mojego listingu. Już wszystko działa. Ale to dopiero jedna część mojego urządzenia. Zapraszam do dyskusji na nowy mój temat wkrótce. Zamieszczam mój działający listing:

    Dodano po 2 [minuty]:

    Dzięki koledze "bartosz" za zainteresowanie się moim problemem. Uwagi pomogły mi w korekcie mojego listingu. Już wszystko działa. Ale to dopiero jedna część mojego urządzenia. Zapraszam do dyskusji na nowy mój temat wkrótce. Zamieszczam mój działający listing:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #25 14944342
    Piotrek1970
    Poziom 18  
    Kolego sp5gbw będzie Ci znacznie prościej jaz zastosujesz się do jednej z konwencji pisania kodu, a mianowicie ustawiaj /kasuj bity za pomocą makra _BV(PB0) lub bezpośredniego używając przesunięcia bitu (1<<PB0), tak dla przykładu. Jeszcze lepiej jest zadeklarować stałą symboliczną np.: #define LED PB0 i w programie już można pisać DDRB = _BV(LED) lub DDRB = (1<<LED) a podczas kompilacji preprocesor poskłada to jak trzeba. Dzięki takim zabiegom będziesz miał łatwiej operować wyjściami/wejściami uCP, a przy ewentualnej zmianie hw poprawiasz tylko jeden wiersz [#define LED PBx].
    Jeżeli coś pokręciłem to przepraszam ;-) dawno nie pisałem żadnego kodu, więc jakiś błąd mógł się wkraść i jak już wspominałem p*pa ze mnie nie programista.

    Pozdrawiam, Piotrek

    p.s.: sprawdź jak działają zapisy
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    oraz
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #26 14944351
    piotrva
    VIP Zasłużony dla elektroda
    Cenna uwaga, z tym, że lepiej stosować przesunięcia bitowe, czyli (1<<DIODKA).
  • #27 14944403
    szczywronek
    Poziom 28  
    sp5gbw napisał:
    Zamieszczam mój działający listing
    Chciałbym zwrócić uwagę, że zamieszczony listing nie da się skompilować :) Zmienna "i" jest zdefiniowana przed klamerką otwierającą funkcję main.

    Bartosz36 napisał:
    Normalnie kompilatory potrafią sobie z tym poradzić (jeśli dobrze pamiętam zastępując return 0 pętlą nieskończoną)
    Zakończenie programu to akurat nie zmartwienie kompilatora. Po resecie procesor wykonuje kod "rozbiegowy" (inicjalizacja zmiennych, ustawienie stosu i takie tam pierdoły). Rozbiegówka wywołuje funkcję main jak każdą inną i to od niej (rozbiegówki) zależy, co się będzie działo po powrocie z main. Atmelowy toolchain, przykładowo, wyłącza przerwania i wpada w pętlę nieskończoną:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • #28 14944457
    Piotrek1970
    Poziom 18  
    Kolego szczywronek błąd ten został już poprawiony przez autora kilka wiadomości powyżej ;-) i całość kompiluje się n.p.: w Avr Studio 6.2, jeszcze jak autor zastosuje się do innych uwag to kod będzie bardziej czytelny i to nie tylko dla niego.
  • #30 14980346
    sp5gbw
    Poziom 17  
    problem rozwiązany. kod źródłowy napisany wg. sugestii kolegów kompiluje się poprawnie.
    Dziękuję.
REKLAMA