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.

BASCOM, AVR, dioda RGB sterowana switchem...

12 Sty 2010 10:21 3296 6
  • Poziom 25  
    Jak w temacie - cała sprawa dotyczy diody RGB sterowanej switchem - całość chciałbym zrealizować w oparciu o attiny13.

    Jako, że moje doświadczenie w pisaniu programów w Bascomie jest prawie żadne i dopiero co zaczynam prosiłbym, żeby ktoś z doświadczeniem pomógł mi w napisaniu programu w Bascomie, który będzie sterował pracą diody RGB za pomocą jednego switcha...
    Nie spotkałem się jeszcze z takim projektem dlatego piszę to tutaj i liczę na to, że ktoś w ramach walki z nudą poświęci mi trochę czasu i pomoże w napisaniu sensownego programu.
    Chcę żeby to było w bascomie - bo póki co to C ani ASM mnie nie interesuje - do moich prostych celów nic innego nie potrzebuje.

    Schemat układu znajduje się poniżej.
    Chciałem wykorzystać prosty procek AVR ATTINY13.

    Założenia działania układu mają być następujące:

    > Każdorazowe naciśniecie przycisku z czasem krótszym niż 2 sekundy będzie powodować zmianę koloru przez odpowiednie załączanie konkretnej diody/diód czyli:
    - czerwona
    - zielona
    - niebieska
    - czerwona + zielona
    - czerwona + niebieska
    - zielona + niebieska
    - czerwona + zielona + niebieska

    > naciśniecie i przytrzymanie przycisku na czas dłuższy lub równy 2 sekundy spowoduje całkowite zgaszenie diód

    > jeśli układ będzie wyłączony - to krótki impuls poniżej 2 sekund ponownie załączy cały układ i wszystko zacznie świecić

    Nie pytam czy to jest możliwe bo na pewno jest - bascom, avr i wiedza potrafią zrobić praktycznie wszystko...

    Czy ktoś mi pomoże w takim prostym projekcie?

    Wcześniej ten temat już tu był, ale uznano, ze to "roszczenie" więc zamieszczam wynik moich prac - tak jak pisałem jestem zupełnie początkujący i zielony w temacie dlatego to co mam zostało przetestowane w "ISIS" i działa, ale nie jest tak jak bym chciał dlatego proszę o pomoc w uzupełnieniu programu.

    Schemat:

    BASCOM, AVR, dioda RGB sterowana switchem...

    Program:

    Code:
    Config Portb = &B00000111
    
    Portb = &B00000000

    Config Portd = &B0000000
    Portd = &B1111111


    Do
    Debounce Pind.0 , 0 , Zwieksz , Sub
    Loop
    End

    Zwieksz:
    Incr Portb
    Return

    I teraz co się dzieje i czego brakuje:

    Po pierwsze - chce zastosować attiny13 a nie 2313 - zrobiłem to na 2313 bo moge osobno konfigurować porty B i D co jest dla mnie łatwiejsze - to "13-stki" muszę to przepisać tylko na porty B Smile

    Owszem dioda zmienia kolory, ale jest to zgodne z liczeniem binarnym w góre - i moje pytanie co trzeba by zmienić w programie, żeby zaświecanie się kolorów było takie jak ja bym chciał czyli w takiej kolejności:

    - czerwona + zielona + niebieska (tutaj akurat jest ok bo przy starcie zapalają się wszystkie)
    - czerwona
    - zielona
    - niebieska
    - czerwona + zielona
    - czerwona + niebieska
    - zielona + niebieska

    Jak zrealizować funkcję takie jak pisałem wyżej - przytrzymanie przycisku powyżej około 2 sek powoduje wygaszenie wszystkich diód natomiast podczas wygaszonych krótkie naciśniecie powoduje powrót do poprzedniego stanu?
  • Specjalista automatyka domowa
    Rozpisz sobie tabelkę np. taką jak poniżej:

    Code:
    BGR
    
    000
    110
    101
    011
    100
    010
    001

    lub
    RGB
    000
    011
    101
    110
    001
    010
    100

    Uważnie się przyjrzyj i jak dojdziesz do wniosku, że już wiesz o co chodzi to zacznij przesuwać bity.
    Co do wyłączenia układu po 2 sekundach to do wyboru : watchdog lub timer0.
    Co do Attiny13 to strasznie niewygodny układ dla Bascom'a zwłaszcza dla początkującego.
  • Poziom 25  
    Chodzi o to, ze 13-stka jest mala i by mi bardziej pasowała.
    Mimo tego, że nie umiem jeszcze programować to wydaje mi się ze to takie jakieś niezbyt fajne kiedy potrzebujesz tylko 3 wyjścia z procka a używasz układu który ma ich 14...dlatego chciałem zastosować attiny13, ale pojawia się problem bo nie mogę zastosować procedury zwiększania licznika na całym porcie B bo na tym porcie mam diode i switch...

    Co do tego co mi napisałeś to jest taka sprawa, że jak widzisz ja się nie bawiłem w przesuwanie bitów tylko zwiększanie licznika...przesuwać bitów jeszcze nie umiem...
    poza tym tabelka w takiej kolejności jak proponujesz nie będzie powodować zapalania się diód w takiej kolejności jakbym chciał...

    a jeśli chodzi o to wyłączanie układu to chodzi o to żebym mógł za pomocą klawisza zgasić lampkę - bardziej myślałem o tym żeby napisać procedurę, że jeśli switch wciśnięty 2sek lub dłużej wygaś lampki czyli ustaw 111 na pinach do których podłączone są diody
  • Specjalista automatyka domowa
    Cytat:
    Chodzi o to, ze 13-stka jest mala i by mi bardziej pasowała.
    Mimo tego, że nie umiem jeszcze programować to wydaje mi się ze to takie jakieś niezbyt fajne kiedy potrzebujesz tylko 3 wyjścia z procka a używasz układu który ma ich 14...dlatego chciałem zastosować attiny13, ale pojawia się problem bo nie mogę zastosować procedury zwiększania licznika na całym porcie B bo na tym porcie mam diode i switch...

    Tak attiny 13 jest mała i fajna. Problemem jest pisanie programu dla niej w Bascom zwłaszcza początkującemu. Spójrz w notę katalogową i zobacz co posiada ten układ, a czego nie ma.
    Zwiększanie licznika na porcie na którym jest wejście to nie problem.Po prostu trzeba program napisać tak by zwiększanie odbywało się do określonej liczby.
    Cytat:
    Co do tego co mi napisałeś to jest taka sprawa, że jak widzisz ja się nie bawiłem w przesuwanie bitów tylko zwiększanie licznika...przesuwać bitów jeszcze nie umiem...

    Więc trzeba zacząć się uczyć. W helpie Bascoma są opisane polecenia do tego służące . np shift, rotate itd.
    Cytat:
    poza tym tabelka w takiej kolejności jak proponujesz nie będzie powodować zapalania się diód w takiej kolejności jakbym chciał...

    jesteś pewien, że nie ?
    Code:
    BGR
    
    000 -  wszystkie
    110 -  czerwona
    101 -  zielona
    011 -  niebieska
    100 -  czerwona i zielona
    010 -  czerwona i niebieska
    001 -  zielona i niebieska

    lub
    RGB
    000 - wszystkie
    011 - czerwona
    101 - zielona
    110 - niebieska
    001 - czerwona i zielona
    010 - czerwona i niebieska
    100 - zielona i niebieska


    Cytat:
    a jeśli chodzi o to wyłączanie układu to chodzi o to żebym mógł za pomocą klawisza zgasić lampkę - bardziej myślałem o tym żeby napisać procedurę, że jeśli switch wciśnięty 2sek lub dłużej wygaś lampki czyli ustaw 111 na pinach do których podłączone są diody

    No tak, by napisać coś takiego trzeba coś zliczać, bo niby skąd ma program wiedzieć, że trzymasz ten przycisk 2 sekundy ?
  • Poziom 25  
    z tabelka to dowaliłem ... przepraszam...zapędziłem się odpowiedzią...

    Bardzo dziękuję, że jestes taki pomocny. Napisałem też do Ciebie PW.

    Przeanalizuję to wszystko dzisiaj i zobaczę co mi wyjdzie, nie mogę nigdzie znaleść przykładu procedury przesuwania bitów na 3 pinach - znalazłem tylko przesuwanie na całym porcie

    co do tabelki to widzę prawidłowość, że najpierw muszę przesuwać "0" w 3 krokach na w następnych 3 wystarczy przesuwać "1" i po kłopocie - ale czy ja do tego sam dojdę to nie wiem :)
  • Poziom 25  
    jak w ogole chce dodac jeszcze tranzystory sterujace diodami - ten schemat jest tylko taki "prowizoryczny" bo program do symulacji ktorego uzywam czyli Proteus nie potrzebuje az takich wymagan jak rezystory czy tranzystory.

    Ja wiem, ze satysfakcja bedzie wielka, ale nie wiem czy do tego dojde... lepiej zrobic to z kims, zapamietac i pozniej opierac sie na konkretnym projekcie w momencie kiedy bede budowal cos wiecej...

    xury - czy moge liczyc na Twoja pomoc w takiej formie jak pisalem na PW?

    a co do funkcji wykrywania czy klawisz jest wciśnięty dłużej niz 2 sekundy czy nie można zastosować takiej procedury jak np Pan M.Wiązania używał w swoich przykładach do eliminacji drgań styków tylko z wydłużonym czasem sprawdzania?
    Mam na myśli dokładnie ten kod:

    Code:
    If S1 = 0 then
    
           wait 25ms                        'tutaj wydłużony czas do 2 sekund
           if S1 = 0 then

              Do
              . . .