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

[avr][c][vmLAB] Podłączenie wbudowanego LCD Module 2313

marek21ggg 24 Maj 2008 03:36 2439 3
  • #1 5174404
    marek21ggg
    Poziom 2  
    Witam,

    problem jak w temacie. Chcę używać Modulu LCD dostarczonego przez VMLAB.
    W pliku prj jest:
    ;     chars lines oscil_freq) RS  RW  E   D7  D6  D5  D4  D3  D2  D1  D0 	
    X1  LCD(16    2      400k)    PD3 PD2 PD1 PD7 PD6 PD5 PD4 VDD GND GND GND

    Skopiowałem to z innego projektu, i nie wszystko z tego rozumiem.

    No i co dalej? Znalazłem sporo informacji jak łączyć się z innymi rodzajami wyświetlaczy (ten jest 2x16). Znalazłem też świetną klasę napisaną w C++ ale coś mi się nie wydaje, żeby ten kontroler mógł z niej korzystać (próbowałem dołączać pliki, robić includy ale podejrzewam że obiektowego C++ nie da się tak po prostu dołączyć)

    W ogóle nie znam się na elektronice, asembler to też raczej ciężka sprawa. Świetnie czuję się w C++ ale to chyba niewiele mi daje.
    Muszę napisać projekt i liczę na odrobinę wsparcia. Z góry dzięki.

    Jeśli jeszcze czegoś istotnego nie napisałem - dajcie znać, dopiszę.
  • #2 5176050
    KowalD
    Poziom 17  
    marek21ggg napisał:

    No i co dalej?

    no a dalej znajdz jakas dokumentacje do tego LCD... albo poszukaj na elektrodzie :D... pola projektow ma takie wyswietlacze ;)... zapoznaj sie z nim na tyle, zebys wiedzial do czego sluza poszczegolne piny :)... i jedziesz :D...

    co do Cpp to da sie programowac AVR w nim... znam przypadnki... ale nie wim co powie 2313... musisz sprobowac :)... a jak znasz sie na cpp to i w c sobie poradzisz... a skoro masz klase juz nawet napisana, to i nawet algorytmy odpowiednie masz :)...
  • #3 5177276
    marek21ggg
    Poziom 2  
    Coś tam walczę, ale nóżki, piny, wejścia i wyjścia to dla mnie brzmi jak chińszczyzna :( Wcale nie tak łatwo było mi znaleźć przykład kodu który by to realizował. Wszystko co do tej pory widziałem jest w ASM a w to BARDZO nie chcę się wgłębiać. Dopiero przed chwilą wpadł mi w ręcę kod w C.

    Jak dotąd udało mi się opanować diody i przyciski na przerwaniach - chociaż nie potrafię po wywołaniu przerwania ustalić który przycisk je wywołał, więc obszedłem to tak:
    Robię dwa rodzaje przerwań (tak to się mówi? :P )

    SIGNAL(SIG_INTERRUPT1) i
    SIGNAL(SIG_INTERRUPT0)
    Klawisz 0 generuje to pierwsze przerwanie, a klawisz 1 to drugie.
    No ale przez to korzystam tylko z 2 klawiszy :/
    Jak to obejść dla tak zdefiniowanych buttonów?

    
    // KLAWISZ 1
    K0 PD3 VSS
    R1 VDD PD3 10K                       
    
    //KLAWISZ 2
    R2 VDD PD2 10K      
    K1 PD2 VSS             
    
    //KLAWISZ 3
    R3 VDD PD4 10K
    K2 PD4 VSS
    

    Jak rozpoznać czy naciśnięto K1 czy K2?
    Teraz klawisz 2 nie wywołuje przerwania. Zmieniłem jego kod na:
    
    R3 VDD PD2 10K
    K2 PD2 VSS
    
    i już robi przerwania, ale działa identycznie jak klawisz 1. Może jakiś hint?
    Widziałem gdzieś takie rozwiązanie:
    
    button = inp(PORTD);
    

    gdzie button to zmienna unsigned char, ale u mnie nie działa. Przechowywana jest taka sama wartość bez względu na naciśnięty button (de facto 0)
    Pewnie to dla Wa trywialne, ale dla mnie elektronika to czarna magia a naprawdę nie mam potrzeby głębokiego jej poznawania, stąd czytanie teorii trochę mi nie w ząb... Potrzebuję zrobić ten jeden program i już...
  • #4 5177767
    KowalD
    Poziom 17  
    SIG_INTERRUPT1 i SIG_INTERRUPT0 oznaczaja u Ciebie przerwania zewnetrzne... kazde z nich przypisane jest do jakiegos pinu procesoraq... i w zaleznosci od ustawien tych przerwan odpowiednio reaguja na to co dzieje sie na tym pinie...

    jesli chcesz wiecej przyciskow a ni masz tylu przerwan zewnetrznych to musisz wszystkie przycicski DODATKOWO podlaczyn np przez diody do pinu z przerwaniem zewnetrznym... przerwanie szostanie zgloszone gdy ktorys z przyciskow zostanie wcisniety... w procedurze obslugi spradzasz wszystkie przyciski i tak okreslasz ktory zostal wcisniety...

    oznacza, ze przycisk masz jedna strona podlaczony do pinu PD3 procesora... a druga strona do masy

    R3 VDD PD4 10K
    realizuje tzw. rezystor podciagajacy... jedna strona do pinu PD4, a druga do zasilania... wartosc 10k... nie jest konieczny w wiekszosci przypadkow... avr maja wewnetrzne (prawie zawsze)... ale trzeba je wlaczyc w programie...

    te Twoje przyciski dzialaja tak, ze jesli przycisk nie jest wcisniety, to stan na pinie to 1... a gdy jest wcisniety to stan to 0 :D...

    nie mozesz odczytywac poszczegolnych stanu pinow... musisz caly port (8bitow)... poczaj maskowania :)... i inne operacje logiczne ;)... np.
    if (!(PIND & _BV(PD3))){};
    DDRD |= (1<<PD3);
    DDRD &= ~(1<<PD3);
REKLAMA