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

[Attiny13V][C] Kontaktron zwierny, INT0

elektronik12z 08 Gru 2009 12:47 3208 18
  • #1 7360969
    elektronik12z
    Poziom 13  
    Witam

    Posiadam kontaktron zwierny (bez pola magnetycznego rozwarty, po przysunięciu magnesu zwarty).

    Chciałem, aby przerwanie INT0 ustawić w tryb reagowania na zbocze opadające:


    
    ISR(INT0_vect)
    {
      //Stan niski
      //Zmień zapalanie diody
      PORTB^=_BV(3);
    }
    
    int main(void)
    {
    ...
    //DDRB 3-jako wy (dioda led z R-1k), reszta jako wejścia
    DDRB=_BV(3);
    //Ustaw PORTB na stan wysoki
    PORTB|=_BV(1);
     
    MCUCR|=_BV(ISC01);MCUCR&=~_BV(ISC00);
    GIFR = (1<<INTF0);
    GICR=_BV(INT0);
     while(1)
     {
    
     }
    }
    



    Schemat:

    [Attiny13V][C] Kontaktron zwierny, INT0

    Będzie to dobrze działać, czy powinno się tym wysterować inaczej.

    Pozdrawiam
  • #2 7361042
    wojtek_84
    Poziom 13  
    Nie będzie działać.
    Przy takim podłączeniu nie będziesz miał zbocza opadającego. Teraz nóżkę INT0 podciągasz pull-up-em do +5V. Po zwarciu kontaktronu dalej masz +5V. Czyli bez zmian, cały czas wysoki stan na INT0 niezależnie od stanu kontaktronu.

    Powinieneś podłączyć jedną nóżkę kontaktronu do INT0, a drugą do masy. Wtedy zwarcie kontaktronu ściągnie INT0 do masy i będzie zbocze opadające na które będziesz mógł zareagować.
  • #3 7361151
    elektronik12z
    Poziom 13  
    Witam

    W taki sposób (nie dorzucić jakiegoś rezystora szeregowo do kontaktronu)?

    [Attiny13V][C] Kontaktron zwierny, INT0

    Program jest ok?

    Pozdrawiam
  • #7 7363390
    elektronik12z
    Poziom 13  
    Witam

    Dałem sei(), ale fizycznie zaczęło działać jak przestawiłem przerwanie na zbocze rosnące. Działanie nie do końca jest poprawne bo wchodzi do obsługi przerwania INT0 zarówno po przyłożeniu magnesu do kontaktronu jak i odsunięciu, wolałbym aby tylko zadziałało po odsunięciu.

    Martwi mnie tez zużycie energii w stanie std 5mA, podczas wysyłania danych 30mA max.
    To przy bateryjce CR2032 (245mAh) to czas pracy układu to 49h, trochę mało. Będę musiał chyba włączać zasilanie nadajnika programowo poprzez tranzystor npn i rezystor, wtedy powinno spaśc do ok. 1mA w stanie std. i przestawić go w tryb sleep (muszę poczytać bo nigdy tego nie robiłem)

    Pozdrawiam
  • #8 7364743
    wojtek_84
    Poziom 13  
    elektronik12z napisał:

    Dałem sei(), ale fizycznie zaczęło działać jak przestawiłem przerwanie na zbocze rosnące. Działanie nie do końca jest poprawne bo wchodzi do obsługi przerwania INT0 zarówno po przyłożeniu magnesu do kontaktronu jak i odsunięciu, wolałbym aby tylko zadziałało po odsunięciu.


    Prawdopodobnie drganie styków wychodzi. Możesz spróbować zrobić tak że po wejściu do przerwania ustawiasz sobie jakąś flagę i wychodzisz z przerwania. Następnie w pętli głównej poczekasz sobie ok 10 - 30 ms i sprawdzisz czy na nóżce INT0 dalej jest stan wysoki. Jeżeli tak to znaczy że odsunięto magnes.

    Do usypiania procka jest biblioteka avr/sleep.h.
  • #9 7373429
    elektronik12z
    Poziom 13  
    Witam

    Jak powinno wyglądać przejście w tryb power-down dla Attiny13V?


    
    int main(void)
    {
     ...
     While(1)
     {
       
      ...
      //Przejdź w tryb power-down
      //Testowany tryb A||B||C
    
     }
    }


    A)
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_mode(); 


    B)
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();


    C)
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_cpu();  


    w przypadku A i C w AVRStudio po poleceniach sleep_mode oraz sleep_cpu śrokowisko się zatrzymuje i nie mogę zaznaczyć myszką zmiany stanu na INT0, a F11 nie działa.

    Przypadek B w ogóle nie działa, bo ciągle kręci się w while.

    Pozdrawiam

    Dodano po 5 [godziny] 17 [minuty]:

    Witam

    Taki kod przechodzi w AVRStudio:

    int main(void)
    {
    ...
    int Counter=0;
    ...
    
     while(1)
     {
    	asm("nop");
          _delay_ms(30);
    
    	Counter++;
    
          //Poczekaj 30 sek. i przejdź w  tryb power-down
          if (Counter>1000) {
    	    Counter=0;
                set_sleep_mode(SLEEP_MODE_PWR_DOWN);
                sleep_enable();
       
               sleep_cpu();
               sleep_disable();
          }
       
     }


    Jest on poprawny?
  • #10 7386687
    elektronik12z
    Poziom 13  
    Witam

    Podane wyżej wartości pochodziły od stabilizatora 7805, po podłączeniu do źródła 4,5V, mam 1,2mA, po przejściu w tryb IDLE 0,9mA, w tryb PowerDown 0,7mA.

    Niestety te 0,7mA pobiera układ nadajnika RF, a nie powinien włączyłem go jak na schemacie poniżej przez tranzystor npn BC547B:

    [Attiny13V][C] Kontaktron zwierny, INT0

    DDRB dla tego pinu PB4 jest =0
    PORTB dla tego pinu PB4 jest =0

    podłaczyłem pod GND +5V diodę i się nie świeci po poleceniu ustawienia pinu PB4 na 1 zapala się, po ustawieniu na 0 gaśnie więc nie powinno być poboru prądu przez nadajnik RF rzędu 0,7mA.

    Poza tym procek z trybu power down nie wstaje (pomimo zwierania styków kontaktronu), wychodzenie z tego trybu powinno następować po przerwaniu na INT0 czy PCINT0?

    Pozdrawiam
  • #11 7391256
    elektronik12z
    Poziom 13  
    Witam

    Trzeba ustawić reakcję na low level czyli ISC00 na 0 i ISC01 na 0 rejestru MCUCR.
    Wchodzi w tryb Power Down, ale gdy drzwi są zamknięte to kontaktron też jest "zamknięty" i procek cały czas jest wybudzany, bo przecież wtedy cały czas INT0 ma załączoną masę.

    Wiecie jak to rozwiązać?

    Pozdrawiam
  • #12 7392084
    janbernat
    Poziom 38  
    Wróć do Twojego pierwszego schematu i ustaw INT na zbocze rosnące.
    Przecież jak na INT jest zero- to jak ma opaść niżej?
  • #13 7392296
    elektronik12z
    Poziom 13  
    Witam

    Ok, dzięki za odpowiedź, ustawię na zbocze rosnące, ale przestawię też zegar na 128kHz i będę przestawiał w tryb IDLE.

    Pozdrawiam
  • #14 7392752
    janbernat
    Poziom 38  
    Czekaj, głupoty napisałem.
    Jak po zamknięciu drzwi masz stan wysoki- z Twojego pierwszego układu-to po otwarciu masz stan niski.
    Nie analizowałem Twojego programu- ale po co Ci zbocze- jak drzwi tylko się otwiera lub zamyka.
  • #15 7395853
    elektronik12z
    Poziom 13  
    Witam

    Nie jak drzwi są otwarte to kontaktron jest rozwarty i na pinie procka jest 1 stan wysoki, jak zamknę to kontaktron się zamyka i jest stan niski 0. Dlatego jest zbocze rosnące (reakcja na otwarcie drzwi).

    Narazie muszę odblokować 2 x tiny13 bo chciałem przestawić na 128kHz, ale odptaszyłem te 2 piny odpowiedzialne za zegar zamiast zaznaczyć (powinno być 11), a programatorem na rs232 niestety już nie da rady bo ustawienie 00 to ext. generator.

    Pozdrawiam
  • #16 7396457
    janbernat
    Poziom 38  
    Zrób sobie generator jakieś 1MHz na bramce HC14 albo na jakimś innym procesorze i podłącz do XTAL1.
    Wtedy uruchomisz procesor.
    Generator taki to bardzo pożyteczna rzecz.
  • #17 7396617
    elektronik12z
    Poziom 13  
    Witam

    A masz może jakiś schemat z HC14?

    W moim bardzo prostym mierniku jest generator przebiegu prostokątnego, ale tylko 50Hz (miernik za 11 zł M830), można to zwiększyć?.

    Pozdrawiam
  • #19 7400709
    elektronik12z
    Poziom 13  
    Witam

    Dzięki, zamykam temat :)

    Pozdrawiam
REKLAMA