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

Attiny2313-20PU - wyswitlacz 7-segmentowy, brak multipexu

bill33 27 Lip 2013 11:22 4782 47
  • #1 12565325
    bill33
    Poziom 10  
    Witam.
    Powrocilem do swojego projektu, czyli podkładki chlodzacej pod laptopa, ale problemy zaczynaja sie od razu >..<
    Nie wychodzi mi nawet wyświetlacz, ktory ma pokazywac aktualna temperature. Chciałem zaimplementować dwa wyswietlacze. Jeden dla jednosci jeden dla dziesiatek. W symulatorze dziala ok, ale po wgraniu juz nie :(
    Wyswietlacze zamiast sie multipexować, to wyswietlaja to samo i to chyba losowe wartości.
    Próbowalem zmienic piny obslugujace miltiplex, ale jest to samo. Najdziwniejsze jest to ze jak jeden pin mialem ustawiony na wejscie i byl zwarty do masy to na czestotliwosci 1Mhz dzialo o.0 Juz nie wiem co mu przeszkadza w wyswietlaniu odpowiednim.
    Attiny2313-20PU - wyswitlacz 7-segmentowy, brak multipexu
    Oporniki wyswietlaczy - 100O (wyswietlacz zielony)
    tranzystory sterujace BC337

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


    Kod moze wygladac dziwnie, ale to zlepek paru xPP To tylko fragment ktory powinien faktycznie dzialać, a nie dziala >..<

    Może to czestotliwośc taktowania uC, albo opoznienia za małe?

    Prosze o pomoc ;)
  • #2 12565398
    tmf
    VIP Zasłużony dla elektroda
    Zaczinj od narysowania porządnego schematu, np. w darmowym Eagle. To co zamieściłeś jest kompletnie nieczytelne. Dwa - program jest dziwny. Ściągnij darmowe przykłady do mojej książki, tam masz proste programy do mutipleksowania LED, masz też programy do współpracy z DS1820.
  • #3 12565469
    bill33
    Poziom 10  
    Schemat mam, ale na kompie do którego nie mam dostepu w weekend :/ mam wydrukowane, to zaś skanera nie mam :/ postaram sie do jutra zeskanować

    dane dla wyśw są z portu B[0..6]
    sterowane z portu d0 i d1 (probowalem tez a0 i a1)

    Co masz na myśli, że program jest dziwny? Skad moge wziąć te przykłady? Bo już pisałem w sumie na podstawie wielu xD
  • #5 12565588
    Sparrowhawk
    Poziom 22  
    Pewnie ma na myśli, że to jest zlepek wszystkiego ;)

    A tak na poważnie:

    1. Po ci Ci ten return; w obsłudze przerwania?

    2. Jeśli już w przerwaniu chcesz zablokować inne przerwania, zrób to za pomocą atrybutu BLOCK.

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

    Pewnie miałoby wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    4. Na schemacie wyświetlacze są do podłączone do portu D i B, a przerwanie ma sterować z portu A.

    5. Zmienna 'i' nie musi być wcale volatile;

    6. Nie widzę nigdzie deklaracji zmiennej 'active_display'.
  • #7 12565717
    tmf
    VIP Zasłużony dla elektroda
    Tak, ale na końcu. Robi bezsensowne sei/return. To sei jest potrzebne bo return jest zapewne tłumaczony na RET a nie RETI. Czyli tworzymy najpierw problem (return) a potem go omijamy (sei). Niemniej to cli na początku jest kompletnie bez sensu. Indeksowanie tablicy typu: *(C+d0) jakkolwiek poprawne jest dosyć dziwaczne. Tak się indeksuje wskaźniki sensu stricte.
  • #9 12566851
    bill33
    Poziom 10  
    dzięki Sparrowhawk za pare rad ;). Poprawiłem troche, ale dalej oba wyswietlaja to samo >..<

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


    zapomnialem przekopiowac definicje activ_display ;)
    Returna to ja wstawiam z przyzwyczajenia w kazdej funkcji ;)
    w przerwaniu były sterowane na A bo tak tez probowalem...
    Ale z tego co mi wiadomo, w programie z jednym plikiem mozna tak F_CPU zadeklarować. Na przyszłośc będe inaczej definiowal ;)

    A na zrozumienie przykładu obsługi wyswietlaczy od tmf'a potrzebuje wiecej wolnego czasu bo nie ogarniam co sie tam dzieje xD
  • #11 12567488
    bill33
    Poziom 10  
    wiec F_CPU nawet w plikch nagłówkowych trzeba by zadeklarować?

    edit:
    _______________________________
    Już okroiłem kod żeby sprawdzic czy sam wyświetlacz by chcial chodzic, ale nie :(

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

    Nawet F_CPU wsadziłem do propertasów ;)
  • #12 12567493
    piotrva
    VIP Zasłużony dla elektroda
    F_CPU należy zadeklarować w opcjach projektu (jeśli to jakieś ogarnięte IDE) lub jeśli IDE nie generuje pliku makefile to musisz sam dopisać deklarację do tegoż pliku - tylko wtedy będzie ona widoczna dla WSZYSTKICH plików projektu.
  • Pomocny post
    #13 12567504
    Sparrowhawk
    Poziom 22  
    Zrezygnuj póki co ze zmiany wartości d0 i d1 w pętli i wpisz tam po prostu jakieś wartości na stałe. Co do przyczyny dlaczego masz cały czas takie same wartości, to myślę, że ten procesor się zawiesza w którymś momencie.
  • #14 12567523
    bill33
    Poziom 10  
    Sparrowhawk napisał:
    Zrezygnuj póki co ze zmiany wartości d0 i d1 w pętli i wpisz tam po prostu jakieś wartości na stałe. Co do przyczyny dlaczego masz cały czas takie same wartości, to myślę, że ten procesor się zawiesza w którymś momencie.

    Poszedłem za tą poradą i dochodzę do wniosku, że wyswietla tylko stan d0 na obu wysw.
    Po dłuższej obserwacji na chwile wyświetla d1 (tez na obu wyśw.)
    I teraz samo d1 o.0
  • #15 12567542
    Sparrowhawk
    Poziom 22  
    A spróbuj taki kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 12567551
    bill33
    Poziom 10  
    dwie piatki wyswietla >..<

    edit:
    rozumiem ze mial wyswietlac 0 i 5?
  • #17 12567743
    Sparrowhawk
    Poziom 22  
    Popełniłem mały błąd :$

    Zmień linijkę:
    sei(); na SREG |= (1<<7);

    oraz PORTB = Out[Val[Pos]];
    na: PORTB = Out[Val[Pos-1]];
  • #18 12567871
    bill33
    Poziom 10  
    dwie czwórki...
    Przed chwila wygladało jakby chciał dwie cyfry naraz wyswietlić. Powiedzialbym ze źle tranzystory dobrane albo rezystory, ale wczesniej na 1Hz dzialalo (tylko ze z podłaczonym jednym wejsciem do masy xD)

    edit:
    Chyba, że komuś by sie chciało zerknąc czy dobrze podobierałem elementy ;)
    Tranzystory
    Wyświetlacze
    z portów B do wyśw są oporniki 100 Ohm, a do tranzystorów na baze tez 100 Ohm, a bylo wcześniej testowane z 1k Ohm
  • #19 12568119
    Sparrowhawk
    Poziom 22  
    Późna pora nie tłumaczy moich błędów, ale już padam ;)

    Wcześniej zapomniałem jeszcze o jednej rzeczy więc wklejam od nowa:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #20 12568243
    bill33
    Poziom 10  
    To nie chce Cie męczyć na siłe ;)
    Nie wiem co miał wyświetlić ale wyświetla dwie ósemki. Może nakłada na siebie dwie cyfry...
  • #21 12568278
    dondu
    Moderator na urlopie...
    bill33 napisał:
    To nie chce Cie męczyć na siłe ;)
    Nie wiem co miał wyświetlić ale wyświetla dwie ósemki. Może nakłada na siebie dwie cyfry...

    Do wykrywania takich błędów, służy symulator AVR, który znajdziesz w oryginalnym IDE Atmela. Krok po kroku sprawdzisz sobie jak działa Twój program.
  • #22 12568311
    bill33
    Poziom 10  
    Jakbym tam znalazł odpowiedź to bym się tutaj nie pytał ;)
    W symulatorze to mi działa wszystko od wyswietlaczy przez 1-wire do PWM xPP
  • #23 12568339
    Sparrowhawk
    Poziom 22  
    Nie męczysz mnie, tylko pora spać :D

    Skoro dwie ósemki Ci się wyświetlają to oznacza, że nie działa multipleksowanie tych wyświetlaczy. To znaczy na porcie B prawidłowo wyświetlają się raz 1, a raz 6. Więc albo multipleksowanie jest za szybkie (Ale nie wiem jaki masz zegar), albo sterowanie włączeniem i gaszeniem wyświetlaczy nie działa (To znaczy cały czas są włączone).
  • #24 12568343
    dondu
    Moderator na urlopie...
    bill33 napisał:
    Jakbym tam znalazł odpowiedź to bym się tutaj nie pytał ;)
    W symulatorze to mi działa wszystko od wyswietlaczy przez 1-wire do PWM xPP

    No tak, z góry założyłem, że nie sprawdzałeś :)
    Możesz wrzucić zdjęcie?
  • #25 12568348
    bill33
    Poziom 10  
    Jade na 8 Mhz. Mówisz, żeby zmienić preskaler timera? Moze tranzystorki sie nie zdarzaja zamknąc... zwiekszyć/zmniejszyc opornik na bazie?

    Edit:
    Zmineniłem peskaler to tylko migaja jak głupie te ósemki xD
    zdjęcie czego?
    w suemie widać przy takim preskalerze, że na zmiane na obu miga 1 i 8
  • #26 12568376
    Sparrowhawk
    Poziom 22  
    Skoro masz 8 MHz, i korzystasz z wewnętrznego oscylatora, to przestaw go na 1MHZ (Fusebity). Da Ci to około 60 Hz. Teraz masz chyba 500 Hz. Jeśli to nie pomoże, to sprawdź tranzystory ;)
  • #27 12568378
    dondu
    Moderator na urlopie...
    Zdjęcie całego pracującego układu. Najlepiej z krótkim czasem migawki.

    Zmodyfikuj na razie tak program, by cały czas wyświetlał jeden zestaw znaków, tak by stwierdzić czy na poszczególnych cyfrach prawidłowo znaki wyświetla. Bo pytasz o rezystory, a tego jak rozumiem nie sprawdziłeś.
  • #28 12568386
    bill33
    Poziom 10  
    Attiny2313-20PU - wyswitlacz 7-segmentowy, brak multipexu

    cyferki dobrze wyświetla.
    O rezystory pytam, bo nie jestem ich pewny. Ale na baze juz próbowalem podać i 100 Ohm i 10k i ten sam efekt...
    Po przestawieniu na 1MHz tylko ladniej widac ze razem sobie radosnie mogaja ta samą cyfrą :(
    A już myslałem że znalazłem sobie pasje na życie xD
  • #29 12568390
    dondu
    Moderator na urlopie...
    Ale obie cyferki są takie same, a do testów powinieneś wyświetlać różne :)
    W programie są różne? - Pokaż odpowiadający zdjęciu program.

    Dopiero teraz przyglądnąłem się Twojemu programowi i od razu pytanie:
    Dlaczego multipleksowanie realizujesz w pętli głównej?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    EDIT:
    Oj, sorry to nie jest fragment Twojego programu.
    Pokaż cały Twój aktualny program odpowiadający zdjęciu.
  • #30 12568418
    bill33
    Poziom 10  
    To program od sharrowa xP tak, w programie sa rozne cyfry
    Pewna obserwacja. Zmusiłem go programem do wyswietlania tylko jednej cyfry, a wyswietla obie. Z jakiegoś powodu na nieużywanym tranzystorze pojawia sie prad.
    Jest jakiś sposób ściągnięcia tego do masy?
    Bo szukamy usterki w programie, a to wyglada, że sie pojawia gdzieś niepotrzebne napięcie/prad

    edit:
    program od sharrowa
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA