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

ATMEGA32A-PU - Zaprogramowanie anod na dwa rozne wyjscia

TheGrudgee 25 Sty 2014 01:16 2601 11
  • #1 13216859
    TheGrudgee
    Poziom 9  
    Witam, próbuje zrobić globus 3d LED. Oczywiście poniższy przykład jest tylko do testów i ma pomóc w uzyskaniu efektu, który później zostanie wykorzystany na szerszą skalę.
    Obecnie jestem na etapie programowania. Do programatora ATMEGA32A-PU. Poniżej wrzucam kod programu:

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

    ATMEGA32A-PU - Zaprogramowanie anod na dwa rozne wyjscia


    Tak jak widać na Rysunku, użyłem 9 diod, 6 diod połączonych jest w jedną anodę idącą do portu A0, anoda od kolejnych 3 idzie do portu A1, zaś każda z katod ma osobny pin przypisany do siebie. Używając powyższego programu powinna się świecić 1 i 2 dioda z portu C oraz 1 3 i 5 dioda z portu B natomiast świecą się tylko 1 3 i 5 dioda z portu B, nie świecą się diody z portu C, próbowałem różne konfiguracje przy połączeniu w ten sposób kilku anod na kilka pinów danego portu jak w tym przypadku 2 wyświetla, tylko ostatnią zaprogramowaną linię. W momencie gdy połączyłem anody w jedną wszystko działa poprawnie(i zmieniłem w kodzie na to, że obie linijki PORTA = 1). Tutaj rodzi się moje pytanie czy istnieje jakaś dodatkowa funkcja, która umożliwi mi wyświetlanie wszystkich linii przy użyciu kilku anod na kilka pinów jednego portu. Bądź też ja robie błąd w kodzie, że nie wyświetla jak powinno, proszę o pomoc męczę się z tym już dłuższy czas. Przepraszam za zawiłość mojej wypowiedzi, jednak jestem laikiem w tej dziedzinie i ciężko mi o tym pisać.

    Doprowadziłem post do porządku.
    [zumek]
  • #2 13216889
    laki_17
    Poziom 17  
    Witam.
    W pierwszej kolejności popraw posta i wklej kod za pomocą znaczników SYNTAX.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Myślę, że wszystko jasne według opisu. Dodatkowo taka uwaga pamiętaj o obciążalności pojedynczego pinu lub całego portu.

    Poczytaj m.in o operatorze OR "|" .
  • #3 13216955
    dondu
    Moderator na urlopie...
    Witaj.

    1. laki_17 już wspomniał, a ja tylko wskażę źródła wiedzy
    - maksymalne prądy pinów, portów i uC: http://mikrokontrolery.blogspot.com/2011/03/datasheet-mikrokontroler-prady-pinow.html
    - diody wymagają rezystorów: http://mikrokontrolery.blogspot.com/2011/03/Dioda-LED-elektroluminescencyjna.html
    stąd mogłeś już uszkodzić mikrokontroler.

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

    3. Korzystaj z Eagle lub innego programu: http://mikrokontrolery.blogspot.com/2011/04/kicad-projektowanie-schematow-i-pytek.html

    4. JTAG Wyłączyłeś? http://mikrokontrolery.blogspot.com/2011/04/Pulapki-AVR-JTAG-blokuje-piny-portu.html

    5. Albo się mylisz pisząc o numerach diod albo sam się wprowadzasz w błąd numerując diody od jedynki. Przyjmij więc numerację zgodną z numeracją pinów, czyli od zera byśmy wiedzieli dokładnie, o których diodach mówisz, a najlepiej nazywaj je nazwami pinów, do których są podłączone.

    TheGrudgee napisał:
    Używając powyższego programu powinna się świecić ... 1 3 i 5 dioda z portu B

    nie ponieważ 0xea (które wpisujesz do PORTB), to binarnie 0b11101010 a przy takim schemacie jak pokazałeś oznacza możliwość świecenia diod na PB0, PB2 i PB4 pod warunkiem ustawienie jedynki na PA0.

    6. Rozwijając punkt 5 stosuj zdefiniowane nazwy pinów i przesunięcia bitowe:

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


    7. Mylisz pary:

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

    i podobnie z drugą parą. Nie wpłynie to na miganie diod, ale to jednak nielogiczne.

    8. I najważniejsze - zakomentowałeś opóźnienia w funkcji zapal_diody(). Konsekwencją tego jest że nie zauważasz wykonania jej początkowej części stąd Twoja funkcja sprowadza się właściwie do:

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

    czyli włączenie anod podpiętych pod pin PA1 i piny PB0, PB2 i PB4.

    Następnie odczekanie w pętli głównej jednej sekundy, po czym wykonaniu praktycznie tego samego stąd, żadnych zmian nie widzisz. Na odpowiednio dobrym oscyloskopie zobaczyłbyś jednak, że diody które miały się świecić, a się nie świecą są włączane na ułamek sekundy.

    Stąd wnioskuję, że na rysunku pomyliłeś się i pod pin PA1 są podłączone diody portu B a nie C. Ewentualnie nie pomyliłeś podłączenia PA1, ale za to diody masz LEDy odwrotnie wpięte (anoda - katoda) i wtedy nie mylisz się w numeracji, o której pisałem w punkcie 5.

    Gdybyś opóźnień nie zakomentował zaobserwowałbyś miganie diod pod warunkiem pkt. 4.


    9. No i jeszcze jedna sprawa - czy na pewno masz prawidłowo podłączony mikrokontroler?:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html


    Podsumowanie
    Dokładnie przeglądnij swój kod pod kątem logicznym i w stosunku do schematu i stosuj definicje to mniej pomyłek będziesz robił.
    ... i poćwicz C w CManiaku: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
  • #4 13225779
    pimpuk
    Poziom 23  
    dondu napisał:
    I najważniejsze - zakomentowałeś opóźnienia w funkcji zapal_diody()
    Ale tam mamy 100 mikro sekund, to nawet odkomentowanie nic nie da. Trzeba by _delay_us zamienić na _delay_ms.
  • #6 13280138
    TheGrudgee
    Poziom 9  
    Dziękuje za odpowiedzi i wskazówki i przepraszam, że tak późno odpisuje, już coś zaczęło działać uwiesiłem się tego następnie przestało znowu zaczęło i tak minęły 2 tygodnie tym bardziej, że nie mogłem codziennie z tym siedzieć. Wracając do tematu chciałbym przedstawić go jeszcze raz (postaram się dokładniej z uwględnieniem eagle) z odpowiedziami na wasze wskazówki i moimi drobnymi przemyśleniami.

    1. Przyporządkowanie diod do portów

    Zrobiłem inne połączenie niż wcześniej obecnie jest to skonstruowane w taki sposób, że mam wykorzystane wszystkie piny mikrokontrolera.

    Oczywiście cały czas korzystam z mikrokontrolera ATMega32A-PU. Dodaje link do wyprowadzeń ATMega16/32

    [url=]http://atmega.info/artykuly/podstawy/3-opis-wyprowadzen-atmega16-atmega32[/url]

    Katody (Poniższe diody od LED1 do LED16 są przyłączone anodami i połączone z pinem PA0)

    LED1 = PB0
    LED2 = PB1
    LED3 = PB2
    LED4 = PB3
    LED5 = PB4
    LED6 = PB5
    LED7 = PB6
    LED8 = PB7

    LED9 = PD0
    LED10 = PD1
    LED11 = PD2
    LED12 = PD3
    LED13 = PD4
    LED14 = PD5
    LED15 = PD6
    LED16 = PD7

    Katody (poniższe diody od LED17 do LED30 połączone są anodami i połączone z pinem PA1)

    LED17 = PC0
    LED18 = PC1
    LED19 = PC2
    LED20 = PC3
    LED21 = PC4
    LED22 = PC5
    LED23 = PC6
    LED24 = PC7

    LED25 = PA2
    LED26 = PA3
    LED27 = PA4
    LED28 = PA5
    LED29 = PA6
    LED30 = PA7

    Resztę połączeń pokaże na załączonych obrazkach:
    1) Układ tymczasowo jest zasilany z akumulatora samochodowego

    Pierwsza płytka zrobiona jest według schematu(schematy robione w eagle proszę o wyrozumiałość to moje pierwsze rysunki):

    [img] ATMEGA32A-PU - Zaprogramowanie anod na dwa rozne wyjscia [/img]

    Z płytki na której jest stabilizator do +12V i GND podpięte są dodatkowe kabelki prowadzące do silniczka.

    2) wyprowadzenia z płytki ze stabilizatorem idą +5V i GND na Jacka, który przekazuje napięcie na wejście Jacka NYS216, które jest przylutowane do płytki

    schemat połączenia Jacka z wejściem:

    ATMEGA32A-PU - Zaprogramowanie anod na dwa rozne wyjscia

    3) Następnie na płytce po przylutowaniu wejścia Jacka NYS216, co za tym idzie przyłączeniu zasilania do płytki, schemat połączeń przedstawia się następująco:

    ATMEGA32A-PU - Zaprogramowanie anod na dwa rozne wyjscia

    Widoczny na schemacie uC, to tak naprawdę podstawka wlutowana w płytkę, na która w celach bezpieczeństwa dopiero później wkładam uC.

    Dodam tutaj, że przy użyciu miernika cały układ został sprawdzony pod względem elektryczności. Zostało sprawdzone:
    - czy stabilizator podaje napięcie +5V
    - czy napięcie +5V jest w miejscach, które powinno VCC, AVCC, AREF
    - czy nie ma zwarć GND zasilanie
    - płytka jest już kupiona w poziomo ułożonymi ścieżkami
    - tam gdzie jest wlutowane wejście Jacka, które ma 6 nóżek 2 górne odpowiadają za GND, a 4 dolne za zasilanie, co idzie dalej na mikrokontroler

    Następnie został sprawdzone diody miernikiem, wkładając plus i minus w odpowiednie wejścia np. zapalając diodę LED8 należy minus do PB7 a plus do PA0
    LED 20 minus do PC3 a plus do PA1 itd. zgodnie z połączeniami.

    Wszystkie diody badane po kolei się zaświecały.

    2. Teraz kwestia uC ustawiłem jego działanie na zewnętrzny oscylator, widoczny na schemacie ostatniej płytki:

    avrdude -c usbasp -p m8 -U hfuse:w:0xC9:m -U lfuse:w:0xFF:m

    Mikrokontroler sprawdzany komendą:

    avrdude -c usbasp -p m32

    uC podpięty do programatora usbasp, zwraca poprawne informacje, również przy wgrywaniu pliku .hex na programatorze pali się zielona dioda wszystko wyskakuje, że program został załadowany poprawnie.

    Poniżej wrzucam nowy program wraz z opisem za co moim zdaniem co jest odpowiedzialne:

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


    Powyższy kod jest dla uruchomienia bez silniczka. Raz to działa, a raz nie np. początkowe świecą się co dwa następnie, wygasa później pozostałe świecą się co dwa i kiedy mają wszystkie zgasnąc ponownie na 2 sekundy, świeci się kilka tak jakby stany wysokie na niektórych zostawały.

    Cytat:


    Jak usunąłem tę linijkę kodu kod .c nie chciał się skompilować

    Cytat:


    nie wyłączałem JTAG, ustawiałem tylko fusebity na zewnętrzny oscylator 16MHz

    Cytat:
    5. Albo się mylisz pisząc o numerach diod albo sam się wprowadzasz w błąd numerując diody od jedynki. Przyjmij więc numerację zgodną z numeracją pinów, czyli od zera byśmy wiedzieli dokładnie, o których diodach mówisz, a najlepiej nazywaj je nazwami pinów, do których są podłączone.

    TheGrudgee napisał:
    Używając powyższego programu powinna się świecić ... 1 3 i 5 dioda z portu B

    nie ponieważ 0xea (które wpisujesz do PORTB), to binarnie 0b11101010 a przy takim schemacie jak pokazałeś oznacza możliwość świecenia diod na PB0, PB2 i PB4 pod warunkiem ustawienie jedynki na PA0.


    Mam nadzieje ze po wyjasnieniu jak podpięte są diody na początku teraz nie będzie omyłek.

    Cytat:
    8. I najważniejsze - zakomentowałeś opóźnienia w funkcji zapal_diody(). Konsekwencją tego jest że nie zauważasz wykonania jej początkowej części stąd Twoja funkcja sprowadza się właściwie do:

    Kod C - [rozwiń]
    void zapal_diody(int8_t b, int8_t a)
    {
    PORTC = a;
    PORTA = 2;
    PORTB = b;
    }

    czyli włączenie anod podpiętych pod pin PA1 i piny PB0, PB2 i PB4.


    Usunąłem całkiem te komentarze, ponieważ diody mają świecić w jednym pionie w tym samym czasie. Natomiast linie pionowe, które wyświetlają różne stany w różnym czasie zapisane są w funkcji main poprzez opóźnienia pionowych linii. Takżę według mnie tego nie powinno być, a zostało po prostu z jakiś wcześniejszych przemyśleń.

    Załączam inny kod który, został włączony na kręcącym się globusie. Raz działało dobrze wczoraj ponownie odpaliłem i już nie działało. Silniczek mam 500 rpm, wyszedłem z założenia, że jest jakieś tarcie i zostało 420 rpm. To podzieliłem na 60 sekund zostało 7 rps. Teraz sekunde podzieliłem na 7 wyszło około 140ms. Czyli oreintacyjnie wyliczyłem ile trwa jeden obrót podzieliłem to na 10 stref, żeby przez 2 się paliła część diod od LED5 do LED26 czyli nie powinno się palić 8. Cztery dolne i cztery górne oraz powinny się palić 22 diody w 1/5 jednego obrotu. I tak działało. Następnie po kilku dniach przestało działać świeci się tylko kilka diod generalnie dzieją się dziwne rzeczy.

    Kod z opisu wyżej:

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


    Mam kilka pytań jeśli elektrycznie wydaje się wszystko w porządku, to co w kodzie mogę zmienić, raz działa raz nie. Proszę o podpowiedzi w razie możliwości stopniowe. Nie wiem co mógłbym tu jeszcze napisać. Proszę o pomoc bo jestem powoli zrezygnowany. Czekam z niecierpliwością na pomocne porady.

    Pozdrawiam




    [/tex][/syntax]
  • #7 13280347
    BlueDraco
    Specjalista - Mikrokontrolery
    Elektrycznie jest do bani, bo:
    1. Brakuje rezystorów ograniczających prąd diod - długo to nie poświeci - wykończysz diody albo uC. Płynące przez LED prądy to prądy zwarciowe wzmacniaczy wyjściowych uC.
    2. Jeśli (po dodaniu rezystorów) równocześnie zaświecisz więcej niż 2..4 diody ze wspólną anodą - upalisz wyjście sterujące anodą.
    3. Brakuje kondensatorów filtrujących na zasilaniu.

    Z kolei oscylator kwarcowy, chociaż nie zaszkodzi, jest całkowicie zbędny w tym zastosowaniu.

    To, co chcesz zrobić, to klasyczny wyświetlacz multipleksowany, o którym co chwila ktoś tu pisze - masz mnóstwo schematów i programów oraz rozważań teoretycznych, co i dlaczego jest zrobione tak, a nie inaczej.

    Zacznij od poczytania np. http://mikrokontrolery.blogspot.com
    Póki co - brniesz w ślepy zaułek.
  • #8 13280585
    TheGrudgee
    Poziom 9  
    Dziękuje za odpowiedź,

    zastosowałem wersję bez rezystorów przy diodach ponieważ znalazłem w internecie jeden z projektów takiego globusa, który miał taki schemat jak ja załączełem z wyjątkiem tego, że korzystał z Atmega8, diod było 72 i były inaczej połączone katody i anody. Ja na początku połączyłem jak on 8 anod razem, kolejne 8 itd. a katody co 8 czyli LED1 z LED9, LED17 itd. z tymże ja cały czas mam 30 diod.

    Wyszedłem z założenia skoro mu działało to mi też zadziała. Jeszcze jedna różnica jest on miał kontraktron i przed nim opornik ja narazie tego nie używam.

    Rozumiem, że to można lepiej zrobić i że są jakieś, niedociągnięcia, ale skoro mu działało i mi też przez chwilę (dodam że diody są sprawne cały czas poprostu nieporawnie wyświetla) to musi być jakiś błąd w kodzie, ale jak kolega wspomniał mogę błądzić dużo mi czasu nie zostało a chciałbym skorzystać z tego co mam jak to w najlepszy sposób wykorzystać?

    Dziękuję za link na pewno z niego skorzystam.

    Pozdrawiam
  • #9 13280711
    BlueDraco
    Specjalista - Mikrokontrolery
    Racja, działało. Kluczową frazą jest tu "przez chwilę". No i nie dotykaj mikrokontrolera, bo możesz się poparzyć.

    To nie ma prawa działać i takie podłączenie grozi uszkodzeniem diod i uC z powodu przekroczenia dopuszczalnych wartości natężeń prądu dla tych elementów. Jednym z możliwych objawów uszkodzenia jest czasowe (do wyłączenia zasilania) lub trwałe zwarcie wyjścia portu do masy lub plusa - być może dlatego "niepoprawnie wyświetla".
  • #10 13281034
    dondu
    Moderator na urlopie...
    W uzupełnieniu tego co napisał BlueDraco:
    http://mikrokontrolery.blogspot.com/2011/03/datasheet-mikrokontroler-prady-pinow.html
    http://mikrokontrolery.blogspot.com/2011/03/Dioda-LED-elektroluminescencyjna.html

    Przeczytaj uważnie i zastosuj zdobytą wiedzę odpowiednio modyfikując swój schemat.
  • #11 13284531
    TheGrudgee
    Poziom 9  
    Zakupiłem diody LED w sklepie internetowym i generalnie informacje o niej są takie:

    Dioda LED 10mm czerwona 3000mcd - LED -8528 / Lx L353/3000

    Próbuje znaleźć kartę katalogową i niestety nie mogę znaleźć, prosiłbym o pomoc, które z powyższych danych użyć na forum widziałem, że oznaczenie diody było l-53IT szukałem l-8528 ale nie znalazłem.

    Pozdrawiam
  • #12 13311697
    mocarny66
    Poziom 11  
    Dioda ta ma zwiększony pobór prądu ze względu na większą "jasność" o czym mówi końcówka oznaczenia. poszukaj diody o mniejszej ilości lx
REKLAMA