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 przerwania sprzetowe c

Mateusz.K 25 Sie 2009 10:16 3151 9
REKLAMA
  • #1 6931674
    Mateusz.K
    Poziom 10  
    Witam.

    Czy byłby ktoś w stanie pomóc mi napisać prosty program, w którym wykorzystuje przerwanie zewnętrzne? Podłączyłem switch z jednej strony do Vcc (takie jest założenie daleszego rozwianięcia zadania) a z drugiej do Portu PD2. Proszę o pomoc oczywiscie z pisania w jezyku C. Może znajdzie się ktoś wyrozumiały, ponieważ większość stron, które przeglądałem na ten temat była niezrozumiała. Sam stworzyłem coś następującego:

    
    SIGNAL(SIG_INTERRUPT0) 
    { 
    	lcd_clrscr();
    	lcd_home();
    	lcd_string2("hello");
    }


    oraz wywołanie w funkcji main

    
    	MCUCR = (1<<ISC01)|(1<<ISC00);  // zbocze narastające  
    	GICR = (1<<INT0);               // włącz przerwania z INT0 
    	sei();                          // przerwania globalne włączone 
    


    Jak narazie nie działa a na wyświetlaczu pojawiają się krzaczki.
  • REKLAMA
  • #2 6931719
    _Robak_
    Poziom 33  
    Po pierwsze w przerwaniu nie wywoluj obslugi lcdka!!! W przerwaniu daj flage i w glownej petli zrob co masz do zrobienia.
  • REKLAMA
  • #3 6931760
    Mateusz.K
    Poziom 10  
    A jak to zrobić?
  • REKLAMA
  • #5 6933529
    Mateusz.K
    Poziom 10  
    Nie bardzo chce mi to działać dlaczego? Nic się nie dzieje zero reakcji. Warunek if ze sprawdzeniem flagi dodałem do pętli while(1).
  • #6 6933541
    Demoman
    Poziom 17  
    a volatile przy deklaracji flagi jest?
  • #7 6933632
    _Robak_
    Poziom 33  
    Dzialajacy kod na atmege32/16 wysyla po uarcie ilosc wcisniesc
    
    #include <avr/io.h>  
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    volatile uint8_t semaphore=0;
    volatile uint16_t count=0;
    
    ISR(INT0_vect)
    {
    
    	count++;
    	semaphore=1;
    
    }
    
    void uart_putchar(unsigned char c)
    {
      
      loop_until_bit_is_set(UCSRA,UDRE);
      UDR = c;
    
    }
    
    void uart_init(void)
    {
    	UCSRB=_BV(TXEN);
        UCSRC=_BV(UCSZ0)|_BV(UCSZ1)|_BV(URSEL);
        UBRRL=0x33;
    }
    
    
    void main (void)
    {	
    	uart_init();
    	DDRA=0x00;
    	PORTA=0xFF;	
    
    	DDRD=0x00;
    	PORTD=0xFF;
    
    	MCUCR=_BV(CS01);
    	GICR=_BV(INT0);
    
    	sei();
    
    	uart_putchar(0x55);
    	for(;;)
    	{
    		
    	
    		if(semaphore==1)
    		{
    			uart_putchar(count>>8);
    			uart_putchar(count);
    			semaphore=0;
    		
    		}
    		
    	}
    
    }
    
    
  • REKLAMA
  • #8 6941359
    Mateusz.K
    Poziom 10  
    A jak zrobić coś takiego? Chodzi o to, że podczas przerwania na int0 zapalić przykładowo dionę na porcie PC0. Prosze o wyrozumiałość jestem początkującym programista. Istnieje może jakaś prosta funkcja?


    Aha przypominam że switch z jednej strony podpięty do +5V a z drugiej do INT0
  • #9 6941425
    Mat_91
    Poziom 25  
    Ej no, dostałeś gotowca i dalej nie wiesz?

    Kolega _Robak_ w 5 poście od dołu dał Ci przykład z ustawianiem flagi, zrób dokładnie tak samo tylko tam gdzie masz "obsługa LCD" gaś lub zapal dioda:| to chyba nie jest skomplikowane?

    Warunkiem poprawnego działania tamtego przykładu jest dodanie "volatile" przy definicji zmiennej flaga.
  • #10 6941457
    szelus
    Poziom 34  
    Mateusz.K napisał:
    Aha przypominam że switch z jednej strony podpięty do +5V a z drugiej do INT0

    Bez rezystora? Jeżeli tak chcesz mieć ten switch podpięty, to musisz dodać co najmniej rezystor pull-down pomiędzy wejściem INT0 a masą. Np. z 10k. Inaczej, przy puszczonym przełączniku, nie będziesz miał pewnego stanu niskiego na wejściu.
REKLAMA