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

[atmega16] [c] RC5, Problem z if'ami i nie tylko

dOnMeNdOzA 27 Maj 2009 15:49 1515 14
REKLAMA
  • #1 6581439
    dOnMeNdOzA
    Poziom 10  
    Witam!
    Znalazłem program do odbioru kodu w standardzie RC5 (załączony do postu). Chciałem zaadaptować program do swojego projektu. Kod który aktualnie jest nadawany z pilota, jest przechowywany w zmiennej globalnej "kod". Poniżej kilka lini programu który napisałem:
    	if(bit_is_set(PIND,0))
    		{
    			kod_plus = kod;
    			PORTA = ~(kod_plus & 0x3f);
    		}
    		else
    		{
    			if(bit_is_set(PIND,1))
    			{
    			kod_minus = kod;
    			PORTA = ~(kod_minus & 0x3f);
    			}
    		}
    		if(kod_plus == kod) PORTC = 0b00000001;
    			else
    			{
    			if(kod_minus == kod) PORTC = 0b00000010;
    			else
    			{
    			PORTC = 0b00000000;
    			}
    			}

    Oznacza to (wg mnie), że jeżeli nie podam stanu wysokiego na piny PD0 oraz PD1, to stan portu A nie powinien się zmienić, obojętnie co nacisnę na pilocie. Niestety tak się nie dzieje :cry: Stan portu zmienia się za każdym razem. Próbowałem tez odwrotnie podłączać przyciski (zamiast "bit_is_set" używałem "bit_is_clear"). Nic to nie dało. Zauważyłem jednak, że program działa w momencie, gdy np. używam "bit_is_clear" (przycisk powinien byc podłączony do masy), ale podłączam przycisk do "plusa". Po wciśnięciu przycisku program działa prawidłowo i zmiana kodu z pilota nie zmienia stanu portu A. Niestety nie udało mi sie zrobić tak, aby w momencie gdy żaden przycisk nie jest wciśnięty stan portu się nie zmieniał. Proszę o pomoc. Z góry, bardzo dziękuję. Pozdrawiam.

    Ps. Czy wiecie może jak to zrobić, żeby kod działał tylko w momencie, gdy trzymam przycisk na pilocie? W sensie, że jak puszczę przycisk, żeby się kod zerował.
  • REKLAMA
  • Pomocny post
    #2 6590015
    wilk125
    Poziom 23  
    podlacz przysiski do masy, tak zeby po nacisnieciu przycisku portu byl zwierany z masą. Ustaw rejestry portów jako wejscia podciagniete do zasilania.napisz program ktory bedzie reagował na niski stan czyli wcisniecie przycisku, czyli wtedy powino dzialac "bit_is_clear"
  • #3 6599610
    dOnMeNdOzA
    Poziom 10  
    Dziękuję bardzo za tą radę. Rzeczywiście, w ten sposób, wszystko działa jak należy. Poprawiłem nieco program (dodany w załączniku). Teraz zostaje tylko jedno pytanie. Czy ktoś wie, jak przerobić program, żeby działał tylko w momencie trzymania przycisku na pilocie?

    Pojawił mi się też dodatkowy problem. Kiedy podłączam sterownik silnika L293DNE (do wyjść PC0 oraz PC1 ), procesor chwilę działa po czym się zawiesza i nie reaguje na żaden przycisk. Po odłączeniu zasilania sterownika wszystko wraca do normy, ale w taki sposób nie mogę sterować silnikiem :cry: Czy ktoś wie, czym to może być spowodowane? Z góry dziękuję za odpowiedź.
  • REKLAMA
  • #4 6601704
    wilk125
    Poziom 23  
    1.Wstaw takie liniki w program

    if(bit_is_set(PIND,0))
    {
    tu wpisz kod zerujacy
    }


    if(bit_is_set(PIND,1))
    {
    tu wpisz kod zerujacy
    }

    2. Podeslij schemat ukladu z podlaczeniem sterownika
  • #5 6602083
    dOnMeNdOzA
    Poziom 10  
    Byćmoże za mało wytłumaczyłem jak działa program. Otóż, wejścia PD0 oraz PD1, to przyciski za pomocą których uczę procesor, który kod oznacza "plus" a który "minus", aby odpowiednio sterować kierunkiem obrotu silnika w lewo lub w prawo. Mi chodzi o to aby kod był zerowany w momencie jak puszczę przycisk na pilocie. Załączam schemat całego układu:
    [atmega16] [c] RC5, Problem z if'ami i nie tylko
    Układ łączę na płytce stykowej. Czy to, że napięcie zasilania sterownika biorę z jednej szyny wraz z procesorem, może być przyczyną problemu? Szczerze mówiąc, nie sądzę, ale mogę się mylić :D Dzięki za pomoc.
  • REKLAMA
  • #6 6602148
    wilk125
    Poziom 23  
    Brakuje Ci miedzy VCC i GND Atmegi kondensatora 100nF (jako chwilowwe zrodło napiecia), waazne zeby kondensator byl mozliwie bliso tych dwóch pinów, takze barkuje ci kondensatorów przed i za ukladem 7805. Po zastosowaniu kondensatorów problem powinien zniknać, pod warunkiem ze silnik nie ciagnie zbyt duzo pradu, nie wiem jakie jest zródło VCC , napisz cojest zrdółem VCC i jakie jest napiecie?
  • #7 6602340
    dOnMeNdOzA
    Poziom 10  
    Mam zasilacz na którym mogę ustawiać napięcia, odpowiednio: 3; 4,5; 6; 7,5; 9 oraz 12 V. Prąd - 1000mA. Korzystam z napięcia 6V, bo 4,5V to chyba za mało. Zapodam te kondensatory i zobacze jak będzie. A jakie te kondensatory do stabilizatora? Też 100nF? Pozdrawiam.
  • REKLAMA
  • #8 6602493
    dawid512
    Poziom 32  
    Zaraz zaraz podajesz 6V na stabilizator?
  • #9 6602598
    dOnMeNdOzA
    Poziom 10  
    Dokładnie. Czy powinienem zastosować jakiś rezystor?
  • #10 6602647
    dawid512
    Poziom 32  
    O ile się nie mylę to min. napięcie które trzeba podać na wejście stabilizatora 7805 to 7V.
  • #11 6602672
    dOnMeNdOzA
    Poziom 10  
    Aha, czyli powinienem podać nawet większe napięcie niż podaję? A nie zagrzeje mi się stabilizator, albo nie wiem co jeszcze?
  • #12 6602694
    dawid512
    Poziom 32  
    Minimum to 7V a max. patrz datasheet ale spokojnie 9V czy 12V możesz podać :)
  • Pomocny post
    #13 6603113
    wilk125
    Poziom 23  
    tu masz schemat z kondensatorami
    [atmega16] [c] RC5, Problem z if'ami i nie tylko
  • #14 6603705
    dOnMeNdOzA
    Poziom 10  
    Podłączyłem kondensatory i wszystko śmiga jak trzeba. Dziekuję za dobrą radę. Teraz tylko pozostaje kwestia, jak kasować kod po puszczeniu przycisku na pilocie...
  • #15 6605853
    wilk125
    Poziom 23  
    tak jak pisałem, jak bit jest set czyli 1 to wpisz odpowiedni kod kasujacy
REKLAMA