Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] sterownik latarki, czas wciśnięcia mikroswitcha

pawel3110 02 Kwi 2012 14:17 2073 15
  • #1 02 Kwi 2012 14:17
    pawel3110
    Poziom 15  

    Piszę program do sterownika latarki, wciśnięcie przycisku na czas poniżej sekundy ma zmienić tryb świecenia- zmienia zmienną "l".
    nie działa mi to za bardzo, tzn. raz działa, raz nie, bez względu na to, czy przyciskam switcha któtko, czy trochę dłużej.

    Gdy w main ustawię INT0 na zbocze opadające, to nie reaguje w ogóle, dopiero zmiana na zmianę stanu powoduje zmianę trybu.

    Attiny13A 4,8MHz

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 15
  • #2 02 Kwi 2012 20:45
    snnaap
    Poziom 25  

    1. Gdzie masz jakąkolwiek eliminacje drgań tego przycisku?
    2. Algorytm działania też wygląda nie ciekawie.

    Wg mnie powinno to wyglądać tak:
    Po wykryciu przerwania od INT powinieneś wyłączyć to przerwanie następnie wyeliminować drgania (odczekać te min 50 ms) następnie włączyć przerwania od Timera. W przerwaniu od Timera powinieneś sprawdzić czy przycisk jest nadal wciśnięty jak tak możesz zwiększać zmienną "t1" jeżeli przycisk został puszczony puszczony powinieneś wtedy przypisać zmienna "t1" do "t" i włączyć ponownie przerwania od INT.

    Pozdrawiam

    PS:
    "MCUCR |= (1<<ISC00);" ?? Dlaczego na początku jest że jakakolwiek zmiana stanu na INT powoduje przerwanie.

    Przyjmij że tylko zbocze opadające wywołuje przerwanie.

    "MCUCR &= ~(1<<ISC01) | (1<<ISC00);" - powinno być "MCUCR &= ~((1<<ISC01) | (1<<ISC00));"

    0
  • #3 03 Kwi 2012 17:33
    pawel3110
    Poziom 15  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    poprawiłem

    Code:
    Dlaczego na początku jest że jakakolwiek zmiana stanu na INT powoduje przerwanie. 


    Gdy zmienię na zbocze opadające, przestaje prawie w ogóle reagować, to znaczy nie zmienia trybu pwm.

    Eliminację drgań styków ma tutaj:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    czyli ok. 6,8ms

    Chciałem to zrobic na dwóch przerwaniach na jedno wciśnięcie, gdyż wciśnięcie do 1s ma zmieniać tryb, a dłuższe od 3 ma docelowo usypiać procka i go budzić.

    0
  • #4 03 Kwi 2012 17:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    pawel3110 napisał:
    Eliminację drgań styków ma tutaj:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    czyli ok. 6,8ms

    To może być za krótki czas, niektóre switche mają w datasheetach czas drgań nawet 20ms. Zobacz na oscyloskopie.

    0
  • #5 03 Kwi 2012 18:11
    pawel3110
    Poziom 15  

    zmieniłem do 20ms, 40ms, w main ustawione na zbocze opadające i nadal więcej razy nie działa niż działa. switch sprawdzony, za każdym razem działa więc odpada problem braku kontaktu, tylko z programem nadal coś nie tak, tylko co?

    0
  • #7 03 Kwi 2012 18:53
    pawel3110
    Poziom 15  

    lepiej, ale nadal nie działa za każdym razem...

    0
  • #9 03 Kwi 2012 19:07
    pawel3110
    Poziom 15  

    schemat jest banalny, PB1 przez przycisk bezpośrednio do gnd, PB0 do bramki mosfeta przez rezystor 10Ohm, reset niepodłączony, na zasilaniu elektrolit 10uF. Na razie nie ma podłączonego żadnego obciążenia, zmianę pwm obserwuję na woltomierzu podpiętym do PB0. Nie posiadam oscyloskopu aby coś więcej powiedzieć na temat działania switcha i jego drgań, sprawdzałem napięcie na PB1 i za każdym naciśnięciem switcha napięcie spadało do zera, więc wnioskuje, że kontaktuje dobrze.

    Ustawienia fusebitów:

    SELFPRGEN = [ ]
    DWEN = [ ]
    BODLEVEL = DISABLED
    RSTDISBL = [ ]
    SPIEN = [X]
    EESAVE = [ ]
    WDTON = [ ]
    CKDIV8 = [ ]
    SUT_CKSEL = INTRCOSC_4MHZ8_14CK_4MS

    HIGH = 0xFF (valid)
    LOW = 0x75 (valid)

    AVRStudio 5

    0
  • #10 03 Kwi 2012 19:12
    snnaap
    Poziom 25  

    A może nie wykorzystuj 2 przerwań tylko sprawdzanie przycisku wstaw odrazu do przerwania od zegara:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod



    czy jest może jakaś zależność od l?? np przy l = 0 działa lepiej a przy l=4 działa gorzej albo na odwrót?


    PS i dołóż kondensator 100n.

    0
  • #11 03 Kwi 2012 19:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    pawel3110 napisał:
    schemat jest banalny, PB1 przez przycisk bezpośrednio do gnd, PB0 do bramki mosfeta przez rezystor 10Ohm, reset niepodłączony, na zasilaniu elektrolit 10uF.

    :)
    Czy w samochodzie także jeździsz z kołami na za niskim ciśnieniu, abo z odkręconym korkiem oleju?
    Pokaż schemat, albo trać czas nadal - Ty wybierasz.

    0
  • #12 03 Kwi 2012 19:48
    pawel3110
    Poziom 15  

    [C] sterownik latarki, czas wciśnięcia mikroswitcha

    To jest docelowy układ, proszę nie krytykować podłączenia mosfeta, gdyż jest to zwykłe dopasowanie wyprowadzeń, gdyż z biblioteki eagle pasowała tylko obudowa.
    Kondensator C2 również jest odłączony, brak baterii i diody led, zasilanie podpięte bezpośrednio do VCC ATtiny z programatora.

    Przepraszam bardzo, że taki "prowizoryczny, ale robiony na szybko i tylko po to, żeby zrobić płytkę. Jeżeli będą jakieś niejasności, to jutro dorzucę lepszy.

    snnaap
    Już jestem kompletnie załamany, Twoje rozwiązanie nie działa wcale, a na logikę powinno... Albo gdzieś jest tu czeski błąd, albo błąd którego nikt by się nie spodziewał.

    Zrobiłem tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/code]

    20:09
    O co chodzi?
    Procek startuje z OCR0A=245 i nie reaguje na przycisk.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czy to może być wina wpiętego programatora?
    Nie mam na razie jak sprawdzić z osobnym zasilaniem.

    0
  • #13 03 Kwi 2012 20:38
    dondu
    Moderator Mikrokontrolery Projektowanie

    pawel3110 napisał:
    Jeżeli będą jakieś niejasności, to jutro dorzucę lepszy.

    Dobrze by było, gdybyś go uporządkował nawet tylko po to, by go tutaj pokazać w wersji "zjadliwej" do analizy.

    Na pewno podciągnij RESET przez rezystor 4k7 - 10k. Bez niego lub bez włączonego pull-up narażasz się na ciągłe resetowanie w bliżej nieokreślonych momentach.

    Dodaj kondensator 100nF blisko pinów zasilających uC.

    I nie rysuj połączeń przez elementy elektroniczne - zobacz jak powinien wyglądać czytelny schemat.


    pawel3110 napisał:
    Czy to może być wina wpiętego programatora?

    Jest to możliwe.

    0
  • #14 03 Kwi 2012 20:46
    pawel3110
    Poziom 15  

    jutro sprawdzę i dam znać o efektach

    0
  • #15 06 Maj 2012 18:02
    pawel3110
    Poziom 15  

    Długo mnie nie było, ale niestety wyskoczyła mi delegacja...

    Znalazłem rozwiązanie mojego problemu...
    Zamiast:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    powinno być:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zamiast:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    powinno być:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a ja tyle czasu się głowiłem o co chodzi...:/

    Wszystkim piszącym w temacie dziękuję za zainteresowanie, gdy jeszcze coś nie będzie mi działało, to na pewno poproszę o pomoc;)

    Dodano po 3 [godziny] 43 [minuty]:

    już mam następny problem, szukałem w internecie ale nie znalazłem konkretnego rozwiązania. Chodzi o to, jak wybudzić procek z uśpienia przyciskiem, ale tylko wtedy, gdy przytrzymamy przycisk co najmniej 3 sekundy? wybudzanie działa, ale chciałbym zrobić takie właśnie opóźnienie.

    0
  • #16 07 Maj 2012 15:06
    dondu
    Moderator Mikrokontrolery Projektowanie

    pawel3110 napisał:
    już mam następny problem, szukałem w internecie ale nie znalazłem konkretnego rozwiązania. Chodzi o to, jak wybudzić procek z uśpienia przyciskiem, ale tylko wtedy, gdy przytrzymamy przycisk co najmniej 3 sekundy? wybudzanie działa, ale chciałbym zrobić takie właśnie opóźnienie.

    Możesz zbudować zewnętrzny układ, albo wykorzystać Twój mikrokontroler do odliczenia czasu i po stwierdzeniu, że 3s minęły a przycisk nadal jest naciśnięty, przejść do realizacji programu głównego.

    W czasie odliczania 3s np. timerem, także możesz mieć uśpiony mikrokontroler, choć już w innym trybie niż Power Down.

    0