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

Licznik do skutera - Z wyświetlaczem od Siemensa

04 Sty 2016 14:00 2151 26
  • Poziom 21  
    Witam.

    Cóż, przejdę od razu do rzeczy, otóż próbuje od kilku dni zrobić sobie licznik jak w tytule. Niestety nie idzie mi. Znaczy część elektroniczną ok, mam atmegę 120 + wyświetlacz od siemensa s-65. Wyświetlam na nim tekst lub obrazki, ale problemem jest dla mnie napisanie fragmentu kodu (musi być w bascom) który by wyświetlał prędkość. Koniecznie chcę to zrobić na timerze1 w trybie przechwytywania bo z tego co przeczytałem to by była najdokładniejsza metoda pomiaru.
    Niestety jestem kiepski z bascoma (ale nie mam zamiaru uczyć się innego języka) i dlatego potrzebował bym czyjejś pomocy.

    Pozdrawiam
  • IGE-XAO
  • Użytkownik usunął konto  
  • Poziom 21  
    Ciężko mi jest ogarnąć ten timer1, jakoś nie umiem sobie z tym poradzić. Jak tą wartość przechwycić i wyliczyć...
    Chciałbym wynik odświeżać co ok pół sekundy (bo to wbrew pozorom ma być licznik do skutera)

    Proszę to fragment kodu (niezły bajzel):
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    nie bijcie... za ten kod ;-)

    cóż, kombinuję dalej ale mam na lcd jakieś przypadkowe liczby:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • IGE-XAO
  • Poziom 14  
    niveasoft napisał:
    Napisałem już taki program do roweru ze "wspomaganiem elektrycznym" pedałującego :D
    Impuls tylko jeden na jeden obrót koła..

    Przepraszam, czy to są wolne żarty ?
    Prosty przykład.
    Rower typu składak i rower Ukraina.
    Jakie są średnice kół tych rowerów ?
    Jak ma się obwód koła do przebytych 100 metrów względem średnicy koła ?
    Jaka jest różnica przebytego odcinka 100 metrów do impulsu koła w tym przykładzie ?
    Pomijam fakt zbyt małego, lub dużego ciśnienia w dętce, co przekłada się na błędny odczyt (plus-minus).
    Wiem, że można iść na skróty, ale czy na tym polega nauka ?
    By sprostać takiemu wyzwaniu, jakie przedstawił autor tematu nie wystarczy ilość obrotów koła na dany odcinek.

    Podsumowując licznik musi wiedzieć jaka jest średnica koła, następnie dokonać odpowiednich obliczeń.
  • Poziom 21  
    Cóż, chcę mierzyć czas między otrzymywanymi impulsami. Znając ten czas (no i obwód koła) resztę można już wyliczyć.
    Na razie chcę uzyskać właśnie ten czas z timera1 w atmedze i go (na razie) wyświetlać na lcd
    A że chcę to zrobić "dokładnie" to chcę wykorzystać funkcję przechwytywania.
  • Użytkownik usunął konto  
  • Poziom 14  
    Ależ ja się nie gorączkuję.
    niveasoft napisał:
    Chciałem autorowi tematu napisać
    Lecz tego nie zrobiłeś.
    niveasoft napisał:
    Pisałem o tym że na jeden obrót koła przypada tylko jeden impuls z kontaktronu.
    I tu się nasuwa pytanie, czy musi to być kontaktron ?
    Oczywiście nie, jest wiele czujników ruchu.
  • Poziom 21  
    Panowie spokojnie.
    Na razie chcę znać odcinek czasu po między impulsami (czujnik taki jak przy liczniku rowerowym) i jak ten czas zapisać do zmiennej (dajmy na to np. "czas"). Resztę obliczeń, to wiadomo, że jest potrzebny obwód koła.
    Mikrokontroler jaki mam to ATMEGA 128 taktowana zegarem 16MHz
  • Użytkownik usunął konto  
  • Poziom 21  
    Waitam.

    Czy ten kod (testowy), jest prawidłowy?
    Pytam, ponieważ niestety nie ma żadnej rekcji na przyciski. Czyżby były uszkodzone porty atmegi? Oczywiście sprawdzałem na innych portach i jest to samo. Ale wgrywając fragment kodu do obsługi lcd (s-65), to na wyświetlaczu jest ok, czy porty mogą się uszkodzić ale tylko jak są skonfigurowane na wejściowe?

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 21  
    Ok, dzięki Sugerowałem się takim samym programem z książki. Tam dokładnie było tak samo, no może wykonywały inne zadanie niż u mnie.

    Edit:
    Ale dałem ciała, patrzę w książkę i faktycznie jest jeszcze "pin", ehh

    Dzięki

    No więc z przyciskami już jest ok, ale wracając do kodu pokazującego wartość z licznika timer1, pokazują się bzdury. Po dodaniu kondensatora równolegle z czujnikiem, wartość na wyświetlaczu zatrzymuje:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 21  
    Czyli podciąganie do plusa czałego portu to set portd a pojedyńczego pinu to set portd.1


    Czyli jako wejscie mogę napisać: cały port - config portd = input albo pojedyńczy pin np config portd.1 = input?

    a odczytywać tylko pojedyńcze piny lub port : to pind.1 lub cały port pind?

    a z tym start timer to pozostałość po czymś innym (nie zauważyłem), dzięki.

    No więc zmieniłem i... teraz n liczniku mam cały czas zero.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod
  • Poziom 21  
    Wybaczcie za post pod postem.

    Niestety wartość wyświetlana wynosi cały czas zero. Jedynie jak wyłączę w programie podciągniecie pinu, to się pokazuja jakieś bzdury. Czyżby atmega uwalona?

    Spróbowałem użyć tego pinu (pd4) w innym programie jako przycisku dla testu czy reaguje. Niestety nie działa. Wychodzi więc na to , że atmega ma coś uwalonego. Na innych pinach przyciski działają.
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 21  
    Prosze, jest to kod na którym bazuję.
    Znalazłem gdzieś w sieci oraz jego przerobioną wersję na oscyloskop. Któryś z użytkowników zamieszczał go nawet na forum:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Schematu nie ma. Jest to po prostu sama atmega z kwarcem (no i oczywiście kondensatory) na takiej kwadratowej płytce z wyprowadzonymi wszystkimi pinami na każdym boku. Do tego jest podłączony krótkimi przewodami wyświetlacz LCD z siemensa. No i czujnik z roweru, którego jeden koniec jest do masy a drugi do portu atmegi (PD4) i to wszystko.

    Testując porty odłączyłem czujnik a zamiast niego podłączyłem kilka microswitchy do portu C atmegi a jeden "ten tzw góra" do PD4. Fragment kodu podałem koledze na PW. Tu jest całość. Wszystkie przyciski (na porcie C) działją i wyświetlają, to co powinny. Ale przycisk z PD4 już nie.
    Zaczyna pokazywać losowo ten tekst "góra" jak wyłączę programowe podciągnięcie pinu do plusa.

    Przyciski są podpięte jednym wyjściem do masy a drugim podłączone pod porty.


    I to tyle, zestaw prosty bo testowy.

    Port podciągnięty (programowo) nie reaguje na nic a po wyłączeniu podciągnięcia reaguje jakby ktoś coś naciskał (nie mając nwet nic do tego pinu podłączonego).
    Tak więc wychodzi na to że port jest uszkodzony.
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 21  
    Witam.

    Ogólny zarys menu w moim (przyszłym) liczniku na obecną chwilę wygląda tak jak na załączonym filmie. Wiadomo, później zmienię czcionki i kolorystykę. Póki co to do testów jej jaka jest.

    Na chwilę obecną mam problem z wpisywaniem wartości w podmenu "obód koła", tzn nie wiem jak zrobić aby przy "klikaniu" w przycisk wartość się zwiększała o jeden, ale po przytrzymaniu przycisku wartość zaczęła rosnąć co np 20. A wartości jakie chcę tam umieszcząć mają się mieścić z przeziału od 700 do 4000, więc naklikać od zera do 1500 to już jest masakra.

    Niestety, po przejrzeniu internetu i wielu tematów na elektrodzie, nawet jak coś znajduję, to nie potrafię tego wykorzystać a jeśli nawet na tych przykładach coś stworzę, to mi nie niestety nie działa.

    Drugi pomysł na wprowadzanie tego parametru, to taki, że jak wejdę w podmenu "obwód koła", to najpierw będą dodawanie co jeden. Jeśli nacisnę w lewo to zacznie dodawać co 10, jak jeszcze raz w lewo to co sto a jak jeszcze raz w lewo to co tysiąc. W momencie jak jeszcze raz nacisnę w lewo to znowu co jeden. Oczywiście powinno podświetlać cyfrę którą aktualnie zmieniam.
    Tylko że w tym wypadku bym musiał dodać jeszcze jeden przycisk, bo teraz klikając w lewo, wychodzę z podmenu do menu.
    Po za tym tu już w ogóle nie wiem jak się za to zabrać. Dlatego pierwszy pomysł byłby chyba lepszy.
    Kod który aktualnie mam i pokazany na filmie, jest taki:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod



    Link


    Oczywiście ta wartość ma być zapamiętana w eepromie (i jest) a później odczytana i ta zmienna wprowadzona do obliczeń od prędkości.

    Działa dodawanie o jeden przy każdym kliku.


    Ponieważ niestety nie potrafię sobie z tym poradzić to proszę o pomoc.


    Ps. w tym kodzie na razie nie ma fragmentu który liczy i pokazuje na lcd aktualną prędkość, bo chwilowo jest nie potrzebny. Ale jak ktoś chce to mogę go pokazać. Na razie mam problem z tym co powyżej.
  • Użytkownik usunął konto  
  • Poziom 21  
    Dzięki niveasoft.

    Ja to wymyśliłem w ten sposób (i nawet działa). Aby nie dodawać jeszcze jednego przycisku, to użyłem do tego celu tylko w "prawo".
    Muszę tylko jeszcze jakoś wykombinować podświetlenie aktualnie zmienianej cyfry.

    Co sądzicie o takim rozwiązaniu?

    Podaję znowu cały kod:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Oczywiście później analogicznie zrobię to do odejmowania.

    Aaaa, i jeszcze muszę jakoś ograniczyć wartość którą ustawiam. Zdecydowałem, że powinna mieć od 1000 do 4000 (mm).

    edit:

    No więc fragment kodu odpowiedzialny za wybranie (i podświetlenie) aktualnie edytowanej cyfry. No i oczywiście zapis do eepromu.
    Tak to teraz wygląda:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [godziny] 6 [minuty]:

    Wybaczcie że post pod postem.

    Ogólny zarys licznika działa. Jednak teraz nawet jak jestem w menu a "koło" stoi w miejscu, to pokazuje mi na lcd "00".
    Oczywiście ma tak pokazywać ale tylko w programie głównym.

    fragment programu który stosowałem wygląda tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Jak mam to zrobić aby "00" pokazywało się tylko jak jestem w głównym programie?
  • Poziom 39  
    Nie myślałeś o zastosowaniu jako "nastawnika" impulsatora (enkodera obrotowego) z przyciskiem np EC11? Kręcisz w prawo dodajesz, w lewo odejmujesz, przyciskiem zatwierdzasz lub wychodzisz.
  • Poziom 21  
    Przeszło mi to przez myśl, jednak nie mam na stanie żadnego impulsatora. No i na razie jest to budżetowa konstrukcja, robie z tego co mam w szufladach. Ale kto wie, może jak powstanie następna wersja to może zastosuje impulsator.

    No więc teraz w miarę licznik działa. Po zatrzymaniu czujnika zera pokazują się tylko na ekranie głównym. Program wygląda tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Teraz chwilowo stoję z pracą nad licznikiem, bo czekam na czujnik temperatury i kwarc zegarkowy.
    Temperatura otoczenia ma byś zrealizowana na ds18b20 (cholera, myślałem, że gdzieś mam a jednak nie i musiałem kupić) a data i czas na pcf8583 bo taki mam (nawet smd) .

    Mam nadzieję, że przed weekendem będę miał części.
    Jeśli chodzi o stronę wizualną, to niestety nie mam jakoś głowy do takich rzeczy. Przeglądałem wiele podobnych projektów ale jakoś nie umiem się zdecydować.

    Zauważyłem że czasami licznik pokazuje dziwne wskazania prędkości. Raz np 60 a raz 200. Ale to chyba wina tego czujnika, bo jak go strzelę palcami, to wszystko wraca do normy. Chyba go zmienię na czujnik halla.
  • Poziom 21  
    Przepraszam za post pod postem...

    No więc tak, połączyłem program od wskazań temperatury z czujnika i licznik. Niby wszystko działa ale... po za trzymaniu "koła" licznik nie chce wskazać "00". Jeśli jednak usunę podprogram "termometr", to w tedy pokazuje "00". Powiedzcie mi proszę jak (gdzie) mam zrobić aby ta funkcja działała

    Oto kod:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod



    Heh, widzę, że pisanie na forum pomaga w rozwiązaniu problemu :-)

    Już sobie z tym poradziłem, wystawiając flagę, jeśli licznik osiągnie przepełnienie.


    No witam znowu.

    Cóż, mam następujący problem. Nie podoba mi się w jaki sposób jest wyświetlana temperatura. Tzn jest szeroka i brzydka. Chciałbym przecinek i liczbę po nim wyświetlić mniejszą czcionką (8x8). Powiedzcie mi proszę jak to uzyskać.

    Licznik do skutera - Z wyświetlaczem od Siemensa
  • Użytkownik usunął konto  
  • Poziom 21  
    Hmm, to znaczy że bym musiał uruchomić drugi timer (8 bitowy). Z tego co pamiętam, to przy maksymalnym dzielniku wychodzi 1 albo 2 sekundy. I w momencie przepełnienia sprawdzać prędkość?
    Co do pokazywania zer to ogarnąłem wykrywając przepełnienie timera 3 i w tym momencie wyświetlanie zer.

    cóż wiem , że program pewnie wg Ciebie (z resztą wg mnie też) nie jest optymalny, ale hmm... w sumie jest to mój chyba pierwszy tak zaawansowany program.

    Masz rację, chcę jeszcze dorzucić kilka rzeczy tzn:
    - jeszcze jeden odczyt temperatury (z czujnika płynu chłodzącego) pewnie przez ADC
    - liczbę obrotów
    - przejechany dystans (który można zerować)
    -całkowity dystans (ale on będzie nie kasowalny i do podejrzenia w menu
    - godzina i data

    Co do czcionek trutype coś czytałem ale nie ogarniam , więc korzystam z czcionek bascomowych (tą 24x40 sam zrobiłem w bascomie i to tylko cyfry aby mniej zajmowały).
    Wymyśliłem sobie że temp można by rozbić na liczby przed i za przecinkiem na dwa teksty a w tedy można by już każdy wyświetlić inną czcionką ale nie umiem tego zrobić.

    Hmm, bascom pokazuje mi że program zajmuje tylko 10 procent.

    A jeszcze co do pisania programu, to każdą część piszę osobno i jeśli działa to łączę w jeden program. Pewnie dlatego wygląda jak taki zlepek. :| no ale cóż inaczej nie umiem.
    Jeśli chodzi o te 100ms to już go nie ma w cale, bo gdzieś doczytałem, że jeśli DS'a podłączymy na trzech przewodach, to nie trzeba czekać na odczyt temperatury.



    EDIT.

    Poradziłem sobie w ten sposób, że mnożę temperaturę przez 10, później ją dzielę i stosuję funkcję MOD. i.... działa :D

    Licznik do skutera - Z wyświetlaczem od Siemensa