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

ATmega128[C] Problem z przerwaniem INT6

rever_c 09 Sie 2010 13:36 1404 16
REKLAMA
  • #1 8380391
    rever_c
    Poziom 10  
    Witam,

    Mam dziwny problem z przerwaniem zewnętrznym INT6 w mojej atmedze128. Napisałem taki oto banalny programik.
    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h> 
    #include <avr/interrupt.h> 
    #include <stdint.h> 
    
    ISR(INT6_vect)
    {
    		PORTC = 0x01;
    }
    
    main()
    {
    	DDRC = 0x01;
    	EIMSK |= _BV(INT6);
    	EICRB |= _BV(ISC60); // dowolna zmiana poziomu
    //	EICRB |= _BV(ISC61);
    	sei();
    	while(1)
    	{}
    }
    		

    Według mnie ten program powinien działać tak, ze po pierwszej zmianie poziomu na INT6 dioda (PORTC0) będzie się palić zawsze. U mnie wygląda to w ten sposób, że na zboczu narastającym dioda się zapala a opadającym gaśnie. W programie zmieniałem też rejestr EICRB. Po ustawieniu na wyzwalanie zboczem narastającym układ zachowuje się jak powyżej. Przy wyzwalaniu zboczem opadającym dioda się nie zapala. W nocie katalogowej napisano, że to przerwanie wymaga obecności I/O clock ( przerwanie synchroniczne). Mój wewnętrzny kwarc to 1MHz. Układ wejściowy przedstawia rysunek
    [img]ATmega128[C] Problem z przerwaniem INT6[/img]

    R2 ma wartość 1k zamiast 10k oraz układ jest podłączony tylko do port INT.
    Czy może być tak, że ten zegar jest za wolny aby wychwycić moment zmiany zbocza ?
    Z góry dziękuje za pomoc.
  • REKLAMA
  • #2 8380421
    _Robak_
    Poziom 33  
    Po co Ci 2 tranzystory od strony procesora? Zrób to tylko na jednym. Jak nie wydaja prądowo transoptor to bazę drugiego steruj kolektorem a nie emiterem.
  • #3 8380479
    rever_c
    Poziom 10  
    No można by tak zrobić. Szkoda tylko że już nie mogę tego zmienić. Ale czy to by pomogło przy tym problemie z przerwaniem? Jak wykorzystałem ten port jak zwykłe wejście wszystko działało, więc ten 1 wolt w stanie niskim nie powinien przeszkadzać.
  • REKLAMA
  • #4 8380607
    Konto nie istnieje
    Konto nie istnieje  
  • #5 8380642
    rever_c
    Poziom 10  
    Cytat:
    Pomogło a nawet byłoby wymagane bo to transoptor a nie optotriak i nic go nie podtrzyma w momencie gdy puścimy S1.


    Wybacz ale nie rozumiem. Ten układ wg. mnie działa tak: naciskamy S1, fototranzystor zaczyna przewodzić, port uC przyjmuje poziom niski( to nieszczęsne 0.9V), puszczamy S1 fototranzystor przestaje przewodzić, port jest podciągnięty do VCC, poziom wysoki. Zmiana zboczy powinna być zauważalna dla układu przerwań atmegi. Powtarzam, że układ działa w przypadku normalnego wejścia.
  • REKLAMA
  • #6 8380715
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #7 8380721
    rever_c
    Poziom 10  
    Cytat:
    Jako normalne wejście działa ale na czas naciśnięcia s1 ?


    Tak.
  • #8 8380784
    Konto nie istnieje
    Konto nie istnieje  
  • #9 8380807
    rever_c
    Poziom 10  
    Oj.. nie zrozumieliśmy się chyba. Dioda na schemacie sterowana Q1 oczywiście będzie świecić tylko wtedy gdy S1 jest naciśnięty. W opisie kodu napisałem że w obsłudze przerwania przypisywana jest wartość 0x01 do rejestru PORTC. I I właśnie do PORTC0 podłączona jest ta dioda(nie obecna na schemacie), która mnie interesuje.
  • #10 8380827
    Konto nie istnieje
    Konto nie istnieje  
  • #11 8380841
    rever_c
    Poziom 10  
    No wiesz, w pierwszym poście napisałem że dioda mnie interesująca jest podłączona do PORTC0. Dodatkowo w kodzie jak wół jest napisane PORTC0. I nie wiem jak przerwanie z mikrokontrolera mogłoby mieć wpływ na diodę którą on nawet nie steruje.
  • #12 8380858
    Konto nie istnieje
    Konto nie istnieje  
  • #13 8380870
    rever_c
    Poziom 10  
    Nie, jak napisałem powyżej dioda jest podłączona do PORTC0, a układ wejściowy (ten na rysunku) jest podłączony do do wejścia PORTE6 (INT6). Czy ty nawet zajrzałeś do tego kodu ?
  • #14 8380893
    Konto nie istnieje
    Konto nie istnieje  
  • #15 8380899
    rever_c
    Poziom 10  
    No dobra... pod obrazkiem jest napisane, że układ wejściowy jest podłączony tylko do INT6(PORTE6).

    Dodano po 8 [minuty]:

    Domyślnie ten port jest ustawiony jako wejście. DDRE6 i PORTE6 są zerami. Próbowałem to nawet na chama przypisać i tak nie pomogło.
  • #16 8380935
    tadzik85
    Poziom 38  
    Po tej dyskusji wynika jasno schemat zły. POPRAW. Witać to 0,9V o ktorym wspomniałeś jest za dużo.
  • #17 8380964
    rever_c
    Poziom 10  
    To w takim razie wykorzystanie tego układu do zwykłego wejścia też nie powinno działać. Mi za to elegancko śmiga. W nocie katalogowej napisali, że max poziom napięcia wykrywany jako sygnał niski wynosi 0.2 Vcc. W moim przypadku to 1V , na wejściu mierzy mi niecałe 0.9 więc niby jest ok. Poza tym przerwanie asynchroniczne wyzwalane niskim poziomem działa normalnie.
REKLAMA