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

[atmega8][C]ignorowanie sygnału wejścia po ustalonym czasie

yogu$ 06 Gru 2010 20:59 990 1
REKLAMA
  • #1 8835217
    yogu$
    Poziom 9  
    Witam
    Problem zapewne dla wielu z Was banalny. Pracuję nad projektem, który wymaga bardzo krótkich czasów sygnałów, rzędu kilkudziesięciu ms. Opracowałem program, który co prawda poprawnie wysyła impuls, jednak jest on "bezpieczny" tylko dla długich czasów sygnałów. W moim przypadku istnieje duże ryzyko, że guzik zostanie przyciśnięty dłużej i urządzenie się wykrzaczy, bo sygnał był wysyłany za długo. Podsumowując: sygnał na wyjściu ma być zawsze taki sam, rzędu kilkudziesięciu milisekund, nie ważne jak długo będzie się wciskać guzik. Po puszczeniu guzika i jego ponownym wciśnięciu cykl ma zacząć się od nowa.
    Zaznaczam, że jestem (mocno) początkującym w dziedzinie AVR i programowaniu ogólnie, dlatego też może po prostu istnieć jakaś funkcja, której wykorzystanie rozwiąże mój problem w dwie linijki, a ja o niej nie wiem.
    Moich bazgrołów nie ma sensu tu zamieszczać, więc dam jedynie szkielet (działający) mojego programu który chciałbym rozbudować z Waszą pomocą.

    #include <avr/io.h>
    #include <util/delay.h>
    
    #define F_CPU 1000000
    
    int main(void)
    {
    	DDRB = 0; // guzik - wejscie
    	DDRC = 0xFF; // dioda - wyjscie
    
    	PORTB |= _BV(0);  
    	PORTC |= _BV(0);  // dioda zgaszona
    	for(;;)
    		{
    			if(bit_is_clear(PINB, 0))
    				{
    					PORTC &= ~(_BV(0));   //  dioda zapalona
    					_delay_ms(2500);
    					PORTC |= _BV(0);  // dioda zgaszona
    				}
    		}
    return 0;
    }
    
  • REKLAMA
  • #2 8835264
    tmf
    VIP Zasłużony dla elektroda
    2500ms to 2,5s :) Two sposób jest prawie poprawny, po pierwsze musisz zrobić debouncing. Nie piszę jak bo sposbów jest wiele, a google znają je wszystkie. Po drugie, jak już zrobić debouncing, to musisz zapamiętać poprzedni stan przycisku, tak, żeby wywoływać impuls tylko np. przy wciśnięciu przycisku, a nie przy jego stałym wciskaniu. Poza tym jeśli ten impulst wyjściowy musi być w miarę stabilny, a ty chcesz korzystać z przerwań to zamiast _delay_ms wykorzystaj sprzęt - timery i np. pin OCx albo UART. Do generowania impusów jest doskonały, szczególnie jeśli mają one być bardziej skomplikowane.
    A swoją drogą, jeśli interesuje cię wygenerowanie stałego impuslu po naciśnięciu przycisku, to nie prościej zastosować monowibrator monostabilny? Np. 74xx121? Zadziała od razu i bez jednej linii kodu.
REKLAMA