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] Załączanie warunku stanem wysokim

Artemundo 28 Maj 2011 01:26 2010 19
REKLAMA
  • #1 9551666
    Artemundo
    Poziom 10  
    Witam. Od dłuższego czasu męczę się z wydawałoby się trywialnym problemem. Otóż muszę mieć możliwość wykrywania na atmedze stanu wysokiego w jak najprostszy sposób bez przerwań w celu odpalenia pętli w programie. Posiadam przycisk, którym łączę pin z VCC. Próbowałem już wszystkie możliwe konfiguracje rejestrów DDRx oraz PORTx, ale za każdym razem moja pętla startuje zaraz po zasileniu procka, niezależnie od tego co podam na pin, a na przycisk w ogóle nie reaguje (na 100% jest sprawny). Ogólnie używam takiego warunku na wykrycie stanu wysokiego

    if(PIND & 0x01)
        startuj();
    


    Chcę po prostu, żeby funkcja się nie załączała od razu po włączeniu procka, tylko po np. zwarciu drutem pina 0 na porcie D z VCC. Macie może jakieś sugestie co do tego problemu?
    Z góry dzięki
  • REKLAMA
  • #3 9551676
    Artemundo
    Poziom 10  
    Ale właśnie chodzi o to, że ja muszę koniecznie mieć załączanie stanem wysokim, gdyż wykorzystuję to, do komunikowania się z drugą atmegą. Twój sposób działa u mnie bez problemów, no ale niestety w moim przypadku jest bezużyteczny. Cały pic polega na tym, że jedna atmega z portem ustawionym na wejście musi wykrywać stany wysokie ustawione na drugiej atmedze z portem jako wyjście i przy true załączać funkcję. Znajdą się jakieś inne pomysły?
  • #4 9551679
    dondu
    Moderator na urlopie...
    Pokaż schemat, bo najpierw piszesz o zwieraniu przyciskiem, później o zwieraniu drutem, a teraz o tym, że sygnał podaje inna Atmega.

    Wszystko się da, ale jeżeli mam Ciebie ciągnąć za język by się domyślać jak wygląda układ to na to nie licz. Schemat choćby na kartce.

    I pokaż program.
  • REKLAMA
  • #5 9551686
    Artemundo
    Poziom 10  
    No więc tak. Posiadam dwa moduły w osobnych obudowach, a w każdym jest ATmega. Są one połączone bezpośrednio przewodami na portach PC0, PC1, PC2 (w obu prockach wykorzystuję do tego PORTC). Po uruchomieniu zestawu moduł 1 ma PORTC ustawiony jako wyjście, a 2 jako wejście. 1 wysyła do 2 na krótko stan wysoki, który 2 rozpoznaje jako sygnał startu, a następnie PORTC w obu prockach ustawia się na odwrót, czyli w 1 jako wejście, a w 2 jako wyjście. Po tej zamianie moduł 2 steruje pierwszym na tych samych pinach i przewodach wysyłając stany wysokie. Całość urządzenia jest rezystancyjnym czujnikiem położenia sterowanym silnikiem krokowym, w którym moduł 1 jest sterownikiem silnika, a 2 modułem pomiarowym i przetwornikiem U/f.

    W pierwszym poście opisałem problem prościej, gdyż uważałem, że gdy będę wiedział jak ten problem rozwiązać na mikrostykach, to dalej już sobie poradzę. Poniżej umieszczam prosty schemacik.

    [atmega16][c] Załączanie warunku stanem wysokim

    Co do kodu to to jest fragment, którym chcę wystartować drugi moduł za pomocą pierwszego
    Moduł 1

    
    if(!(PIND & 0x40)) //wciśnięcie przycisków, to działa bez problemu
    		{
    			opcja=1;
    			PORTC=0x01; //sygnał startu na drugi moduł
    			_delay_ms(2000);
    			PORTC=0x00;
    			DDRC  = 0x00;		
    		}
    

    A tym kodem, chcę wykryć ten sygnał startu
    Moduł 2:
    if((PINC & 0x01)) //chcę wykryć sygnał startu z modułu 1, to nie działa, warunek wykonuje się od razu po włączeniu procka
    			{
    			opcja=1;
    			//PORTD = 0x01;
    			//_delay_ms(200);
    			
    			//DDRC = 0xff;
    			//PORTC = 0x00;//teraz PORTC jest wyjsciem
    			}
    


    No ale niestety tak jak mówiłem po odpaleniu urządzenia funkcja uruchamiana zmienną opcja w dalszej części programu uruchamia się od razu. Siedzę nad tym cholerstwem już drugi dzień i mnie szlag trafia.
  • REKLAMA
  • #6 9551691
    dondu
    Moderator na urlopie...
    Następnym razem zacznij od razu od takiego opisu i schematu.
    Zanim o tym jak to rozwiązać, zapytam dlaczego nie chcesz wykorzystać przerwań lub np. SPI ?
    Masz zajęte, czy boisz się, że sobie nie poradzisz? To jest proste rozwiązanie Twojego problemu.
  • REKLAMA
  • #7 9551695
    Artemundo
    Poziom 10  
    No właśnie nie chcę dodatkowo komplikować tego programu oraz czas mnie nagli z tym projektem, poza tym wiem, że ta idea jest na tyle prosta, że powinna w ten sposób działać. No i problem wysłania sygnału startu oraz sygnałów góra/dół do silnika jest na tyle trywialny, że uważam że nie warto implementować czegoś zupełnie nowego. Poza tym to urządzenie jest już wystarczająco skomplikowane w innych miejscach (zwłaszcza częściach mechanicznych)
  • Pomocny post
    #8 9551697
    dondu
    Moderator na urlopie...
    Kiedy użycie przerwania jest właśnie łatwiejsze.
    Ale ok - Twoja wola.

    Pokazujesz tylko mały fragmencik kodu. Skoro siedzisz nad tak, prostą rzeczą już drugi dzień to znaczy że być może Twój problem leży w zupełnie innym miejscu programu. Dlatego pokaż cały program.


    I jeszcze drobna uwaga: Mam nadzieję, że schemat połączeń i minimalnych wymagań co do pinów i zasilania masz spełnione.
  • Pomocny post
    #9 9551699
    GSM
    Poziom 25  
    Witam,

    użycie SPI zajęłoby tyle miejsca co wklejone przez ciebie fragmenty kodu, a domyślam się, że masz tam takiego "czegoś" więcej...
    Poza tym byłoby szybsze, bardziej eleganckie, pewniejsze, i wiele wiele innych...

    Pozdrawiam,
    GSM
  • #11 9551710
    Artemundo
    Poziom 10  
    Zdaję sobię sprawę z tego, że mój sposób komunikacji między prockami może być "nieco" toporny, ale do tego zastosowania jest w zupełności wystarczający. Ale również jestem otwarty na wszelkie rady, więc jeśli ktoś nie ma pomysłu, co do wykrywania stanu wysokiego, a potrafiłby pomóc z SPI, to też chętnie przeczytam, jednak nie ukrywam, że zależy mi na "moim" sposobie (głównie z powodu chęci uniknięcia zmian na płytce, która już jest gotowa).
  • #12 9551799
    Fredy
    Poziom 27  
    A czy wyłączyłeś JTAGA w fusebitach ?
    Te linie są zajęte i nic na nich nie uzyskasz jak go nie wyłączysz.
  • #13 9551946
    Artemundo
    Poziom 10  
    Tak tak, JTAG jest na 100% wyłączony, zresztą na innych portach również próbowałem
  • #14 9551996
    Fredy
    Poziom 27  
    A dałeś rezystory na wejściach do masy tzw Pul down?
  • #15 9552022
    Artemundo
    Poziom 10  
    Sprzętowo ich nie przylutowywałem, da się je aktywować programowo jak pull-upy?
  • Pomocny post
    #16 9552030
    Fredy
    Poziom 27  
    Nie da się.
    Masz przy pomocy rejestru PORT możliwość albo Pull up albo wejście bez podciągnięcia. Innej możliwości nie ma. Właśnie dlatego taka obsługa switchów jest tak rzadko stosowana.

    Zmierz napięcie na wejściach. Powinny mieć wartość w pobliżu 0V. Dopiero po naciśnięciu switcha ma rosnąć do 5V.
    Podłącz rezystory np 1K do masy i zobaczysz czy to pomaga.
  • #17 9552126
    Artemundo
    Poziom 10  
    Tak, działa :D To jest dokładnie to, o co mi chodziło :D Dałem 2k pomiędzy PC0, a masę i do PC0 również mikrostyk połączony z VCC i guziczek pięknie wywołuje pętlę. Port C przy tym jest skonfigurowany jako wejście i działa to zarówno z programowymi pull-upami, jak i bez. Dzięki Fredy, jestem naprawdę wdzięczny :D Dla wszystkich lecą pomogły, a dla Fredy'ego 20 pkt ;)
  • #18 9552205
    dondu
    Moderator na urlopie...
    To ja Ci daję 20pkt żebyś miał na posty bo ledwo 3 pkt Ci zostały, a ty płacisz Fredy 20 pkt :D
    Fredy nie oczekuje od Ciebie zapłaty tylko co najwyżej wciśnięcia przycisku POMÓGŁ.

    No ale ja także tak zrobiłem na samym początku mojego pobytu na Elektrodzie :)
  • #19 9552219
    Artemundo
    Poziom 10  
    Od maleńkości byłem rozrzutny ;D
REKLAMA