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

[Rozwiązano] [BASCOM]Sprawdzenie kodu licznika

29 Cze 2018 22:36 867 28
  • Poziom 17  
    Witam kolegów mam pytanie czy można ten kod jakoś uprościć i czy w tej formie da się wygasić zera nieznaczące? Czy tylko z funkcją bin2bi

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 17  
    Dzięki kolego za odpowiedz uczę się więc nie wszystko robię profesjonalnie usypianie nie jest mi potrzebne bo procesor zasilany z zasilacza . Teraz to będzie lepsze?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 17  
    Spróbuję poczytać o uśpieniu i coś wykombinuje i spytam czy dobrze ,wielkie dzięki koledze za odpowiedz .
  • Użytkownik usunął konto  
  • Poziom 17  
    Witam ponownie kombinowałem z takim kodem i nadal nie wiem jak pozbyć się zer nieznaczących
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 31  
    Przeorganizowałem twój kod z pierwszego postu bo w tym z dzieleniem i modulo to może działać ślamazarnie. Jeśli ci pasuje oczywiście. Licznik obsługuj w przerwaniu timera. A zmieniaj tylko wartość zmiennej za pomocą przycisków. To musisz sobie dopisać.
    Gdyby obliczenia w przerwaniu były za długie, przenieść je do głównej pętli, ale tutaj zawsze będzie dylemat jednoczesnej zmiany wartości gdzie zliczasz (abcd) oraz wartości Licznik, oraz tego jak wyświetlasz (w przerwaniu).

    Można też sprawdzać warunki zer.
    Jeśli A=0 to nie wyświetlasz A,
    jeśli A = 0 i B = 0 to nie wyświetlasz B
    jeśli A = 0 i B = 0 i C = 0 to nie wyświetlasz C

    Nie wiem czy to będzie działać bo na szybcika.
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Poziom 17  
    Kolego trol.six nie mogłem poradzić sobie jak te ify wstawić w Select Case : wielkie podziękowania . Zostałem przy drugiej wersji programu czyli przy dzieleniu i mod bo nie rozumiem znaczenia zmiennej "Obslugalicznika" ale będę analizował twój pomysł. Kolego nowyARM program pisałem z Polską wersją pomocy tam nic o ctc nie pisze ale poczytam.

    Dodano po 14 [minuty]:

    Teraz to wygląda tak z tym że podświetla mi inne segmenty jak cyfra jest poniżej 99 to jest ok jak już 100 to podświetla mi segment G i zmienia segmenty w zależności od wyświetlanej cyfry .
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 17  
    Obsługuje bo są tematy nawet tu na elektrodzie muszę poczytać choć wszystko fajnie działa poza tym podświetlaniem innych segmentów i zależy gdzie obliczam cyfrę jak w pętli głównej to podświetla cały czas jak w zaliczaniu i zerowaniu to mruga tylko przy zwiększaniu. Dam do przerwania niema reakcji wyświetla zero tak jak by licznik nie pracował.
  • Użytkownik usunął konto  
  • Poziom 31  
    1. Acha... bo ty w programie liczysz ilość kliknięć? Tak?
    Myślałem że chcesz liczyć czas.

    2.
    nowyARM napisał:
    Jak używa zmiennych Bascom, nikt nie wie poza twórcą

    Ale można sobie co nie co poczytać. Może zły konfig dla ramu?
    https://avrhelp.mcselec.com/index.html?memory_usage.htm
    I trzeba zwiększyć wartości:
    $hwstack = 40
    $swstack = 16
    $framesize = 32

    Dla dzielenia i modulo, wywołań itp itd... może się w ramie stos nadpisywać.

    3. Czy przypadkiem nie powinno być RETURN w funkcji Zaliczanie?

    4. Nie zrozumiałem co dokładnie mruga ale może ci mrugać ponieważ zmienne: "jednosci dziesiatki setki tysiace", masz liczone w petli głównej i nie są one zsynchronizowane z przerwaniem. Zawsze przy dostępie do tych samych zmiennych w przerwaniu i pętli głównej będziesz miał ten problem.

    Przerwanie następuje w dowolnej chwili i przerywa ci wykonywanie dzielenia i modulo. Można to rozwiązać np przez atomowe kopiowanie wszystkich jakiś zmiennych.

    Jak już bardzo chcesz zostać przy modulo i dzielenie to zrub np tak:
    Dodałem zmienne L1,L10,L100,L1000 i uprosciłem przerwanie.
    Jeśli to ma być licznik kliknięć, to konwersje dałbym w zliczaniu,
    zmodyfikować trzebaby też zerowanie:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    .
  • Użytkownik usunął konto  
  • Poziom 17  
    Tak kolego zliczam ilość wciśniętych przycisków . A to mruganie to podświetlanie segmentów cyfry dziesiątek jak na wyświetlaczu już jest ponad sto i to samo z wyświetlaczem setek jak na wyświetlaczu ponad tysiąc . Poprawiło się czyli przygasły choć nadal są widoczne po takiej zmianie czyli dzielenie/mod dałem do podprogramu .
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Skok do podprogramu wpisz musi być w zaliczaniu i zerowaniu wtedy podświetlanie
    występuje przy wciśniętym S1 jeśli dam do pętli głównej wtedy podświetla cały czas.

    Dodano po 40 [minuty]:

    Koledzy mruganie zlikwidowane jeszcze zapalanie zera przy przejściu z 9 na 10 i tak dalej ale już mam pomysł jak to usunąć jak wrócę do domu to sprawdzę i pokaże kod

    Dodano po 2 [godziny] 9 [minuty]:

    Koledzy kod wygląda tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    chętnie przyjmę sugestie odnośnie stylu i składni

    Dodano po 17 [godziny] 4 [minuty]:

    Koledzy zapalanie zera potem 1 przy przejściu z 9 na 10 było spowodowane złym ustawieniem Timer0 tera wszystko działa jak chciałem . Wielkie dzięki za zainteresowanie tematem kolegom mam nadzieję że ktoś się wypowie składni programu lub optymalizacji . Teraz wygląda to tak ;
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Poziom 36  
    adamekamator napisał:


    Koledzy zapalanie zera potem 1 przy przejściu z 9 na 10 było spowodowane złym ustawieniem Timer0 tera wszystko działa jak chciałem . ........... mam nadzieję że ktoś się wypowie składni programu lub optymalizacji .


    Mimo że program ten wydaje sie byc poprawny , bo jakoś tam pracuje, ma jednak kilka błędów.
    Na pierwszy rzut:
    1. Deklarujesz zmienne ‘E’ oraz ‘I’ - co one przedstawiaja?
    2. Zmienne reprezentujace wartości cyfr: jedności, dziesiątek, setek, tysięcy; nigdy nie będą większe niż 9 (!) i zmieszcza się w jednym bajcie, gdy tymczasem u ciebie sa zwymiarowane jako czterobajtowe. Patrz alternatywne rozwiązanie niżej.
    3. Podobnie zmienna licznik, ograniczona do 9999 , zupełnie zmieści się w zmiennej typu ‘word’.
    4. Wyglada że wzorowałeś się na podobnym programie pisanym pod Mega8. Tam jest taki kiepski timer0 (a właściwie Counter0) że nie ma wyboru i ustawia się go jak tryb ’Normal’, potrzebujący ‘pomocy’ processora do wpisywania mu kazdorazowo wartości początkowej.
    5. Wbudowany w Maga16 Timer0 ma do wyboru tryb CTC nie wymagający tej czynności i z niego wypadałoby korzystac.
    Ustawiasz tylko raz na początku paramery pracy i timer ten pracuje bez żadnej dodatkowerj ingerencji.
    Sposób konfiguracji będzie w przykładzie.
    6. Zastosowanie wielocyfrowego wyświetlacza LED wymaga oddzielnego dostępu do każdej cyfry wyswietlanej liczby. Metoda dzielenia i stosowania ‘modulo’ , którą masz w subrutynie ‘Wpisz’ nie jest w zasadzie błędna, lecz nieco kłopotliwa. W zamian tego przeanalizuj możliwośc zastosowania bascomowej funkcji ‘Str2digits’. Przykład ponizej wyjaśnia jej praktyczne stosowanie i wykorzystanie, szczególnie przydatne do wygaszanie ‘frontowych’ zer, korzystając z pierwszej wartości w array ‘Ar(1)’.
    7. Czy faktycznie wymagane jest ‘debounce’ dla przycisku S2?
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Przetestuj podany przykład: ‘step-by-step’ (F8) w symulatorze, zmieniając wartości licznika i obserwuj zmiany na niebieskim tle terminala.
    Nie jest to oczywiście cały twój program, bo nie taką miałem intencję, a jedynie sugestia alternatywnego, moim zdaniem prostszego rozwiązania…
    Byc może coś z tego wykorzystasz(?)...

    e marcus
  • Poziom 17  
    Kolego emarcus namieszałeś mi troszkę z tą funkcją ‘Str2digits’ ale nie umiem tego wyświetlić! Poprawiłem trochę kod zmniejszyło 7% na 6% :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 17  
    Niewiele nie oto chodzi bo raczej ma za mały opis wiec troszkę minie zanim ogarnę oco w tym chodzi jestem w pracy wiec niema za wiele czasu by popróbować .
  • Użytkownik usunął konto  
  • Pomocny post
    Poziom 36  
    adamekamator napisał:
    Kolego emarcus namieszałeś mi troszkę z tom funkcją ‘Str2digits’ ale nie umiem tego wyświetlić!

    Nie zrozumiaeś ’ni w ząb’ z tego co ci opisałem:
    Funkcja ta (Str2digits)_ zastępuje całkowicie twój rachunek umieszczony w subrytynie ‘Wpisz’, a zatem nie sa już potrzebne zmienne A, B, C i D reprezentujace poszczególne cyfry wyswietlanej liczby.
    W odpowiedzi funkcja ta (jedna linia kodu !!!) wypełni ci array (wcześniej zdefiniowany jako Ar()), w którym pierwszy element (index =(1) mówi ile cyfr zawiera twoja liczba (przydatne dla wygaszenia poczatkowych zer, - o tym nizej(*), natomiast nastęne kolejne elementy to twoje cyfry (A,B,.C,D).
    Dokladniej, licząc od prawej strony wyświetlacza:
    A = Ar(2)
    B = Ar(3)
    C = Ar(4)
    D = Ar(5)

    (*) Wyswietlasz wynik posługując się ‘Select case’, gdzie sensorem jest numer wyswietlacza (-tak masz?)
    Więc dalej, zamiast pytac: czy liczba (twój licznik) jest więksa od 10, 100. 1000, aby wygasic zera; wstawisz warunek czy numer tego wyświetlacza jest większy od Ar(1), - i jeżeli jest większy, to go nie załączasz - ‘else’ – następuje zwyczjna rutyna.
    Mam nadzieję że cię nie zgubiłem......
    Byłem pewny, że załaczony przykład w poprzednim poście obrazowo wyjaśni koncept stosowania tej funkcji.

    Jedynie co dodatkowo jest wymagane to zamiana gotowej liczby numerycznej (tej, którą masz wyświetlic) na ‘string’ co nie powinno nastręczac problemu (-takze jedna linia kodu) .
    Dokładniejszego opisu tej funkcji nie znajdziesz, bo jest ona tak prosta że nie wymaga kommentarza.

    Czy jaśniej teraz, czy cię zgubiłem?......

    e marcus
  • Poziom 17  
    Tak myślę że dużo jaśniej tylko czemu jak robię taki zapis nic nie wyświetla tylko same zera?
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 29 [minuty]:

    Próbowałem MAKEBCD ale tam tylko dwie cyfr i stosowanie maski na pewnej stronie trafiłem na na funkcje dec2bcd działa podobnie jak MAKEBCD tylko na kilka cyfr tyle że moja wersja kompilatora tego nie obsługuje , znalazłem funkcje mod i poszukałem znalazłem przykłady i zadziałało. Założyłem temat by sprawdzić składnie i czy mam jakieś większe błędy, i dzięki koledze emarcus zyskałem 1% pamięci bo były deklarowane zbędne zmienne i niepotrzebne Debounce na zerowaniu licznika, oraz inni koledzy którzy dając przykłady pomogli usunąć błędy powodujące dziwne działanie. Gdy będzie więcej czasu kolego emarcus to popróbuje z tą funkcją od ciebie.

    Dodano po 4 [godziny]:

    Koledzy czy (Str2digits) powinno po wpisaniu podświetlić się na niebiesko? jak MAKEBCD.

    Dodano po 2 [godziny] 13 [minuty]:

    W końcu jest tak jak kolega emarcus chciał? Czy ma jeszcze jakieś sugestie spostrzeżenia które z chęcią przeczytam :D . Powodem była zła wersja bascoma miałem 2.0.7.5. a teraz mam 2.0.7.8. Coś takiego skleciłem
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Poziom 36  
    adamekamator napisał:


    W końcu jest tak jak kolega emarcus chciał? Czy ma jeszcze jakieś sugestie spostrzeżenia które z chęcią przeczytam

    Nie zupełnie tak chciał....(!)

    Poza tym nie jest łatwo analizowac twój program bo masz niekonvencjonalnie sporządzoną tabelę cyfr(!)
    przekonvertuj tabelę i podłączenie segmentów wg. kolejności jak niżej: (o wiele łatwiej analizowac)...
    bit portu: ---> segm.
    bit 0 ---> a
    bit 1 ---> b
    bit 2 ---> c
    bit 3 ---> d
    bit 4 ---> e
    bit 5 ---> f
    bit 6 ---> g
    wtedy tabela byłaby:
    ‘======================================
    Cyfra:
    Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111
    ‘======================================
    Spróbuj takiej konstrukcji (troche poprawionej). Coś powinno wyświetlic, a wtedy skorygujesz ewentualne błędy.
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Nie testowałem tego, więc nie masz gwarancji...
    Wytestuj i uzupełnij w/g potrzeb.

    e marcus
  • Poziom 17  
    Dziękuje właśnie wczoraj się zastanawiałem gdzie ma byc zamiana licznika i w do...loop czy w przerwaniu bo w obu miejscach działa. Potrzebuję opóźnienia jeżeli zostawię Debounce domyślnie to zalicza mi drgania styków widać switch są już wypracowane . Wypróbuję twój styl bibloteki jeszcze raz wielkie podziękowania za pomoc i sugestie.

    Dodano po 21 [minuty]:

    Tak podłączone miałem tak pina.0=kr. pina.1=g-pina.7=A po zamianie pinów i wgraniu twojej tabelki cyfr wyszły krzaczki ale spróbuje twoją technikę przyswoić.
  • Poziom 17  
    Kolego emarcus umie kody wyglądają tak
    bit 0 ---> a
    bit 1 ---> b
    bit 2 ---> c
    bit 3 ---> d
    bit 4 ---> e
    bit 5 ---> f
    bit 6 ---> g
    wtedy tabela byłaby:
    ‘======================================
    Cyfra:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    '0 1 2 3 4 5 6 7 8 9
    ‘======================================

    Dodano po 13 [godziny] 12 [minuty]:

    Mam takie pytanie o troszkę inny kod a mianowicie zrobiłem odziwo działający sterownik PWM potencjometrem i wyświetlam to na led 7 seg , chodzi oto ze na wyświetlaczu wynik pokazuje 0-1024 a chce wartość napięcia ADC(0) . Co zrobiłem źle ? Sprawdzi mi któryś z kolegów i troszkę naprowadzi? Wiem panie moderatorze powinienem napisać nowy temat.

    Dodano po 2 [minuty]:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 36  
    adamekamator napisał:


    Mam takie pytanie o troszkę inny kod a mianowicie zrobiłem odziwo działający sterownik PWM potencjometrem i wyświetlam to na led 7 seg , chodzi oto ze na wyświetlaczu wynik pokazuje 0-1024 a chce wartość napięcia ADC(0) . Co zrobiłem źle ?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Przekonvertuj wartośc 'I' (odczyt ADC) na proprcjonalną wartośc napięcia.
    Zakładajac że napiecie referencyjne wybierzesz 5V (5000mV), to odczyt napięcia będzie:
    V= Wart_adc1*5000/1023; otrzymany wynik będzie w [mV]
    albo ostatecznie: I = V, zatem
    I = Wart_adc1*4.887

    e marcus
  • Poziom 17  
    Fajnie ze się odezwałeś jak mogę spytać to ma być to zawsze tak :
    Wart_ADC*wartość nap. ref/1023 licznik 16bit lub 255 licznik 8bit czy się mylę?

    Dodano po 11 [minuty]:

    wywala błąd "35" spodziewano się 3 parametrów

    Dodano po 12 [minuty]:

    Wielkie podziękowanie Kolego działa pokazuje 0-5.115 wygląda to tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 11 [minuty]:

    Niestety nie całkiem bo dioda zachowuje się tak jak by nie było tego zapisu :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Użyłem tego działania bo dioda rozjaśnia się 4 razy za cały obrót potencjometru
    Czemu tak jest zły config ADC ?

    Dodano po 1 [godziny] 41 [minuty]:

    Widzę że nie takie to łatwe bo PWM uzależnione od wyświetlanej cyfr na wyświetlaczu a mianowicie jak wyświetla 256 to świeci maksymalnie 257 gaśnie i przy 511 świeci max .Więc czeka mnie literatura i próby , wieczorem zamknę temat bo kod licznika sprawdzony i zoptymalizowany za co wielkie podziękowania wszystkim co się udzielali.
  • Poziom 17  
    Fajnie ze się odezwałeś jak mogę spytać to ma być to zawsze tak :
    Wart_ADC*wartość nap. ref/1023 licznik 16bit lub 255 licznik 8bit czy się mylę?

    Dodano po 11 [minuty]:

    wywala błąd "35" spodziewano się 3 parametrów

    Dodano po 12 [minuty]:

    Wielkie podziękowanie Kolego działa pokazuje 0-5.115 wygląda to tak:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 11 [minuty]:

    Niestety nie całkiem bo dioda zachowuje się tak jak by nie było tego zapisu :
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Użyłem tego działania bo dioda rozjaśnia się 4 razy za cały obrót potencjometru
    Czemu tak jest zły config ADC ?

    Dodano po 1 [godziny] 41 [minuty]:

    Widzę że nie takie to łatwe bo PWM uzależnione od wyświetlanej cyfr na wyświetlaczu a mianowicie jak wyświetla 256 to świeci maksymalnie 257 gaśnie i przy 511 świeci max .Więc czeka mnie literatura i próby , wieczorem zamknę temat bo kod licznika sprawdzony i zoptymalizowany za co wielkie podziękowania wszystkim co się udzielali.

    Dodano po 4 [godziny] 21 [minuty]:

    Dzięki pomocy i sugestiom kolegów