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] Prosty program w C (switch + zapalenie led)?

shel82 02 Sty 2010 20:55 4376 2
REKLAMA
  • #1 7474452
    shel82
    Poziom 18  
    Witam, dopiero zaczynam zabawę z AVR i potrafię dopiero napisać program zapalający diody LED, chciałbym teraz napisać program, który po naciśnięciu przycisku - switcha (zwarcie do masy) zapali diodę, ale mi to nie wychodzi, może ktoś z was posiada kawałek podobnego programu tak bym miał na czym się wzorować?

    A może ktoś pokusi się o przerobienie mojego programu:
    #include <avr\io.h>
    #include <avr\delay.h>
    int main(void)
    {	
    	/*Ustawienie wyjść*/
    	DDRD=0x7c;
    	
    	for(;;)
    	{	
    		/*Wyłączenie diod*/
    		PORTD=0x7c;
    		_delay_loop_2(0xffff);
    		/*Włączenie diod*/
    		PORTD=0;
    		_delay_loop_2(0xffff);
    	}
    	return 0;
    }

    z góry dzięki.

    Zanim napiszesz, przeczytaj: https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]
  • REKLAMA
  • #2 7474503
    Estarriol
    Poziom 15  
    Dobrze, że "przerobienie" napisałeś, bo myślałem że tan program nie działa.

    Ale może żeby tak gotowca nie dawać i zmotywować do pracy i czytania - skorzystaj z wyjścia INT0 kontrolera(pamiętaj o rezystorze podciągającym), tam podepnij switcha. Następnie tak skonfiguruj przerwania zewnętrzne, aby było wywoływane przerwanie INT0 na przykład przy zmianie stanu logicznego na nóżce INT0. Następnie w obsłudze przerwania sprawdź jaki stan ma nóżka INT0 i odpowiednio zareaguj.

    Jako małą podpowiedź jednak, gdyż początkujący jesteś - fragment podobnego programu dla ATMEGA8:
    
    #include <avr/interrupt.h>
    
    (...)
    SIGNAL(SIG_INTERRUPT0){
     if(((PIND>>PD2)&1)==0){
      g(0);
     } else {
      g(1);
     }
    }
    
    (...)
    
    // przerwanie na INT0
    MCUCR|=(1<<ISC00);
    GICR|=1<<INT0;
    //
    
    
  • #3 7479296
    shel82
    Poziom 18  
    zumek napisał:
    Zanim napiszesz, przeczytaj: https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]


    Dzięki za poprawę nie wiedziałem jak to wstawić, a wystarczyło użyć znacznika "Code".


    Estarriol napisał:
    Dobrze, że "przerobienie" napisałeś,

    Nie wiem co masz na myśli pisząc przerobienie?, możesz to wyjaśnić, bo uczę się na przykładach z Google i nie znam bardziej fachowego języka, niestety :(

    Estarriol napisał:
    Jako małą podpowiedź jednak, gdyż początkujący jesteś - fragment podobnego programu dla ATMEGA8:

    Twoja podpowiedz, także za bardzo mi nie pomogła, ale znalazłem świetny program, który mnie oświecił:
    
    // Sterowanie diodą LED podłączoną do linii PD4 mikrokontorlera
    // za pomocą przycisku podłączonego do linii PD3 mikrokontrolera
    
    #include <avr/io.h>                        // dostęp do rejestrów
    
    int main( void )                        // program główny
    {
      sbi(DDRD,4);                                // użyj linii PD4 jako wyjścia
      sbi(PORTD,3);                                // "podciągnij" do logicznej 1 linię PD3
    
      while(1)                                // pętla nieskończona
      {
        cbi(PORTD,4);                        // zapal diodę LED podłączoną do linii PD4
        loop_until_bit_is_clear(PIND,3);        // czekaj na naciśnięcie przycisku na PD3 
        sbi(PORTD,4);                        // zgaś diodę LED podłączoną do linii PD4
        loop_until_bit_is_clear(PIND,3);        // czekaj na naciśnięcie przycisku na PD3 
      }
    }
    


    Problem w tym, że czytając dalej często pojawia się informacja o drganiach na przyciskach - jak to jest?
REKLAMA