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

[Atmega8, C] Stacja lutownicza - multipleksowanie LED

Kamil 1 19 Mar 2013 19:25 2778 11
  • #1 12083744
    Kamil 1
    Poziom 16  
    Witam.

    Buduję stację lutowniczą na bazie tych materiałów:

    http://ep.com.pl/files/3471.pdf
    http://ep.com.pl/files/3500.pdf

    W moim przypadku zamiast wyświetlacza LCD jest 8 wyświetlaczy 7-segmentowych LED. Do tego 8 przycisków sterujących. Schemat panela wygląda tak:

    [Atmega8, C] Stacja lutownicza - multipleksowanie LED

    Złącze IDC1 służy do połączenia z drugą płytką gdzie jest Atmega8. Atmega jest będzie podłączona w taki sposób że

    A0 -> PB2 D0 -> PC2 D4 -> PD5
    A1 -> PB3 D1 -> PC3 D5 -> PD4
    A2 -> PB4 D2 -> PC4 D6 -> PD1
    A3 -> PB5 D3 -> PD6 D7 -> PD0
    A4 -> PC1

    Przy czym A0..4 to sygnały adresowe które służą do załączania tranzystorów (A3 ustawia na wyjściach dekoder 74LS138 stany wysokie aby wyłączyć wszystkie segmenty), z kolei D0..7 to sygnały służące do zapalania odpowiednich segmentów wyświetlaczy LED a także służące do odczytywania klawiatury.

    I mam zawias, bo nie wiem jak to obsłużyć. Wydawać by się mogło że należy wyświetlanie realizować za pomocą Timera aby były równe odstępy pomiędzy zapalaniem kolejnych wyświetlaczy. Jednak nie wiem czy takie częste wywoływanie przerwania nie wpłynie na działanie reszty, tzn załączanie grzałki w kolbie itp?
  • #2 12083989
    excray
    Poziom 41  
    To zależy jak napiszesz program ale ja nie widzę tutaj żadnego problemu czy kolizji. Przerzucenie obsługi klawiatury i wyświetlacza do przerwania zegarowego powoduje to że w programie głównym masz bardzo dużo czasu na zajęcie się czymkolwiek chcesz.
  • #3 12085267
    Kamil 1
    Poziom 16  
    A czy da się jakoś lepiej rozwiązać sterowanie tymi wyświetlaczami przy takim podłączeniu? Bo tak jak pisałem sygnały sterujące segmentami są przyporządkowane po części portowi D i C a adresowe portowi B oraz C. Jak tym sterować z głową? Czy można jakoś za pomocą odpowiedniej "maski" zmieniać stany tylko na tych portach? Jest niby |= do ustawiania wybranych pinów lub &= do ich resetowania, ale to raczej odpada przy tym przeznaczeniu, bo mając w tablicy znaki cyfr do wyświetlenia, raczej to |= i &= tu się mało nada.
  • #4 12085376
    BlueDraco
    Specjalista - Mikrokontrolery
    To nie jest dobry schemat, bo:

    1. Skanowanie klawiatury wymaga wyłączenie wyświetlaczy.
    2. Masz multipleksowanie w 8 fazach, a to wymaga sporego prądu segmentów - ATmega ma za małą wydajność prądową - wypada mieć min. 30 mA na segment, prawdopodobnie więcej. Pomyśl o wzmacniaczu segmentów, np. tranzystory NMOS (BSS138?).

    3. Niepotrzebnie dajesz po dwa rezystory na segment.

    Jeśli wyświetlacz multipleksowany - to tylko w przerwaniu timera.
    Co za pomysł, żeby zamiast LCD użyć LED w takim zastosowaniu. Po co użytkownikowi 8 cyfr?
  • #5 12088180
    Kamil 1
    Poziom 16  
    Jak sterować połową portu? segmenty w moim przypadku są podłączone po częsci do portu C i portu D, niestety nie mogę podłączyć wszystkich 8 segmentów do jednego portu np. całego portu D bo wykorzystuję wejście przerwania INT które jest w tym porcie, a które jest potrzebne do działania stacji. Port B też nie jest wolny cały bo podłączony będzie rezonator.

    Więc jak mając np zmienną A = 0xFF będącą szablonem znaku "8 + kropka", wystawić ją w połowie na port C i w połowie na port D? Nie wiem czy wiecie o co mi chodzi, ale może się domyślacie.
  • #6 12088319
    BlueDraco
    Specjalista - Mikrokontrolery
    np. coś w tym stylu:

    PORTC = segmenty & 0x0f;
    PORTD = segmenty & 0xf0;

    Do tego zapewne trzeba dorzucić przesuwanie i operacje logiczne na portach.
    Jeśli segmenty masz rozrzucone po portach nieregularnie, można zadeklarować tablicę do zamiany cyfry na obraz w postaci np. dwóch bajtów na cyfrę - oddzielnie dla segmentów podpiętych do każdego portu.

    Ciekawe, po co Ci to przerwanie w stacji lutowniczej. Coś mi tu pachnie błędem.
  • #7 12088602
    Kamil 1
    Poziom 16  
    BlueDraco napisał:
    Ciekawe, po co Ci to przerwanie w stacji lutowniczej. Coś mi tu pachnie błędem.


    Zgodnie z schematem który znajduje się w PDF-ie z linków w pierwszym poście, przerwanie jest potrzebne do detekcji przejścia napięcia sieciowego przez zero.
  • #8 12089523
    BlueDraco
    Specjalista - Mikrokontrolery
    Ano racja, do tego się niby przyda. A nie wystarczyłby optotriak w wersji z załączeniem w zerze?

    Wciąż jednak się zastanawiam, w jakim celu facet z lutownicą ma oglądać 8 cyfr i ani jednej litery. ;)
  • #9 12094068
    Kamil 1
    Poziom 16  
    Mam teraz pytanie z innej beczki, chodzi o kod.

    Mam problem bo gdy mam sobie w pętli głównej while(1) takie kod:

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


    Gdzie Znak to zmienna globalna. I chodzi o to że nic się nie przypisuje tej zmiennej, po prostu gdy mam w pętli while same definicje zmiennych bez innych funkcji to te definicje się nie wykonują. Nie wiem czy to może nie jest włączona jakaś optymalizacja w AVR Studio, ale nie wiem czego szukać aby wyłączyć.

    Wystarczy że mam cos takiego:

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


    i do zmiennej tym razem jest wpisywana wartość 0xFF;

    Proszę o pomoc
  • #10 12094083
    BlueDraco
    Specjalista - Mikrokontrolery
    Pokaż cały kod. Z tego, co napisałeś, zupełnie nie wynika czy ani gdzie istnieje jakiś problem.
  • #11 12094188
    Kamil 1
    Poziom 16  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I chodzi o to że na wyjściu portu B zamiast pojawić się 10010111 są same zera.

    dopiero gdy w pętli while(1) zrobię coś takiego:

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


    to dopiero wtedy działa albo gdy wstawię "Znak = Bx10010111;" w funkcji main np gdzieś przed "TCCR0 |= Bx00000101;" to też działa.

    Wychodzi na to że jest jakaś optymalizacja kodu i gdy mam w pętli while samo przypisanie wartości do zmiennej kompilator wyrzuca ten kawałek kodu bo uznaje że nic ciekawego tu się nie dzieje oprócz przypisania zmiennej co uznaje za nie potrzebne. tak to widzę.

    P.S. nie czepiać się np. Bx11111111; bo tu używam swojej biblioteki. A po resztą tak jak pisałem problem jest gdy w pętli while mam samo przypisanie zmiennej.
  • #12 12094274
    BlueDraco
    Specjalista - Mikrokontrolery
    Eee, prościzna - zapomniałeś dać volatile w deklaracji. ;)

    całkiem poprawnie byłoby:

    static volatile uint8_t Znak;
REKLAMA