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

AVR - przerwania wywołane czujnikiem optycznym (ATmega16)

reymysterio7 12 Lis 2011 12:03 2915 21
REKLAMA
  • #1 10129411
    reymysterio7
    Poziom 10  
    Witam, jestem początkujący w programowaniu AVR więc proszę o wyrozumiałość.
    Mój problem polega na tym, że próbuje wywołać przerwanie (INT0) przez przecięcie wiązki światło w czujniku optycznym, pochodzącym z drukarki. W procedurze przerwania ma być umieszczona sekwencja migania diodami LED. Napisałem krótki kod aby sprawdzić czy skonfigurowanie przerwanie działa poprawnie... Niestety przecięcie wiązki światła nie powoduje skoku do procedury przerwania. W czym problem?

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    
    ISR(INT0_vect)
    {
    	PORTA |= (1<<PORTA4);
    	_delay_ms(500);
    	PORTA &= ~(1<<PORTA4);
    }
    
    
    int main(void)
    {
    	DDRA=0xff;
    	DDRD &= ~(1<<PORTD2);
    	PORTD &= ~(1<<PORTD2);
    	MCUCR = (MCUCR & (~(3<<ISC00))) | (1<<ISC00);
    	GICR |= (1<<INT0);
    	sei();
        while(1)
        {
            PORTA |= (1<<PORTA1);
    		_delay_ms(500);
    		PORTA &= ~(1<<PORTA1);
    		_delay_ms(500);
        }
    	
    	
    }
  • REKLAMA
  • #2 10129437
    dondu
    Moderator na urlopie...
    Dlaczego olewasz warrningi? Jak sądzę masz co najmniej jeden dot. linii:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co ma zrobić?:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wiem, że to tylko test, ale czekanie w przerwaniu to samozagłada.
  • #3 10129464
    reymysterio7
    Poziom 10  
    Nie ma żadnych warrningów. Kod normalnie się kompiluje i delay działa poprawnie.
    MCUCR = (MCUCR & (~(3<<ISC00))) | (1<<ISC00);

    Przyznam że znalazłem to w jakimś tutorialu dotyczącym przerwań. Jest to ustawienie aby przerwanie było wywoływanie na obu zboczach.
  • REKLAMA
  • #4 10129480
    dondu
    Moderator na urlopie...
    reymysterio7 napisał:
    Nie ma żadnych warrningów. Kod normalnie się kompiluje i delay działa poprawnie.

    Ciekawe, bo u mnie jest:

    Cytat:
    Build started 12.11.2011 at 12:13:32
    avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_22.o -MF dep/Proba_22.o.d -c ../Proba_22.c
    In file included from ../Proba_22.c:3:
    c:/winavr-20100110/lib/gcc/../../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."

    avr-gcc -mmcu=atmega16 -Wl,-Map=Proba_22.map Proba_22.o -o Proba_22.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature Proba_22.elf Proba_22.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex Proba_22.elf Proba_22.eep || exit 0
    avr-objdump -h -S Proba_22.elf > Proba_22.lss

    AVR Memory Usage
    ----------------
    Device: atmega16

    Program: 240 bytes (1.5% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Build succeeded with 1 Warnings...



    reymysterio7 napisał:
    Przyznam że znalazłem to w jakimś tutorialu dotyczącym przerwań. Jest to ustawienie aby przerwanie było wywoływanie na obu zboczach.

    Zamiast tego zaglądnij do datasheet i rejestru MCUCR i naucz się jak to zrobić prawidłowo i przejrzyście. Ustawianie w ciemno na podstawie znalezionej w sieci informacji nie wróży dobrze.
  • REKLAMA
  • #5 10129496
    reymysterio7
    Poziom 10  
    Może jednak podpowiesz jak to ustawić żeby działało poprawnie? Nawet jeśli ustawie wszystko dobrze to nie będę miał pewności czy tak właśnie jest ponieważ nie jestem pewny czy czujnik działa(wyciągnięty z niedziałającej drukarki).
  • #6 10129520
    dondu
    Moderator na urlopie...
    Zobacz tabelkę 35
    bity ISC01 oraz IISC00 ustawiają tryb reakcji INT0

    Zamiast PORTD2 używaj krótszego PD2 - inne także popraw (czytelniejszy kod).

    Spróbuj poprawić program samemu, nie olewaj warningów i wklej nową wersję do sprawdzenia.

    Czujniki nie psują się tak łatwo - ale możesz pokazać schemat Twojego projektu (całego).
  • #7 10129535
    reymysterio7
    Poziom 10  
    Aby przerwanie zadziałało mam ustawić wykrywanie na niski poziom, dowolną zmianę stanu czy któreś ze zboczy?
  • #9 10129596
    reymysterio7
    Poziom 10  
    Podczerwień używana będzie do czegoś innego. W tym wypadku chodzi o wyświetlacz widmowy... Czujnik optyczny ma wyznaczać początek wyświetlania obrazu, wiązka światła przecinana będzie wiele razy w ciągu sekundy. Po przecięciu ma nastąpić skok do procedury przerwania i wyświetlenie obrazu za pomocą diod.
  • #11 10129979
    janbernat
    Poziom 38  
    Zamiast niesprawdzonego czujnika optycznego zastosuj jakiś inny sygnał- bo nie będziesz wiedział czy Ci przerwanie nie działa czy czujnik jest zepsuty.
  • #12 10130011
    krru
    Poziom 33  
    Przede wszystkim sprawdz woltomierzem jakie napięcia są na tym transoptorze w obu stanach (swiatło zasłonięte i niezasłonięte). Jaki prąd płynie przez LEDa?
  • #13 10132773
    reymysterio7
    Poziom 10  
    Przez LEDa płynie 10 mA.
  • #14 10133209
    janbernat
    Poziom 38  
    A co się dzieje na wyjściu?
    Zwykle jest to tranzystor który powinien być jakoś zasilany.
    Czasami w kolektor tranzystora jest wstawiany opornik- ale to rzadko- zwykle traeba dać zewnętrzny.
    Możesz to sprawdzić omomierzem.
  • #15 10133494
    reymysterio7
    Poziom 10  
    Jeśli chodzi o elektronikę to niestety jestem w tym temacie całkowicie zielony i mogłem coś spaprać. Znalazłem drugi czujnik optyczny, wygląda on tak:
    AVR - przerwania wywołane czujnikiem optycznym (ATmega16)

    Czy mógłby mi ktoś powiedzieć jakie napięcie i natężenie ma płynąć do czujnika,
    która część na zdjęciu to nadajnik a która odbiornik, jakie parametry powinny być na wyjściu oraz jak to przylutować zgodnie ze schematem poniżej?

    AVR - przerwania wywołane czujnikiem optycznym (ATmega16)
  • REKLAMA
  • #16 10133577
    janbernat
    Poziom 38  
    No to chyba naprawdę jesteś zielony.
    To są zupełnie inne czujniki.
    Ten na zdjęciu- transoptor szczelinowy- jest na nim jakiś symbol- poszukaj w sieci i podaj link do typu.
    A to na schemacie to jest odbiornik podczerwieni- zupełnie co innego.
    Cechą wspólną jest to że oba są z plastiku i krzemu z niewielkimi dodatkami innych pierwiastków.
  • #18 10133726
    janbernat
    Poziom 38  
    No ale pdf-a tam nie ma- spróbuj znaleźć.
    Jak nie to trzeba mierzyć omomierzem i może da się dojść jakie są wyprowadzenia.
  • #19 10133811
    reymysterio7
    Poziom 10  
    Tam gdzie jest E omomierz nic nie wskazuje. Przy S mam około 31-32 kom.
  • #20 10133858
    Brutus_gsm
    Poziom 25  
    Początkujący kolega rzuca się na zbyt głęboką wodę i prędzej utonie, niż nauczy się pływać... Nie lepiej zacząć od czegoś prostego? Mówię poważnie, nawet mruganie diodami, bo trzeba zacząć od czegoś prostego i zrozumieć zasadę działania. Bo widze, że kolega chce wszystko na raz zrobić, nie mając pojęcia o żadnej z tych rzeczy.
  • #21 10133878
    reymysterio7
    Poziom 10  
    Mruganie diodami mam już za sobą... A to muszę i tak zrobić.
  • #22 10133897
    Brutus_gsm
    Poziom 25  
    To zacznij to robić po kolei, tak jak przystało. Bo uwierz mi, że wszystkiego na raz nie da się zrobić. Zacznij od czytania, czytania i jeszcze raz czytania.
REKLAMA