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

[Atmega8][C] sterownik oswietlenia wnetrza samochodu

...KUBA... 14 Kwi 2012 22:12 3097 9
REKLAMA
  • #1 10794645
    ...KUBA...
    Poziom 25  
    Witam, otóż, że nasz mnie ochota na zrobienie sterownika oświetlenia kabiny samochodowej, i nie mogłem nigdzie znaleźć schematu układu, który spełniałby moje oczekiwania, postanowiłem, że sam zmontuje taki układ na uC Atmega8, jest to moje pierwsze starcie z uC... zaopatrzyłem się w odpowiednia książkę, i wziąłem się za pisanie programu, jako taki schemat już mam, ale nie o tym tu... chciałbym przedstawić wam algorytm działania mojego układu, i prosić was o sprawdzenie kodu... jest on jeszcze nie pełny, ale nie chciałbym powielać błędów zrobionych na samym początku... Chcę wykorzystać w układzie przetwornik ADC( do pomiaru nasłonecznienia), i wyjście PWM( do ściemniania i rozjaśniania oświetlenia)... poniżej załączam algorytm na którym zaznaczona jest cześć opisana kodem...
    Prosiłbym jeszcze o podpowiedzenie mi jak mogę zrobić to zapętlenie zaznaczone zielonym kolorem w pętli "while"/ "do while"? :
    [Atmega8][C] sterownik oswietlenia wnetrza samochodu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #3 10800419
    SylwekK
    Poziom 32  
    Ceni się poznawanie procesorów przez budowanie układów ułatwiających życie z zastosowaniem tego włąsnego jedynego algorytmu ale czy to nie lekki przerost formy nad treścią ?? To przecież tylko światełko kabiny. Po szybkim przejrzeniu algorytmu stwierdzam, że można to zrobić dużo prościej. Wiele razy powtarzasz warunki, które mogły by być w zasadzie sprawdzone raz. Wg mnie wystarczyło, by tylko zastosowanie opóźnionego gaszenia światełka po wejściu do pojazdu i przyspieszenie jego gaszenia w momencie przekręcenia stacyjki lub zablokowania drzwi. Ewentualnie warunek, że jeśli na dworze jest za jasno to światełko się nie zapali w ogóle.
    Pozdrawiam
  • #4 10800663
    stanleysts
    Poziom 27  
    Napisane jest to nie za fajnie, dla mnie najwiekszym problemem jest to ze jak chcesz koniecznie odczekiwac jakis czas i sprawdzac czy sie nie skonczyl to powinienes zaprzegnac do tego timer, albo zeby nie bylo za skomplikowanie to ja bym poprostu czekaj okreslony czas a dopiero potem cos rób i testuj warunki.

    Ja bym caly ten Twoj algorytm zapisal mniej wiecej tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 10802313
    ...KUBA...
    Poziom 25  
    Dzięki chłopaki za podpowiedzi, skończyłem przed chwilą przemyślenia nad tym, i oto efekty:

    1. stanleysts A co jeśli otworzę drzwi, i w ciągu 120sekund je zamknę? tzn, po jakiś 10s? myślałem, pod tym kątem, że jak program dojdzie do _delay_s(120), to się zatrzymuje, i nie sprawdza czy drzwi się zamknęły...

    2. SylwekK Naprowadziłeś mnie na dobrą drogę, faktycznie program sprawdza warunek i dosłownie za kilka sekund go powtarza... tamten kod miał trochę błędów, np. "unit8_t" zamiast "uint8_t" :D dlatego dołączam poprawiony algorytm i kod( zmieniłem jedną pętlę z for na while z połączeniem trzech warunków) :
    [Atmega8][C] sterownik oswietlenia wnetrza samochodu

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ten kod przechodzi już kompilację, bez żadnego błędu...

    3. raffiki Jak tylko uporam się z warunkami w programie, wezmę się za dodanie obsługi przetwornika ADC, i wyjście PWM do efektu rozjaśniania i ściemniania światła... tylko w tym punkcie zastanawiam się co będzie, jak światło zacznie się rozjaśniać po otwarciu drzwi, i w podczas rozjaśniania, zostaną zamknięte drzwi, czy w ogóle wystąpi taka sytuacja?
  • #6 10802335
    gaskoin
    Poziom 38  
    To się da jeszcze uprościć :) Zauważ, że niektóre warunki sprawdzasz bez względu na stan wcześniejszy. Np na początku sprawdzasz stacyjkę, i bez względu na jej stan sprawdzasz czy drzwi otwarte. Wszystko i tak prowadzi do tego, że jeśli drzwi są otwarte to zapalasz światło :D
  • #7 10802402
    ...KUBA...
    Poziom 25  
    No ok, spróbuje jeszcze to grzebnąć... ale mam jeszcze dwa pytanka:
    1. Czy komendą PINC da się sprawdzać stan pinu wyjściowego? Chodzi mi o to czy mogę sprawdzić programem czy światlo jest zapalone, czy nie.
    2. Co jeśli światło jest zapalone, a program ponownie wejdzie na komendę zapalenia światła? w przypadku ponownego ustawienia 1 na tym pinie nic chyba się nie stanie, ale jeśli to będzie funkcja rozjaśniająca światło, wykorzystująca PWM, to nie wiem czym to się zakończy ;/
  • REKLAMA
  • #8 10802420
    gaskoin
    Poziom 38  
    1. Można
    2. Nic się nie stanie, uC będzie starał się włączyć mosfeta który i tak już będzie włączony, żadne oscylacje nie będą miały miejsca.
  • #9 10816958
    ...KUBA...
    Poziom 25  
    Witam ponownie... Po wgraniu tego kodu, (do uC, z symulującym prace obwodem) okazało się, że układ działa trochę inaczej, niż się spodziewałem, bo były w nim błędy, np. zamienione makrodefinicje włącz/wyłącz oświetlenie... po zlokalizowaniu i usunięciu tych błędów, i tak ciężko było mi rozwiązać niektóre przypadki... chyba przydałaby się tu znajomość obsługi timera... Może to podstawa, ale jeszcze jej nie umiem wykorzystać... posiedziałem dzisiaj trochę nad tym układem, i stwierdziłem, ze faktycznie trzeba inaczej rozwiązać ten kod... chociaż miałem do tamtego sentyment, i nie za bardzo chciało mi się go zmieniać :(
    teraz mam w takiej postaci:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Działa o wiele sprawniej, niż ten poprzedni i jest w miare prosty do "ogarnięcia" zastąpię jeszcze warunki funkcjami... co o nim myślicie, będzie dobrze chodził po dłuższym czasie?
  • #10 10926408
    ...KUBA...
    Poziom 25  
    Witam, z racji, że brakuje mi ostatnio czasu, mój projekt staną w miejscu, chociaż wzbogaciłem się o wiedzę, jak obsługiwać wbudowany Timer, i przerwana z nim związane, oraz przerwania zewnętrzne, to i tak nie bardzo wiem, jak to wszystko poskładać... Mam pytanko czy do rozjaśniania i ścieniania światła, wykorzystać PWM hardware-owy czy programowy? czas rozjaśniania będzie stały... Myslałem również nad wykorzystaniem Timera do odliczania opóźnienia zgaszenia oświetlenia po zamknięciu drzwi, ewentualnie jeszcze do gaszenia oświetlenia jeśli drzwi sa otwarte dłużej niż 2 min. Po to aby program mógł cały czas sprawdzać, czy żaden sygnał się nie zmienił.(jak wcześniej robiłem to w pętli).
    "przepraszam za pisanie postu pod postem, ale chciałem również odświeżyć temat."
REKLAMA