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

Atmega 32 i przerwanie INT1

grzegorz_w3 21 Maj 2011 21:08 2813 10
REKLAMA
  • #1 9530872
    grzegorz_w3
    Poziom 10  
    Witam,
    napisałem taki prosty programik do obsługi przerwania INT1 i coś nie chce działać. Pierwszy raz pisałem program z obsługą tego przerwanie i prosłbym o pomoc w znalezieniu błędu.

    Kod programu:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    
    int main(void){
    	DDRD &= ~(1<<PD2);
    	DDRC |= (1<<PC0);
    	PORTD |= (1<<PD2);
    	GICR |= (1<<INT0); //przerwanie INT0
    	MCUCR |= (1<<ISC01); //aktywne zboczem opadajacym
    	GIFR |= (1<<INTF0);
    	sei();
    }
    //obsługa klawiatury
    ISR(INT1_vect){
    	PORTC ^= (1<<PC0);
    	_delay_ms(300);
    	GIFR |= (1<<INTF0);
    }


    Z góry dziękuje za pomoc i pozdrawiam.
  • REKLAMA
  • #2 9530899
    tadzik85
    Poziom 38  
    dodaj pętle nieskończoną na końcu
  • #3 9530958
    Piotrek_P
    Poziom 18  
    Zdecyduj się może co do obsługi przerwań. Chodzi o INT1 jak w temacie, czy chodzi o INT0 jak w kodzie :?:

    Pozdrawiam
    Piotrek
  • REKLAMA
  • #4 9530971
    mirekk36
    Poziom 42  
    sterujesz pinem

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w przerwaniu, a gdzie masz ustawienie kierunku tego pinu ??? bo ja widzę, że tylko PD2 ustawiłeś jako wejście (chociaż to akurat możnaby pominąć bo po resecie i tak wszystkie piny są wejściami).... za to z PC0 zjadłeś ustawienie kierunku.

    Druga i niestety MASAKRA jaką robisz to _delay_ms() w przerwaniu. Wiem, że zaraz napiszesz, że tu może tylko do testów - no ale nawet do testów nie używa się funkcji opóźniających w przerwaniach

    Pozostałe rzeczy tzn BŁĘDY wskazali już koledzy wyżej.
  • #5 9531060
    Piotrek_P
    Poziom 18  
    Zadeklaruj sobie zmienną "flagę" (volatile) i ustawiaj ją w przerwaniu na 1 w procedurze obsługi przerwania. W pętli głównej sprawdzasz if'em stan tej flagi i wykonujesz jakieś działanie, a następnie
    ustawiasz "flagę" na 0 i tak w kółko. Jak napisał Mirek, w przerwaniach nie używamy żadnych "delay"(!).

    Pozdrawiam
    Piotrek
  • #6 9531195
    janbernat
    Poziom 38  
    W ogóle nie używamy _delay() -nie tylko w przerwaniach.
    Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
  • #7 9531557
    zumek
    Poziom 39  
    tadzik85 napisał:
    dodaj pętle nieskończoną na końcu
    ...i zmień nazwę wektora na INT0_vect.

    mirekk36 napisał:
    Druga i niestety MASAKRA jaką robisz to _delay_ms() w przerwaniu.
    Piotrek_P napisał:
    Jak napisał Mirek, w przerwaniach nie używamy żadnych "delay"(!)
    janbernat napisał:
    W ogóle nie używamy _delay() -nie tylko w przerwaniach.
    Czyżbyście cierpieli na jakąś manię prześladowczą :?:

    janbernat napisał:

    Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
    A co, jeśli źródłem przerwania jest np. przycisk generujący serię zboczy :?:


    PS
    No to sobie "nagrabiłem" :)
  • REKLAMA
  • #8 9531656
    mirekk36
    Poziom 42  
    zumek napisał:
    Czyżbyście cierpieli na jakąś manię prześladowczą :?:


    A dlaczego tak sądzisz?

    zumek napisał:
    janbernat napisał:

    Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
    A co, jeśli źródłem przerwania jest np. przycisk generujący serię zboczy :?:


    Jest milion dwieście tysięcy sposobów, żeby nawet w przerwaniu obsłużyć przycsk, który nawet wygeneruje serię zboczy i to bez stosowania jednego _delay_ms().

    Każdy z nich będzie lepszy niż ten w którym zastosujemy takie opóźnienia w przerwaniach.

    Owszem - można zastosować sobie opóźnienia w przerwaniach o ile już rzeczywiście program główny praktycznie nie jest istotny albo jest tylko nieksończoną pętlą, natomiast całość wykonuje się w przerwaniu. Tylko czy to jest dobra droga żeby początkujący nauczył się programować ???

    Dodano po 3 [minuty]:

    zumek napisał:

    PS
    No to sobie "nagrabiłem" :)


    Dlaczego sobie nagrabiłeś? każdy pisze programy jak chce, szczególnie tak zaawansowane osoby jak ty. Ale każdy też może mieć inną wizję jak nauczyć początkująych programować.

    Dlatego tutaj nie tylko ja ale i inne osoby zwracają słusznie uwagę (tak mi się wydaje), na to żeby unikać _delay'ów - po to tylko aby nauczyć się pisać funkcje w C w sposób nieblokujący i wykorzystać zalety programowania pseudo-wielowątkowego , które można wykorzystać w pętli głównej i nauczyć się może tego każdy.

    O to tu chodzi a nie o "manię prześladowczą"
  • #9 9531739
    Piotrek_P
    Poziom 18  
    janbernat: Nie przesadzajmy. W aplikacji w której czas nie ma dokładnego znaczenia stosuję "delay" bo konfigurowanie i uruchamianie któregoś z timerów żeby zaświecić led'a na ~ 0,5 sekundy to przerost formy nad potrzebą. Jak wcześniej pisałem, w przerwaniach nie używam opóźnień programowych.

    zumek Tu nie chodzi o manię prześladowczą tylko wydaje mi się o punkt widzenia. Ja ze swojej strony pomagam na tyle ile moja wiedza w temacie pozwala i z czym sam się niedawno zderzyłem.

    Pozdrawiam
    Piotrek
  • REKLAMA
  • #11 9531781
    grzegorz_w3
    Poziom 10  
    Już wszystko działa. Dziękuje wszystkim za pomoc. A tak poza tym to delay w przerwaniu wpisałem tylko dlatego, że myślałem że pomoże a w innych programach nie zamierzam używać delay w przerwaniach, a w programie głównym też zamiast delay stosuje funkcje do odczytu czasu i instrukcje if co daje o wiele lepszy efekt.
REKLAMA