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

[ATtiny2313][BASCOM] Sterownik lampki do samochodu, problem

luki55 22 Paź 2010 20:16 3572 20
REKLAMA
  • #1 8651028
    luki55
    Poziom 20  
    Witam
    Napisałem taki program, który ma płynnie wygaszać lampkę oświetlenia wnętrza samochodu po rozwarciu krańcówki w drzwiach, i płynnie rozjaśniać gdy krańcówka poda masę.
    Niestety program działa dobrze tylko na biurku i to nie do końca, w momencie kiedy zainstalowałem go w samochodzie, układ nie spełniał swojej roli. Np. żarówka zaświecała się podczas hamowania, czy włączania wycieraczek, nawiewu itd.
    Po za tym program jest raczej źle napisany..Nie wiem jak to rozwiązać...Bo w momencie gdy drzwi są otwarte lampka świeci zamykam drzwi lampka nie gaśnie ale od razu otwieram i w tym momencie odliczane jest 5s i żarówka się wygasza by po czym znowu płynnie się włączyć mimo, że drzwi cały czas są otwarte...
    Miałbym gorąca prośbę gdyby ktoś pomógł mi napisać bardziej optymalny program...
    Proszę też o sugestie jak wyeliminować zakłócenia...Może zastosować zamiast L7805 przetwornicę LM2574? Trzeba układ ekranować?

    Czy wewnętrzne podciągniecie "przycisku" do Ucc wystarczy czy podciągać zewnętrznym rezystorem?
    Co według Was jest nie tak z tym układem?
    Procesor pracuje na kwarcu wewnętrznym 4Mhz, fusebity odpowiednio ustawione...

    Jestem początkującym w tej kwestii, więc proszę o wyrozumiałość...

    $regfile = "attiny2313.dat"
    $crystal = 4000000
    Config Pinb.3 = Output
    Config Pinb.7 = Input
    Set Portb.7
    S Alias Pinb.7
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
    
    Dim I As Byte
    
    Pwm1a = 0
    
    Do
    
    If S = 0 Then
    For I = 80 To 255
    Pwm1a = I
    Waitms 9
    
    Next I
    Decr I
    
    
    
    Bitwait S , Set
    Wait 5
    
    If S = 1 Then
    
    
    For I = 255 To 0 Step -1
    Pwm1a = I
    Waitms 15
    
    
    If S = 0 Then
    Exit For
    End If
    
    Next I
    
    End If
    Bitwait S , Reset
    End If
    
    Loop
    End


    Schemat:
    [ATtiny2313][BASCOM] Sterownik lampki do samochodu, problem


    Proszę też moderatorów o przeniesienie tematu do odpowiedniego działu jeśli napisałem go w nieprawidłowym...

    Pozdrawiam, dziękuję


    inventco.eu - zdjęcia proszę zamieszczać zgodnie z regulaminem forum.
  • REKLAMA
  • Pomocny post
    #2 8651176
    farrix
    Poziom 17  
    Po 1 : Do bramki mosfeta daj rezystor ok 200Ohm.
    Po 2 : Ten kondensator 4,7 zwiększ przynajmniej 100 razy a i 1000 razy by nie zaszkodził :D
    Po 3 : Masz wolne int0/1 więc czemu z niego nie skorzystasz? Wew. podciaganie wystarczy spokojnie.
    Po 4 : Czemu takiego prostego programu w C nie skrobniesz.
    Po 5 : 2574 można zastosować ale jest to CO NAJMNIEJ bez sensu.

    inventco.eu - proszę unikać "slangu", regulamin forum się kłania. Tym razem poprawiłem.
  • Pomocny post
    #3 8651308
    arktik1
    Poziom 27  
    Do tej lampki wystarczy 1/4 twojego programu.

    Dodano po 7 [minuty]:

    Zadeklaruj zmienną , by zwiększała się do 255 gdy PINB.0=0 i zmniejszała gdy PINB.0=1.
    Możesz to zrobić w pętli DO...LOOP.
  • Pomocny post
    #4 8651852
    janbernat
    Poziom 38  
    Kod nie pasuje do obrazka.
    Na obrazku- wyjście na PB.7.
    A w kodzie PB.0
    Powinno być z podciąganiem, bez diody i z kondensatorem.
    P.S.
    Już poprawiłeś.
  • REKLAMA
  • Pomocny post
    #5 8651908
    gregoorr
    Poziom 17  
    Najprościej opisał to chyba arktik1, taki algorytm byłby ok'. Jak już masz procek, to może coś więcej dopiszesz, niż tylko zapalanie i gaszenie lampki. Np. opóźnienie gaszenia lampki. Wchodzisz, zamykasz drzwi i lampka jeszcze się pali, wkładasz kluczyk, włączasz zapłon i dopiero wtedy gaśnie. Po zamknięciu centralnym włącza się na kilka sekund. To tylko kilka linijek więcej i dwa przewody.
  • Pomocny post
    #6 8652557
    farrix
    Poziom 17  
    Do kolegi arktik1 dlaczego kolega namawia do sprawdzania w petli danego pinu skoro luki55 ma w programie sprawdzac tylko ten przycisk to lepiej go dac w przerwanie zewnetrzne a do glownego do__loop wstawic nop.
    Jesli juz taki "duzy" procesor stosowac to wykorzystac go przynajmniej tyle ile sie da i ile ulatwi zycie.

    P.s.
    Attiny13 tez bylby za duzy :D
  • REKLAMA
  • Pomocny post
    #7 8653717
    gts1991
    Użytkownik obserwowany
    farrix napisał:
    Po 1 : Do bazy mosfeta daj rezystor ok 200Ohm inventco.eu - proszę unikać "slangu", regulamin forum się kłania. Tym razem poprawiłem.

    Chyba bramki kolego :)
  • REKLAMA
  • #8 8654230
    luki55
    Poziom 20  
    Witam, dziękuje za zainteresowanie...
    Kolego arktik1 Piszesz, że mam zadeklarować zmienną, tym samym zlikwidować pętlę FOR...NEXT? Jak zrealizować w takim wypadku wygaszanie płynne za pomocą PWM? zupełnie nie wiem jak to zrobić, pisałem, że dopiero się uczę programować, moje dotychczasowe programy to tzw. składaki. Po prostu patrze jak ma ktoś inny coś zrobione i po kawałeczku składam...pewnie wydaje się to Wam śmieszne.
    farrix W C tego nie napiszę, bo z C praktycznie w ogóle nie miałem do czynienia jeśli chodzi o procesory. Nie wiem jak wykorzystać przerwanie.
    janbernat
    Tak zmieniałem bo miałem to najpierw na m8 zrobione...Czyli podciąganie programowo, i kondensator 100n z wyjścia do wyłącznika?
    gregoorr Nie wiem czy zauważyłeś, ale opóźnienie jest zrealizowane: Wait 5, oczywiście masz rację można cuda robić, ale najpierw muszę mieć główny program...Nie wiem też jak zrealizować wykrywanie stanu wysokiego na wejściu, bo z niskim stanem z centralnego nie ma problemu...
    farrix
    Wiem, że za duży ale akurat taki miałem pod ręką...

    Proszę chociaż o jakiś fragment kodu...może wtedy coś mi to rozjaśni...

    Coś jeszcze czytałem o watchdog, w moim przypadku kiedy napięcie będzie bardzo spadać potrzebne jest uwzględnienie tego w programie?
    Czy po prostu większy kondensator w zasilaczu?

    Pozdrawiam
  • Pomocny post
    #9 8654291
    gregoorr
    Poziom 17  
    Na początek zrób jak proponował arktik1. Masz zmienną I, odpowiada ona za PWM. I tak : jak masz otwarte drzwi to ją zwiększaj, jak zamknięte to zmniejszaj. Wszystko w pętli do - loop.

    Tak na szybko:
    
    
    
    Drzwi As Pinb.1                                             'przykładowy
    
    Do
    
    If Drzwi = 1 Then                                           'albo otwarte, albo zamknięte
    Incr I
    Else
    Decr I
    
    Pwm1a = I
    Waitms 200
    
    Loop
    


    Oczywiście potrzebna kosmetyka i dopasowanie.
    To że lampka zapala się np. przy włączaniu dmuchawy, to odwielka walka z zakłóceniami w samochodzie. Jest gdzieś na forum projekt wycieraczek, podejrzyj jak tam kolega rozwiązał sprawy sprzętowe.
    Jeśli chcesz wykryć stan wysoki, to podciągasz opornikiem pin do masy, jest wtedy w stanie niskim. Po podaniu napięcia zmieni swój stan na wysoki.
    Mam na myśli ten post:
    Link
  • Pomocny post
    #10 8655309
    arktik1
    Poziom 27  
    Proponuje tak:
    
    Dim I As Byte                                              'przykładowy
    
    Do
    
    If PINB.1 = 0 Then
    if I <255 then Incr I                                          'albo otwarte, albo zamknięte
    Else
    if I >80 then Decr I
    endif
    
    Pwm1a = I
    Waitms 100
    
    Loop 
  • #11 8663204
    luki55
    Poziom 20  
    Witam
    W ogóle to nie działa :/ Bo to jest zrobione w pętli i i włącza się cały czas w pętli nie mam pomysłu jak to zrobić , bo moim zdaniem trzeba na początku ustalić pwm na 0 czyli I=0 (nie świeci) , później zwiększać I(płynne rozświetlanie) ale gdy osiągnie 255 wystawiać jakąś zmienną pomocniczą, i samo przy gaszeniu tylko zupełnie mi to nie działa.....
  • Pomocny post
    #12 8663756
    arktik1
    Poziom 27  
    Na 100% działa:
    
    Dim I As Byte
    I = 0
    
    Do
    
    If PINB.1 = 0 Then
    If I < 255 Then Incr I
    Else
    If I > 0 Then Decr I
    endif
    
    Pwm1a = I
    Pwm1b = I
    Waitms 100
    
    Loop
    


    Dodano po 2 [minuty]:

    
    $crystal = 8000000
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    


    Dodano po 3 [minuty]:

    I oczywiście PINB.1 podciągnięty do +
  • #13 8664726
    luki55
    Poziom 20  
    $regfile = "attiny2313.dat"
    $crystal = 400000
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Config Pinb.7 = Input
    Set Portb.7
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    
    Dim I As Byte
    
    I = 0
    
    Do
    
    If PINB.1 = 0 Then
    If I < 255 Then Incr I
    Else
    If I > 0 Then Decr I
    endif
    
    Pwm1a = I
    Pwm1b = I
    Waitms 100
    
    Loop


    To też nie działa , po za tym musiałbym chyba zastosować dwa tranzystory ...
  • Pomocny post
    #14 8665573
    arktik1
    Poziom 27  
    Ustaw to:
    
    $crystal = 400000 
    

    tak:
    
    $crystal = 8000000
    

    I fuse do tego.
    Poza tym podałem ci program który podaje PWM na 2 porty, nie musisz stosować 2 tranzystorów, wybierz 1 port na którym będzie ci to działać.
    Kolejna sprawa, to wielkość WAITMS musisz dobrać eksperymentalnie, ponieważ zależy od tego prędkość rozjaśniania i gaszenia lampki.
    Jeśli chcesz by lampka zaczynała gasnąć po jakimś czasie to trzeba dopisać jeszcze kawałek kodu.
    A jeśli nie działa, to znaczy że źle podłączasz Uc.

    Dodano po 5 [minuty]:

    Jeszcze to:
    
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Config Pinb.7 = Input
    Set Portb.7 
    

    zrób tak:
    
    Config Portb = &B00011000
            Portb = &B10000000
    
    
  • #15 8667333
    luki55
    Poziom 20  
    Witam
    W końcu działa, bardzo dziękuje...
    Teraz kwestia opóźnienia wygaszania...chciałem to zrobić tak:
    po:
    If I < 255 Then Incr I 


    dać:
    If I=255 Then wait 5


    i niby jest opóźnienie ale coś nie stabilnie to chodzi...
    proszę o jakieś rady...

    I przyszła mi jeszcze na myśl taka funkcja, że jak lampka będzie się świecić np. 10 min to zostanie ona wygaszona tutaj trzeba będzie pewnie użyć jakiegoś timera...

    Po za tym zostaje kwestia sprzętowa...
    Więc rezystor 200Ω na bramkę mosfet`a.
    Na wejściu (tam gdzie pojawia się masa od krańcówki), mam dać kondensator?
    Jeśli tak to jaki i jakiej wartości oraz jak go wpiąć?
    Co z pozostałymi nie używanymi portami? Można je fizycznie podać na masę?
    Zrobiłem już puszkę ekranowaną z laminatu, po za tym zastosuje chyba jeszcze transila i dławika na wejściu zasilacza, tylko nie wiem jakie wartości...
    Pozdrawiam
  • #16 8667480
    arktik1
    Poziom 27  
    Jeśli chcesz dołożyć jeszcze te funkcje o których piszesz, to trzeba przerobić cały kod, niestety.
    Musisz zadeklarować zmienną która będzie odliczała czas potrzebny do wyłączenia lampki gdy drzwi będą otwarte dłużej niż 10 min i odliczała 5 sekund po zamknięciu.
    Poza tym jeśli zrobisz tak:
    
    If I=255 Then wait 5
    

    to Uc będzie odliczał cały czas 5 sekund jeśli wartość PWM będzie wynosiła 255, to bez sensu.Jeśli w czasie odliczania zamkniesz drzwi to wyłączenie lampki będzie występowało losowo, raz po 2 sec, raz po 1, a innym razem od razu.

    Dodano po 5 [minuty]:

    Daj przed zasilaczem kondensator 300uF ,za regulatorem jakieś 500uF i 100n, powinno wystarczyć.
    Pozostałe porty możesz zostawić nie podłączone.
    Do włącznika drzwiowego możesz zastosować ewentualnie 100n.
  • #17 8668008
    luki55
    Poziom 20  
    Ok, czyli domyślam się, że muszę zrobić dwa podprogramy jeden z procedurą pwm gaszenia lampki, a drugi z procedurą pwm zapalania??

    Czyli podprogramy będą np. wyglądać tak:
    
    zgas:
    x
    x
    x
    return


    zaswiec:
    x
    x
    return


    I do podprogramu wchodze instrukcją np. Gosub zgas tak?
  • #18 8668118
    arktik1
    Poziom 27  
    Nie koniecznie musisz używać GOSUB, zrobił bym to tak.
    jeśli drzwi otwarte to,
    1 rozjaśnij lampkę
    2 zacznij liczyć czas do wyłączenia.
    3 jeśli policzony czas = 10 min to wyłącz lampkę
    jeśli drzwi zamknięte to
    1 policz czas do wyłączenia
    2 wyłącz lampkę.
    3 wyzeruj liczenie czasu dla otwartych drzwi.

    Da się to zrobić w jednej pętli i da się to zrobić w GOSUB.
    Możesz to zrobić też w taki sposób że:
    Sterujesz włącznikiem drzwiowym masę Uc.
    Gdy otworzysz drzwi to włącznik drzwiowy poda masę na uc i uruchomi program.
    Jest to sposób lepszy od pierwszego, dlatego że po każdym otwarciu drzwi Uc będzie startował od początku i w razie zawieszenia się lub błędnego działania programu, wywołanego zakłóceniami będzie po zamknięciu drzwi resetowany.
    Tylko że wtedy trzeba dać dodatkowy tranzystor na podtrzymanie masy ATTINY.
    Napisz jak chcesz by to działało.
  • #19 8668272
    luki55
    Poziom 20  
    Ok, czyli tak jeśli chodzi o ten drugi sposób to masz na myśli to, że podaję masę z wyłącznika na GND procesora i wtedy on wykonuje program, ale kiedy zamknę drzwi to potrzebne jest podtrzymanie masy ?

    Może jednak tym pierwszym bym to robił...
  • #20 8668778
    arktik1
    Poziom 27  
    Tak Uc podtrzymuje masę do momentu wygaśnięcia lampki i sam odcina sobie zasilanie.
    Pierwszy będzie łatwiejszy do zrealizowania.
    No to bierz się do pisania i przedstaw wyniki a potem zobaczymy co da się z tym zrobić.
    Gotowca ci nie podrzucę z powodu braku czasu.
  • #21 8672300
    luki55
    Poziom 20  
    Witam
    Coś naskrobałem, pytanie co jest źle, wykorzystałem fragment kodu napisanego kiedyś przez kolegę Mimitron z forum, który sugerował cytuję:
    Cytat:
    Dodaj dodatkową zmienną bit która będzie ustawiana np: na 1 po wyłączenia światła przez timer po 30 sekundach a dzięki niej nie będzie ponownie włączane światło przez wciąż otwarte drzwi (stan niski na wejściu uC). Dopiero zamkniecie drzwi ( stan wysoki na wejściu uC) spowoduje zmianę tej zmiennej na 0


    Czas po którym lampa gaśnie tu był 30s ja zrobiłem 10min (nie wiem czy dobrze), po za tym nie wiem jak samo opóźnienie wygaszania zrobić np. 10s , bo chyba źle to zrobiłem...
    Testuje to na m8 bo tak mi wygodniej (mam płytkę testową)....

    Bardzo prosiłbym abyś spojrzał na to w wolnej chwili...ale chyba za bardzo to jest namieszane....


    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Portb = &B00000110
            Portb = &B00000001
    
    Dim I As Byte
    Dim Kontrol As Bit
    Dim Licz8ms As Byte
    Dim Odmierz10min As Word
    
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Przerwaniepo1s
    Load Timer0 , 250
    Enable Timer0
    Stop Timer0
    
    Do
    
    If Pinb.0 = 0 And Kontrol = 0 Then
    Gosub Zapal
    Start Timer0
    End If
    
    
    If Pinb.0 = 1 Then
    Gosub Zgas
    Kontrol = 0
    Stop Timer0
    End If
    
    
    Loop
    
    End
    
    Przerwaniepo1s:
    Load Timer0 , 250
    Incr Licz8ms
    
    If Licz8ms = 125 Then
    
    Gosub Podprogram
    
    Licz8ms = 0
    End If
    
    
    Podprogram:
    Incr Odmierz10min
    If Odmierz10min = 600 Then
    Gosub Zgas
    Odmierz10min = 0
    Kontrol = 1
    Stop Timer0
    End If
    Return
    
    
    Zapal:
    Do
    
    If I < 255 Then
    Incr I
    End If
    Pwm1b = I
    Waitms 20
    Loop
    Return
    
    Zgas:
    Wait 10
    
    Do
    
    If I > 0 Then
    Decr I
    End If
    Pwm1b = I
    Waitms 20
    Loop
    Return
    
REKLAMA