Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8] - LCD2USB i włączanie komputera na pilota w jednym

20 Gru 2012 19:22 3156 6
  • Poziom 9  
    Witam, ponieważ jestem można powiedzieć, że laikiem w temacie programowania Avr-ów w C, to mam taki problem z którym nie mogę sobie poradzić (a kombinowałem na różne sposoby), mianowicie:

    Konstruuje sobie sterownik LCD2USB wstępnie na płytce stykowej i on działa. Skonstruowany jest według schematu z tej strony. Na schemacie są oczywiście przyciski, które nie są mi potrzebne i wyprowadzenia do programowania układu, jak również dwie wersje złącz do podłączenia wyświetlacza - mi jest tylko potrzebne złącze na wyświetlacz 1x16pin, złącza do programowania nie przewiduję, także nóżki Atmegi8 PB3,PB4,PB5,PB0 pozostają wolne do wykorzystania.

    I teraz potrzebuję jeszcze układ do HTPC który by załączał komputer na pilota. Pomysł zaczerpnąłem stąd. Układ zmontowany Atiny13 działa jak należy, natomiast chciałbym jego funkcje przenieść z racji niewykorzystanych pinów do Atmegi8. Sam wsad z tego włącznika dla pilotów Sony po małych modyfikacjach i dopasowaniu do wolnych wyprowadzeń Atmegi działa. Natomiast nie mogę połączyć działania LCD2USB w jednym pliku/układzie. Wiele kombinowałem, i wykoncypowałem sobie, żeby zrobić to na zasadzie: jest napięcie na wtyczce USB (wejście PB0) - układ działa jak LCD2USB, wyświetlacz świeci / nie ma napięcia na USB - układ realizuje funkcję włącznika (w obu przypadkach sam mikrokontroler jest zasilany z wtyczki ATX i tamtejszych 5v, płyta odcina 5v po wyłączeniu kompa, tak żeby wyświetlacz wtedy się wyłączał).

    I tu pojawia się problem bo nie wiem jak to wszystko ładnie w C napisać, żeby to działało tak jak opisałem. Chodzi o to żeby ten kod LCD2USB:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    z kodem włącznika odczytującego sygnały z pilota Sony (proszę nie zwracać uwagę na sposób realizacji jego funkcji, ważne, że działa :D )

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jeśli dobrze rozumuję, to wystarczy to zrobić na zasadzie pętli, która by sprawdzała stan wejścia PB0 (pojawiające się przy włączeniu komputera napięcie), ale ja już różnie kombinowałem (wejścia/wyjścia wydaje mi się że dobrze wpisałem, define, include pododawałem, wspólne zostawiłem) głównie w tej pętli for(;;) z oryginału LCD2USB i za bardzo to nie chciało przełączać swego działania tak jak myślałem.

    Także jak ktoś z Was chciałby rzucić okiem na to i coś doradzić, to będę wdzięczny :D


    .................
    Doklejam schemat, może będzie bardziej zrozumiałe dla wszystkich co chcę zrobić:

    [Atmega8] - LCD2USB i włączanie komputera na pilota w jednym

    Pytanie:

    czy mogę do pinu (PB0 lub jakikolwiek inny wolny) ustawionego jako wejście bez podciągnięcia dawać z zewnątrz 5v z USB po włączeniu komputera i na podstawie odczytu stanu tego pina działać jakoś w programie?

    albo,

    czy też muszę to ustawić jak wejście z podciągnięciem i reszta jak wyżej?

    albo,

    czy mogę to tylko i wyłącznie zrobić jako wejście podciągnięte i zwierane do masy?

    Na tę chwilę moje kombinacje z plikiem main.c od LCD2USB wyglądają następująco (tu akurat kombinowałem z pinem PD0) i nie wiem czy moje rozumowanie jest poprawne:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Moderator Mikrokontrolery Projektowanie
    Zostawiasz pin RESET bez wymuszenia na nim stanu za pomocą pull-up wewnętrznego (programem) lub zewnętrznego rezystora. Jesteś świadomy zagrożenia?

    Dlaczego nie filtrujesz zasilania pinu AVcc, co najmniej tak jak pinu Vcc?

    Te dwa problemy opisane tutaj: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html


    wozaq napisał:
    czy mogę do pinu (PB0 lub jakikolwiek inny wolny) ustawionego jako wejście bez podciągnięcia dawać z zewnątrz 5v z USB po włączeniu komputera i na podstawie odczytu stanu tego pina działać jakoś w programie?

    Możesz. Ale musisz być świadomy, że jeżeli popełnisz błąd w programie i ustawisz ten pin jako wyjście i dodatkowo ustawisz na nim 0, to będzie piękne zwarcie i co najmniej pin pójdzie z dymem. Nie podłączaj więc bezpośrednio do 5V, tylko poprzez rezystor np.10k.
  • Poziom 9  
    Ok generalnie to sobie poradziłem już dawno temu i na płytce prototypowej złożyłem wszystko według schematu i wszystko cacy działało.

    Schemat według którego wszystko zaprojektowałem:

    [Atmega8] - LCD2USB i włączanie komputera na pilota w jednym

    Potem zaprojektowałem płytkę w Eagle, wytrawiłem, polutowałem i tu już to nie działa jak trzeba.

    Płytka:

    [Atmega8] - LCD2USB i włączanie komputera na pilota w jednym

    Na prototypie było tak, że o trybie działania czy to włącznik, czy to LCD2USB decydował stan wejścia PD0 (napięcie z wtyczki USB) podłączone przez opornik R11 (10k), natomiast po odłączeniu wszystko ładnie szło do masy przez opornik R12 (47k). Działało jak należy tj. dostawał napięcie na PD0 - układ pojawiał się w systemie jako LCD2USB, wyświetlacz działa i świeci, odłączam zasilanie z PD0 - chwila moment i układ "wypada" z systemu i działa jako włącznik, wszystko extra super tak w kółko można było.

    Natomiast po zlutowaniu wszystkiego do kupy nie jest już tak ładnie. Po podłączeniu zasilania, bez napięcia z USB na PD0 układ działa jako włącznik, dodaję napięcie na PD0 - działa jako LCD2USB, odłączam zasilanie i co ciekawe z wyświetlacza znika tylko napis, podświetlenie trochę przygasa ale wszystko dalej działa jako LCD2USB (widoczne w systemie). Miernik na PD0 pokazuje ~3v, tylko nie wiem jakim cudem, skoro już napięcia nie ma podawanego. Jak zewrę ten pin do masy do w koncu z niego wszystko ujdzie i wyświetlacz gaśnie, ale kombinowałem już przez oporniki 10k, 47k, 50k (R12) i w ten sposób to nie działa. Jak ktoś wie o co chodzi to będę wdzięczny za pomoc, bo już mało mi brakuje do pełnego sukcesu :D Dodam tylko, że wszystko polutowane jak trzeba, natomiast to co na schemacie bazuje na ATtiny2313 realizuje inną funkcję (HID keys) i wspólne ma jedynie zasilanie z USB - działa jak należy.

    Dla rozeznania wsad Atmegi wygląda tak (nie zwracać uwagi na co niektóre bełkotliwe komentarze :P):

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    wozaq napisał:
    ... odłączam zasilanie i co ciekawe z wyświetlacza znika tylko napis, podświetlenie trochę przygasa ale wszystko dalej działa jako LCD2USB (widoczne w systemie). Miernik na PD0 pokazuje ~3v, tylko nie wiem jakim cudem, skoro już napięcia nie ma podawanego.

    Jeżeli dobrze zrozumiałem, to problem zasilania z nikąd jest prawdopodobnie prosty do wytłumaczenia. USB przez R11, pin PD0 i jego diodę zabezpieczającą, zasila mikrokontroler, a przez jego pin zasila wyświetlacz. To bardzo niebezpieczne dla diody w mikrokontrolerze - może ulec uszkodzeniu.

    Zobacz na rysunek I/O Pin Equivalent Schematic i diodę z pinu do zasilania (do góry). To o tę diodę chodzi.
  • Poziom 9  
    Czyli mam rozumieć, że założenie na schemacie było od samego początku błędne i należało to rozwiązać w inny sposób? No i, że być może ten pin jest uszkodzony w układzie? Jeśli tak, to w jaki sposób powinienem był to zrobić prawidłowo?

    Dodam tylko że sama Atmega ma docelowo zasilanie z innego źródła tj. wtyczka ATX.
  • Moderator Mikrokontrolery Projektowanie
    Może jeszcze nie skoro dioda przewodzi :)
    Hmm, pierwsze, co bym zrobił by nie zmieniać PCB, to zastosował dzielnik o innych wartościach liczonych w setkach kΩ. Czyli R11 i R12. A może nawet MΩ. Trzeba policzyć lub eksperymentować.
  • Poziom 9  
    Ok, problem chyba rozwiązany, szeregowo dane 10k + 2k2 na R12 załatwiło sprawę. Jutro potestuję ostatecznie.