Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom- znowu warunek IF-ELSE.

inspector_electro 18 Kwi 2017 22:41 864 23
  • #1 18 Kwi 2017 22:41
    inspector_electro
    Poziom 22  

    Witam wszystkich.

    Borykam sie od paru godzin z funkcją ELSE.
    Otóż w programie, gdy ADC wykryje napięcie mniejsze od 3.35V, wtedy ma pojawić się tekst "naladuj" i ikonka pustej baterii. Po wykryciu podpiętej ładowarki ma się wyświetlać tekst
    "laduje" i ikonka baterii z piorunem. Próbuję na różne sposoby z funkcją ELSE i prawie jest ok. Prawie dla tego,
    że napis szybko się zmienia z "naladuj" na "laduje". (drży). Próbowałem z flagą, ale
    nie idzie. Dodam że jeśli napiszę źle składnię, procesor mi sie nie chce wybudzić po naciśnięciu przycisku, a jest ustawiony INT0 powerdown.

    Oto kawałek programu:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    W takiej konfiguracji jest ok, poza zmieniającym się szybko tekstem.
    Pomóżcie.

  • #2 18 Kwi 2017 22:52
    niveasoft
    Poziom 34  

    Kod taki zdawkowy, ale domyślam się, że chodzi o brak histerezy.
    Dodaj histerezę. Zamiast jednego progu decyzyjnego na 3.35 robisz dwa.
    Jeśli mniej niż 3,35 to Flaga = 1, ale drugi robisz trochę wyżej.
    Jeśli więcej niż 3,45 to Flaga = 0

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    ..albo chodzi o to :

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #3 18 Kwi 2017 22:58
    inspector_electro
    Poziom 22  

    Nie nie to nie tak.
    To jest zegarek z oledem i atmega328. Po podłaczeniu ładowarki czyli "charge_detect alias pind.1" ten pin wykrywa stan wysoki z podpiętej ładowarki, ma się wyświetlić "laduje". Natomiast jeśli napięcie akumulatorka spadnie poniżej 3.35v(mierzy ADC) wtedy ma się wyświetlić "naładuj". W tej składni co podałem to działa ale zmieniają mi się szybko te napisy.

    Drugi przykład podałeś lepszy :). Tylko że przy naładowaniu akumulatora do 4,18v
    bo tak ładuje układ SMD MIcrochipa napis "naładowany" pozostanie na wyświetlaczu. Chyba żeby napisać obsługę wykrycia niskiego stanu i wtedy zresetować oleda?

  • #5 18 Kwi 2017 23:04
    inspector_electro
    Poziom 22  

    Już próbuję.

  • #7 18 Kwi 2017 23:08
    inspector_electro
    Poziom 22  

    Procesor nie wstaje po uśpieniu przy Twoim kodzie. Z obsługą uśpienia pomagałeś mi Ty, i wygląda tak:



    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • Pomocny post
    #8 18 Kwi 2017 23:15
    niveasoft
    Poziom 34  

    Pamiętam, że namawiałem Cię do zmiany tego kodu bo ja bym tego tak nie zostawił.

  • #9 18 Kwi 2017 23:19
    inspector_electro
    Poziom 22  

    Przy kodzie który podałeś :

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Jest idealnie.

    Dodano po 3 [minuty]:

    Tak pamiętam jak mówiłeś. Ale ja nie uczyłem się BAscoma od podstaw. Znam go co nieco, i zazwyczaj zlepiam program z kilku kawałków. Aczkolwiek robię sam coraz więcej. Do AVR siadam jak mam czas, bo pracuję za granicą i tam nie mam jak.
    Póki co, bardzo ci dziękuję ZNOWU :) za pomoc" - napisanie.

    Apropos tego kodu, to czemu jest zły?

  • #10 19 Kwi 2017 10:36
    JacekCz
    Poziom 32  

    inspector_electro napisał:

    Jest idealnie.
    Dodano po 3 [minuty]:
    Tak pamiętam jak mówiłeś. Ale ja nie uczyłem się BAscoma od podstaw. Znam go co nieco, i zazwyczaj zlepiam program z kilku kawałków. Aczkolwiek robię sam coraz więcej. Do AVR siadam jak mam czas, bo pracuję za granicą i tam nie mam jak.
    Póki co, bardzo ci dziękuję ZNOWU :) za pomoc" - napisanie.

    Apropos tego kodu, to czemu jest zły?


    tak a propos uczenia się, ELSE nie jest funkcją

  • #11 19 Kwi 2017 10:40
    inspector_electro
    Poziom 22  

    Tak wiem. Tak tylko napisałem.
    Ogólnie to za wcześnie się ucieszyłem. Na czas testów kodu od Niveasoft, miałem wyłączony ADC i wyświetlanie było ok. Po włączeniu z powrotem ADC, procesor nie chce się wybudzić. Znowu jestem w kropce. Siedzę nad tym i kombinuję.

    Tytuł już zmieniłem na DYREKTYWA :)

  • #12 19 Kwi 2017 10:53
    niveasoft
    Poziom 34  

    U mnie wczoraj śnieg o 1 w nocy spowodował awarie prądu aż do 10 rano. Przynajmniej się wyspałem ahahahaha :D

    Jak chcesz pomocy, zamieść kod i go opisz. Kiedy działa, co zmieniłeś i kiedy nie :D
    To się pomyśli :D

    Tytuł raczej powinien brzmieć "znowu warunek IF-ELSE" , ale myśle że on tu nie ma nic do rzeczy ;)
    Te budzenie tam na pewno trzeba poprawić.

  • #13 19 Kwi 2017 11:04
    inspector_electro
    Poziom 22  

    Temat ostatecznie zmieniłem.

    Program działa, jeśli wywalę / "zaremuję" obsługę Wyświetlania baterii-nie napięcia. To jest dziwne, bo adc i reszta jest ok. Ale jek tylko dołożę obsługę wyświetlania ikonek IF-ELSE to procesor nie budzi się. Dodam że automatyczne wyłączanie zrealizowałem na transoptorze, bo inaczej miałem problemy z wybudzaniem.

    Program:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #14 19 Kwi 2017 12:35
    niveasoft
    Poziom 34  

    Okay. Przeniosłem to usypianie do głównej pętli. Nic by to jednak nie dało gdybym nie napisał o co w tym chodzi. Te GOTO to przemilczę bo to inny temat.
    Miałeś tam też poplątane zakończenia Subów. To znaczy, że w jednym Sub miałeś jeszcze kilka innych i każdy z nich miał Return a pod uwagę brany jest pierwszy return --eh :D Żeby się nie zakręcić więc :

    Twój kod by mi się nie skompilował bo nie mam takich samych fontów więc napisałem szybko program który naprzemian włącza i wyłącza wyświetlacz za każdym razem pokazując nową kolejną cyfrę. Czyli pokazuje zero, naciskasz i wyświetlacz gaśnie. Naciskasz jeszcze raz i pokazuje 1 i tak dalej :D

    Możesz podstawić swój Font i testnąć ;)

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Działa to oczywiście elegancko.

    Potem przeniosłem to do Twojego kodu. Powinno działać, ale jak nie działa to trochę to pomęcz bo zamierzony efekt jest na pewno blisko :D

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Wszystko robiłem w przerwach pomiędzy innymi zadaniami więc błąd mógł się wkraść :P

  • #15 19 Kwi 2017 13:45
    inspector_electro
    Poziom 22  

    Zegar mozna było wyłączyć i włączyć tylko raz. Później już nie reagował. Więc w kodzie powerdown dodałem tylko: LOCK = 1

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Po tym zabiegu włącza się i wyłącza za każdym razem. Był też problem z obsługą
    wyłączenia po określonych sekundach. Przeniosłem ją pod odczyt czasu, czyli :
    Call getdatetime: . Problemy które pozostały to:
    Wzrost poboru prądu o 200 mikroamper.
    Procesor nie wstaje po podpięciu zasilania, nic się nie wyświetla. Dopiero po resecie z Bascoma wstaje. Popróbuję jeszcze.

  • #16 19 Kwi 2017 13:55
    niveasoft
    Poziom 34  

    To teraz przed Powerdown wstaw "Stop AC" i "Stop ADC"
    Po wyjściu z Powerdown oczywiście musisz "Start ADC"

    Jeśli ładowarka jest na PD1 to dopisz w kodzie gdzieś u góry a na pewno się obudzi :P

    PCMSK2 = &B00000010
    Enable PCINT2

  • #17 19 Kwi 2017 14:28
    inspector_electro
    Poziom 22  

    Wyłączenie adc pomogło ograniczyć prąd w trybie powerdown, ale:

    Procesor nie wstaje po podpięciu zasilania. Jeśli włączam zegarek przyciskiem i wyłączam, ADC pracuje. Jednak jeśli wyłączy się po określonej sekundzie, to po włączeniu go przyciskiem ADC nie pracuje.
    Nie mam do tego g.... już siły.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod



    Tutaj obsługa wyłacznia po określonej sekundzie. PORTD.4 zaświeca na chwilę diodę dransoptora, który oddziaływuje na switch wyłączający zegar.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #18 19 Kwi 2017 15:05
    niveasoft
    Poziom 34  

    Cytat:
    Nie mam do tego g.... już siły.

    Wierzę Ci bo mi się na to też już źle patrzy :P

    Można nauczyć podstaw języka, ale logicznego kombinowania nie zawsze...

    Dlaczego nie zrobisz tak, że kiedy przyciśnięto przycisk to dajesz mu, na przykład 10s do odliczenia. Kiedy Odliczy to się wyłączy. Chyba ze ktoś przyciśnie wcześniej przycisk to też się szybciej wyłączy.

    Taki zapis :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    bym zastąpił
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    ..ale to już zostaw bo to sensu nie ma. Co jeśli naciśniesz przycisk w dziewiątej sekundzie? Po sekundzie się wyłączy czy po jedenastu?
    To nieważne

    Po obudzeniu dajesz mu 10s i sobie odejmuje.
    Niepotrzebny żaden transoptor a śpi zawsze w tym samym miejscu i możesz w jednym miejscu skumulować te wszystkie Set, Reset itd..

    Dodałem zmienną Wylacz_mnie która jest równoważna przyciskowi
    Dodałem pobudkę od ładowarki

    Coś tam pokombinuj bo zerknę tu pewnie dopiero wieczorem :D
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #19 19 Kwi 2017 21:33
    inspector_electro
    Poziom 22  

    A więc tak.
    Procesor nie chce wstawać lub oled po podpięciu zasilania. Pomaga reset z basoma. Odliczanie nie działa bo auto wyłączenie następuje po około minucie.
    Pobór prądu po wyłączeniu znowu wzrósł do 690 mikro amper. A mój najlepszy wynik był 460 po wyłaczeniu. Dodanie Disable ADC po wyłączeniu INT0 nic nie daje,
    pobór prądu się nie zmienia. Nie rozumiem też konfiguracji detekcji ładowarki.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Wiem że to portb.2 ale co dalej?

  • #20 22 Kwi 2017 10:41
    inspector_electro
    Poziom 22  

    Ogarnąłem PCINT2, ale dalej jest nie dobrze. Procesor nie chce wstawać lub oled po podpięciu zasilania. Pomaga reset z basoma. Odliczanie nie działa bo auto wyłączenie następuje po około minucie.
    Pobór prądu po wyłączeniu znowu wzrósł do 690 mikro amper.

  • #21 22 Kwi 2017 12:20
    niveasoft
    Poziom 34  

    Myślę, że nie załączyłeś całego kodu i dlatego nie ma się jak do tego odnieść.

    Mam tylko przeczucie, że tutaj przydałaby się instrukcja Initlcd

    Ten OLED po podłaczeniu zasilania wymaga przesałania mu kilkunastu bajtów konfiguracyjnych. Kiedy więc podcinasz mu zasilanie wyłączając jakąś masę to po włączeniu też powinno mu się tę konfiguracje przesłać.

    Musiałbyś napisać Initlcd gdzieś na początku kodu za miejscem gdzie OLED dostaje już masę i potem w drugim miejscu zaraz po wybudzeniu (i oczywiście kiedy już ma zasilanie).

  • #22 23 Kwi 2017 12:30
    inspector_electro
    Poziom 22  

    Sprawdzę to. A dla czego prąd przy uśpieniu jest znowu duży? Nie pomaga teraz wyłączenie adc. Próbowałem też wyłączenia przerwań, ale nic kurde nie pomaga na obniżenie poboru prądu po uśpieniu. Komenda odlicz była ustawiona na 5. Nie działało to. Gdy ustawię 50, wtedy działa 5 sekund i gaśnie czyli ok.
    No i w końcu, procesor startuje za każdym razem po podaniu zasilania, pod warunkiem że do flagi lock dodam 1.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod



    Wklejam cały kod:


    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 4 [minuty]:

    Aha. PCINT2 na razie zostawiłem, bo w zestawie testowym mam inny port do detekcji ładowarki.

    Dodano po 19 [godziny] 49 [minuty]:

    Są postępy :D Udało mi się zejść z poborem prądu do 430 mikro amper. Choć można pewnie jeszcase mniej. Pomogło powyłączanie niektórych portów:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Nie mogę sobie tylko poradzić z wyświetlaniem statusu baterii, tzn. wyświetla ok. ale przy przejściu z baterii naładowanej na baterię "naładuj" to wraz ze skokiem odczytu ADC skacze mi napis i ikonka baterii. Nie mogę tego ustabilizować. Jeśli uda się to ogarnąć, to praktycznie byłby to ko niec projektu.
    Chyba że coś dołożę.

    Obsługa wyświetlania statusu baterii:


    Kod: vbnet
    Zaloguj się, aby zobaczyć kod




    Pokażę teraz zegarek który noszę już ze 2 miesiące i jest na starym, źle napisanym sofcie. Póki co testuję program w którym mi pomagasz Niveasoft, na innym zestawie, a docelowo dobry już program, wgram do gotowego zegarka.


    Bascom- znowu warunek IF-ELSE. Bascom- znowu warunek IF-ELSE. Bascom- znowu warunek IF-ELSE. Bascom- znowu warunek IF-ELSE. Bascom- znowu warunek IF-ELSE.

  • #23 23 Kwi 2017 14:18
    niveasoft
    Poziom 34  

    Można by to rozwiązać jakąś histerezą, ale chyba takie rozwiązanie z blokadą będzie tutaj lepsze.
    Kiedy ładuje i nie dobiło jeszcze do 4,18 i nie było wcześniej tego poziomu to pokazuje "Ładuje". Kiedy jednak chociaż raz bateria osiągnie poziom 4.18 to napis zmieni się na "Naładowany" a ustawiona flaga Bat_lock nie pozwoli już wrócić poprzedniemu napisowi aż do momentu odłączenia ładowarki.

    Jeśli chciałbyś żeby kiedyś tam znów zaczął pokazywać że ładuje to wystarczy gdzieś w kodzie dopisać "If Wynik < 3,80 Then Bat_lock = 0"

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #24 23 Kwi 2017 14:20
    inspector_electro
    Poziom 22  

    Dziękuję Ci. Pobawię się tym.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME