Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Program do AT89C2051. Układ sterujący. Pewnego rodzaju joystick. Wskazówki.

JarekLT 28 Sep 2007 12:34 2021 18
  • #1
    JarekLT
    Level 14  
    Witam wszystkich bogów programowania mikrokontrolerów!

    Chciałbym poprosić Was o pomoc w stworzeniu programu do AT89C2051.
    Dopiero zaczynam sie "bawić" w programowanie mikrokontrolerów, a początki sa bardzo trudne i właśnie dlatego proszę was o pomoc.
    Schemat jest podany na rysunku.
    To ma być układ sterujący za pomocą pewnego rodzaju joysticka.
    Joystick się składa z 4 przycisków (B1, B2, B3, B4) i przełącznika obrotowego (S1,S2,S3). Na rysunku ten samy przełącznik przedstawiłem w postaci 3 przycisków (w zielonej ramce) żeby było bardziej zrozumiale jak to ma działać. Powyżej jest przedstawiony ten sam przełącznik. Chyba poprawnie go nazywam przełącznikiem, myśle, że impulsatorem go nazwać nie można, gdyż po obrocie kontakty zostają złączone. Np.: Złączone są kontakty (jak na rysunku) S i S3. przy obrocie przełącznika w prawo (według wskazówki zegara) kontakty S i S3 sie rozłączają i złączają się kontakty S i S2 i tak zostają, przy kolejnym obrocie S i S2 się rozłączają i złączają się kontakty S i S1 i tak zostają. Przełącznik ma trzy kroki, przy których robi pełne kolo i dalej idzie w kółko (S-S3/S-S2/S-S1/S-S3/S-S2 itd.) jeżeli będziemy go "kręcili" w lewą stronę to będzie odwrotnie.
    Ma to działać w ten sposób:

    1. Po wciśnięciu przycisku B1 na porcie P1.2 ma być 1 i tak ma zostawać aż puścimy przycisk.
    2. Po wciśnięciu B2 na porcie P1.6 ma być 1 i tak ma zostawać aż puścimy przycisk.
    3. Po wciśnięciu B3 na portach P1.6 i P1.7 ma być 1 i tak ma zostawać aż puścimy przycisk.
    4. Po wciśnięciu B4 na porcie P1.3 ma być 1 i tak ma zostawać aż puścimy przycisk.
    5. Po wciśnięciu jednocześnie przycisków B2 i B3 na portach P1.4 i P1.5 ma być 1 i tak ma zostawać az puścimy przyciski.
    6. Przy obrocie przełącznika obrotowego S w prawo na Portach P1.5 i P1.6 ma być 1 - impuls o długości ~0.2s.
    7. Przy obrocie przełącznika obrotowego S w lewo na porcie P1.5 ma być 1 - impuls o długości ~0.2s.

    Będę wdzięczny za wszelkiego rodzaju pomoc w tworzeniu tego programu
  • Helpful post
    #2
    adamowicz
    Level 21  
    Witam.
    A potrzebne Ci to do szkoły czy coś budujesz dla siebie? Jeżeli tak, to co to jest?. Jakim językiem porogramowania chcesz się posługiwać ?

    Pozdrawiam
  • #3
    JarekLT
    Level 14  
    Robię to dla siebie. To jest mój projekt w pracy. Będzie to zdalne sterowanie zaawansowanym urządzeniem spawalniczym. Na temat programu do programowania - myśle, że BASCOM, ale tak do końca nie jestem pewien, czy to właściwy wybór.
  • Helpful post
    #4
    adamowicz
    Level 21  
    Mogę napisać w asemblerze. Program krótki i przejrzysty. Pliki w asm i hex wystawię na swoją stronę http://8051.ovh.org
    Pozdrawiam
  • #5
    JarekLT
    Level 14  
    Nawet nie wiem jak mógłbym Ci to wynagrodzić. podziwiam takich mądrych ludzi jak Ty. Prawdę mówiąc nawet nie wiedziałem od czego zacząć z tym programem, a dla Ciebie to jest krótko i przejrzyście.

    Dziekuję!
  • Helpful post
    #6
    adamowicz
    Level 21  
    Jak ma wyglądać współpraca przełącznika obrotowego z pozostałą częścią klawiatury?
    Czy mam rozumieć ,że przciskając np. B1 reszta klawiszy w tym przełącznik S są nieaktywne do chwili zwolnienia B1? Dotyczy to również wszystkich innych możliwości.
  • #7
    JarekLT
    Level 14  
    Witam!
    Najlepiej byłoby, żeby po wciśnięciu któregokolwiek z klawiszy reszta klawiszy w tym przełącznik pozostawałyby aktywne. Dobrze byłoby, żeby można było urzeczywistnić taką funkcje jak: wciskając i przytrzymując przycisk B1 i obracając kołem np. w prawo działałyby obie funkcje, czyli na porcie P1.2 = ciągle 1, a na portach P1.5 i P1.6 (obracając kołem) = impulsy o długości 0,2s. Tak sobie jeszcze pomyślałem, jeżeli będzie tak, że po wcisnięciu pewnego klawisza pozostałe klawisze pozostaną nieaktywne - to uniemożliwia funkcję Nr.5. (Po wciśnięciu jednocześnie przycisków B2 i B3 na portach P1.4 i P1.5 ma być 1 i tak ma zostawać az puścimy przyciski.) dlatego, że niemożliwe jest wcisnąć dwa przyciski dokładnie jednocześnie, chociaż na ułamek sekundy jeden przycisk skontaktuje pierwszy np. B2 wtedy B3 pozostanie nieaktywny.
    Taki wariant (jaki opisałem wyżej) byłby idealny, ale jeżeli takie warunki będą sprawiały dużo dodatkowych trudności w napisaniu programu to może być jakikolwiek prostszy wariant, a jeżeli to tylko kwestia kilku dodatkowych opcji lub komend programu - to byłoby SUPER! Po prostu nie chce nadużywać Pana uprzejmości.
  • Helpful post
    #8
    Jdsoul
    Level 23  
    Cześć !

    Z tego co widzę nawet jeśli to tylko podstawowa funkcjonalność urządzenia , możesz mieć malutkie problemy z działaniem

    Po pierwsze moment resetu :( tak się składa, że zaraz po resecie cały port 1 jest wypełniony "1".
    Proponowałbym przejść na logikę ujemną :) tzn. żeby stanem aktywnym w układzie było "0".
    No chyba, że układ jest superbezwładny i start mikroprocka nie stanowi problemu :).

    Druga sprawa to "przełącznik" obrotowy, rozumiem że nie jest to przełącznik skokowy tylko jakiś rodzaj kalibratora, taka kierownica, czy raczej koło wieloobrotowe bez ustalonego położenia powrotu ?? To daje podstawową różnicę w obsłudze.

    Generalnie warto by się jednak zastanowić nad jakąś formą wskaźnika wyboru komend i trybu pracy sterowanego urządzenia - diody LED, LCD etc.
  • #9
    JarekLT
    Level 14  
    Co masz na myśli mówiąc superbezwładny?
  • Helpful post
    #10
    Jdsoul
    Level 23  
    Układ mikroprocesorowy różni się od układów logicznych sekwencyjnych tym, że przy starcie mikroprocesora przez kilka ms wykonywane są operacje przygotowujące procesor do pracy.
    Żeby zapewnić procesorowi spokój na ten czas linia Resetu procesora jest blokowana za pomocą układu kondesatora i rezystora. Jest to taki układ opóźniający ostateczny start programu, na sztywno zawarty w konsrtukcji.

    Jeśli teraz jakieś urządzenie dołączone do mikroprocesora zareaguje na te "1" to może być drobny kolaps. mogą pojawić się nieoczekiwane zjawiska. Stąd cenne jest uruchomienie maszyny dopiero po uzyskaniu kilku kroków programu na mikrokontrolerze.


    Przez ten krótki czas wszystkie porty rodziny 8051 są w stanie wysokim "1" na wyjściach.

    Więc jeśli maszyna będzie już pracowała , a kontroler zainicjujesz po tym momencie możesz mieć taką sytuację że wszystkie opcje same jedynki zostaną podane na raz do konsoli sterującej.

    Przez bezwładność rozumiem czas reakcji na takie nietypowe zdarzenie lub inaczej , zabezpieczenie maszyny przed próbą jednoczesnego wykonania kilku poleceń. Jeśli np. jest to silnik dużej mocy, lub inne urządzenie to takie nagłe sterowanie może doprowadzić do nieoczekiwanych efektów.

    Dlatego w układach sterujących opartych na 8051 , stosuje się logikę ujemną. zakładając że "1" jest stanem spoczynkowym domyślnym układu a "0"stanem aktywnym :)
    Poprostu ktoś tak skonstruował ten konkretny typ procków.

    Warto o tym pamiętać przy konstruowaniu układów, bo ani w symulatorze, ani w debugerze tych spraw nie zauważysz :) są one ściśle związne ze sprzętem :)
  • #11
    JarekLT
    Level 14  
    Dziekuje,

    W mym przypadku to nie grozi, dlatego, że najpierw się wlączy kontroler a po upływie 5s pozostałe urządzenia.
  • Helpful post
    #12
    Jdsoul
    Level 23  
    Rozumiem :) , ale wiesz zawsze są jeszcze inwertery :) np. 7404 lub nawet OC 7407.
  • #13
    JarekLT
    Level 14  
    Tak, wiem! Dzięki. :)

    To co sądzicie? uda się zrobić program, żeby działało jak pisałem powyzej?
  • #15
    JarekLT
    Level 14  
    Ogromne Dziękuję!!!
  • #16
    JarekLT
    Level 14  
    Witam,

    Jeszcze raz dziękuję za “soft”, który napisałeś. Zaprogramowałem kontroler i działa, prawda nieco nie tak, jak trzeba. Do testu używam klawiatury 3x3. Otórz przyciski działają z pewnym opóźnieniem. Np. gdy wciskam B4 to gdzieś po sekundzie mam 1 na P1.3, czasem szybciej. czy można to przyśpieszyć? Przełącznik obrotowy działa poprawnie tylko w prawo (według wskazówki zegara) S3->S2->S1->S3->S2->S1 itd. natomiast w lewo działa jeżeli to idzie tak: S1->S2->S3. Przy przejsciu z S3->S1 nie działa.
    Czy można ten soft naprawić?
  • Helpful post
    #17
    adamowicz
    Level 21  
    Witam.
    Rzeczywiście jest pomyłka.
    pod Label S31 w kodzie zmieiłem z JNB P3.1 na P3.5.
    Powinno być dobrze.
    Co do prędkości działania, to sposób napisania tego programu ( uC wykonuje kolejno operacje i pracuje w pętli lokalnej w chwili np. wciśnięcia klawisza) wymusza pewne opóźnienie, byś nie musiał zaprzegać silnika do kręcenia przełącznikiem S :). Dołączam poprawiony plik.
  • #18
    JarekLT
    Level 14  
    Ogromne dzięki! Przełącznik działa poprawnie. Co do przycisków B1, B2, B3 i B4 to trochę niedobrze, dlatego, że te przyciski mają służyć do zmieniania wartości (+/-) czyli będą wciskiwane dosyć często i szybko. np. aby zmienić wartość od 10 do 250 z krokiem 5 trzeba przycisk wciskać kilkakrotnie i za każdym wcisnięciem czekać aż zareaguje z powodu opóźnień. zauważyłem pewną rzecz, że gdy przełącznik S jest w pozycji S-S2 lub S-S3 gdy wciskam B2 i B3 jednocześnie na portach P1.4 i P1.5 jest 1 od razu bez opóźnień. Gdy przełącznik S jest w pozycji S-S1 to B2+B3 jest już z opóźnieniem.
    Może by się udało coś jeszcze wyczarować? :) Bo wiem, że to jest możliwe, bo widziałem jak to działa na AT89C2051 w maszynach innego producenta. A tego "pilota" innego producenta nie mogę zastosować, gdyż nie pasują mi kombinacje sygnałów wyjściowych.
  • #19
    adamowicz
    Level 21  
    Oczywiście, że można" wyczarować" lepiej, szybciej.
    Tylko, że to wymaga czasu. Masz bazę w postaci programu. Reszta to Twoja własna inwencja twórcza.
    Pozdrawiam