Witam Wszystkich Forumowiczów. Układ składa się z wyświetlacza LCD, Atmega8, DS18B20, 3 x switch (S1, S2, S3). Poniżej umieszczam swój obecny kod gdzie po naciśnięciu S3 wchodzę do dodatkowej pętli i tam ustawiam swoje parametry ale nie wiem jak dodać dodatkowe ustawienie. Proszę o jakąś podpowiedź, przykład jak mogę to rozwiązać? Z góry dziękuję :) '$sim $regfile = "m8def.dat" $crystal = 8000000 '******************************************************************************* Config Lcd = 16 * 2 Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 '******************************************************************************* Config Portb.1 = Input Portb.1 = 1 Config Portb.2 = Input Portb.2 = 1 Config Portb.3 = Input Portb.3 = 1 Config Portb.4 = Output Portb.4 = 0 Config Portb.5 = Output Portb.5 = 0 Config Portd.6 = Output Portd.6 = 1 Config 1wire = Portb.0 '******************************************************************************* Dim Liczba As Single Dim Eliczba As Eram Single At 2 Dim Buzz As Single Dim Hist As Single Dim Lsb As Byte Dim Msb As Byte Dim T As Single Dim Tekst As String * 4 Dim Tmin As Single Led Alias Portb.4 Przek Alias Portb.5 Buzzer Alias Portd.6 '******************************************************************************* Buzz = 30 Hist = 5 Cls Cursor Off Lcd " Termostat " Lowerline Lcd " do pieca C.O. " Wait 2 Cls Do '****************** Program sterownika ***************************************** Tmin = Liczba - Hist Readeeprom Liczba , Eliczba If T > Liczba Then Przek = 1 Led = 1 End If If T < Tmin Then Przek = 0 Led = 0 End If If T > Buzz Then Buzzer = 0 End If If T < Buzz Then Buzzer = 1 End If If Pinb.3 = 0 Then Waitms 500 Do Cls Locate 1 , 1 Lcd " GRANICA TEMP " Locate 2 , 1 Lcd "USTAW: " ; Liczba ; Chr(0) ; "C" Waitms 100 If Pinb.1 = 0 Then Incr Liczba End If Waitms 200 If Pinb.2 = 0 Then Decr Liczba End If If Liczba > 80 Then Liczba = 80 If Liczba < 20 Then Liczba = 20 If Pinb.3 = 0 Then Writeeeprom Liczba , Eliczba Waitms 100 Exit Do End If Loop End If '****************** Odczyt temperatury ***************************************** 1wreset 1wwrite &HCC 1wwrite &H44 Waitms 750 1wreset 1wwrite &HCC 1wwrite &HBE Lsb = 1wread() Msb = 1wread() ' T = Msb * 256 T = Msb Shift T , Left , 8 T = T + Lsb ' T = T / 16 Shift T , Right , 4 Tekst = Fusing(t , "#.#") '******************************************************************************* Cls Locate 1 , 1 Lcd "TEMP: " ; Tekst ; Chr(0) ; "C" Locate 2 , 1 Lcd "NAST: " ; Liczba ; Chr(0) ; "C" Waitms 100 Loop End
|
|||
Re: Menu
trzeba sobie zrobić zmienną poz_ust, która będzie numerowała ustawienia. Jesli poz_ust =0 to exit do, natomiast kliknięcia S3 robią incr poz_ust, aż do momentu gdy skończą się ustawienia. Jeśli mamy 2 parametry do ustawienia to dajemy:
W momencie pierwszego kliknięcia na S3 ustawiamy poz_ust = 1, a do menu ma wchodzić jesli poz_ust > 0
Dla przycisków S1 i S2 tworzy się instrukcje case:
i powinno już działać. To wszystko jest tak ogólnie napisane, normalnie program powinien byc tak napisany aby nie było w nim ani jednej instrukcji waitms, wait itp. Od tego są timery
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Re: Menu
To ja Ci pokażę ciekawy sposób na zagnieżdżanie menu w menu. Wyświetlanie podmenu jest zależne od tego czy pozycja wyżej została wybrana na tak czy na nie.
Zrób sobie wybór na select case i jak wkleisz ten mój kod to zobaczysz jakie można mieć fajnie złożone menu.
Nadmienię że jest to kawałek menu do sterownika bramy wjazdowej na full wypasie, który powoli piszę i projektuję.
Moja strona w powijakach
Menu
Dziękuję za odpowiedź ale mam pytanie dodatkowe:
Ten kawałek kodu umieszczam w pętli tak?
Czy opcję select case mam wrzucić do pętli głównej?
Czy mogę to rozwiązać to w ten sposób jak przykład poniżej?
Czy lepszym rozwiązaniem będzie:
Czy to menu działa jeszcze w inny trzeci sposób czyli w case 1 i 2 ustawiam że S1 to będzie dodawać 1 natomiast S2 będzie odejmować 1 a pozycje i wybór zmieniam w tej dodatkowej zmiennej poz_ust??
Z góry dziękuje za pomoc.
Kolego matrix dziękuje za kod jak rozgryzę dokładnie o co chodzi w tym select case to na pewno wykorzystam i Twoj pomysł :)
Pozdrawiam
Re: Menu
Nie wiem co chesz osiągnąć, ale pewnie masz jakiś cel pisząc to tak a nie inaczej.
Pisząc menu na select case działanie wygląda następująco:
1 - początek pętli
2 - procesor sprawdza czy naciśnięto przycisk
3 - instrukcja sprawdza ile wynosi zmienna pozycja_menu
4 - jeśli zmienna pozycja_menu wynosi 1 to wykonane będzie to co w linii 5
5 - instrukcje do wykonania
6 - jeśli zmienna pozycja_menu wynosi 2 to wykonane będzie to co w linii 7
7 - instrukcje do wykonania
8 - jeśli zmienna pozycja_menu wynosi 3 to wykonane będzie to co w linii 9
9 - instrukcje do wykonania
10- koniec sprawdzania ile wynosi zmienna pozycja_menu
11- wróć na początek
12- koniec
Kolejno procesor sprawdza czy naciśnięto przycisk i przechodzi do następnej linii. Teraz instrukcja select case sprawdza ile wynosi zmienna pozycja_menu. Jeśli wynosi 1, 2 lub 3, lub też tyle ile wpisałeś w którejś linii select case to wykonuje to co jest umieszczone w danym select, linia po linii aż wykona wszystko i natrafi na następne case.
Moja strona w powijakach
Menu
Napisałem taki programik i jest problem. Po naciśnięciu przycisku S3 wyświetlacz na zmianę pokazuję wszystko co się powinno wyświetlać w case 1 oraz podczas pracy termostatu.
Co chciałem osiągnąć: po naciśnięciu przycisku S3 chce wejść w ustawienia temperatury granicznej. Po ponownym naciśnięciu S3 przechodzę do ustawień alarmu. Po kolejnym naciśnięciu S3 zapisuję ustawienia i wychodzę do normalnej pracy termostatu. Parametry zmieniam za pomocą S1 i S2.
Czy przy takim moim programie nie mam włączonego ciągłego zapisywania ustawień w procesorze?
Re: Menu
Za każdym razem kiedy zmienna menu przyjmuje wartość 0 to masz ciągłe zapisywanie do eepromu. Zmień ten kawałek:
Na taki kawałek:
Wtedy gdy wartość menu zmieni się na 0 zapisze Ci ustawienia, zwiększy wartość menu do 1 i już będzie wykonywało się to co w select case pod wartością 1.
Taka drobna rada. Nie czyść za każdym razem wyświetlacza komendą cls, bo będziesz miał zauważalne migotanie wyświetlacza. Lepszym sposobem jest takie napisanie programu żeby tylko nadpisywać poszczególne partie lcd.
Moja strona w powijakach
Menu
Dalej jest problem :( po włączeniu zasilania ekrany przeskakują pomiędzy tą częścią programu:
a ta częścią programu:
dlaczego tak się dzieje? nie mogę nic ustawić , żadnych parametrów :( kurcze nie rozumiem tego select case :(
Pomyśl trochę. Dlatego że
Pomyśl trochę. Dlatego że to:
masz poza wszelkim select case. W ogóle masz strasznie źle napisany ten program. Wysypie Ci się to.
Sam select case napisz tak:
Moja strona w powijakach
Menu
Zmieniłem swój program na taki:
Po włączeniu zasilania program wchodzi od razu do Case:1. Czy w tym case 1 muszę umieścić ten kawałek kodu?:
Teraz menu wyświetla się w takiej kolejności jak chcę ale jest problem z ustawieniem parametrów ponieważ naciskając S1 i S2 nie zmienia się nic na wyświetlaczu temperatura cały czas jest 0'C. Jak to rozwiązać?
Re: Menu
Więc wywal ustawianie poza selct case.
Wszelkie ustawienia rób poza select case a tylko wyświetlanie tego co Cię interesuje w danym momencie zrób wewnątrz.
Moja strona w powijakach
Menu
Spróbuję tak zrobić ale nie wiem czy to zadziała ponieważ musiałem wrzucić pomiar temperatury do case 1 bo nie wykonywało pomiarów cały czas była wyświetlana jedna temperatura nawet po podgrzaniu czujnika.
Kolego matrix to nic nie daje :( jak program może wiedzieć kiedy ustawiam zmienną Liczba albo Buzz jak wszystko jest w jednej pętli i sterowane tymi samymi przyciskami? Nie rozumiem tego :(
Najpierw pomyślunek
Żeby coś dobrze napisać to najpierw trzeba wszystko przemyśleć. Opracować jakiś konspekt, blokowy schemat działania całego programu.
Napisz to od nowa tylko zrób tak.
Zastanów się czy musisz pobierać temperaturę na bieżąco? Jeśli tak to czy kilkaset razy na sekundę czy wystarczy Ci raz na sekundę lub rzadziej?
Napisz to przerwanie a w nim odczyt temperatury.
Pętla do...loop ma zawierać obsługę klawiszy oraz select case gdzie będzie wyświetlane to co ma być wyświetlane.
Podziel cały program na małe podprogramy. Na przykład napisz podprogram zapisu danych do pamięci eeprom.
W tej chwili jak dla mnie to masz groch z kapustą.
Napisz dokładnie co i kiedy chcesz regulować. Napiszę Ci ogólny zarys co gdzie masz umieścić.
Moja strona w powijakach
Re: Menu
Moja strona w powijakach
Menu
Dziękuję za pomoc :) ciekawe rozwiązanie z tymi pętlami w podprogramie. Sporo programów które przeglądałem nie miało tam pętli dlatego nie wiedziałem że tak to można stosować :) kolejna lekcja programowania. Napisałem program według wskazówek i powstało takie coś:
Problem jaki zauważyłem to że gdy chce nacisnąć S3 czyli "ok" muszę albo dłużej przytrzymać albo kilka razy nacisnąć nie zawsze wchodzi w podprogram :( Czy musze użyć funkcji "Debounce"?
Poeksperymentuj z długościami
Poeksperymentuj z długościami instrukcji wait. Ja zwykle ich nie stosuję jeśli mam gdzieś tam użyte timery. Jeśli nie mam timerów lub jeśli timery są aktualnie wyłączone to korzystam z wait do woli. Poza tym staram się unikać wait.
Jeśli użyjesz debounce to wait przy naciskaniu przycisków już nie będzie Ci potrzebne. I ostatnia moja uwaga odnośnie takiego fragmentu:
Jeśli przed pętlą wyświetliłeś napis USTAW i jego ustawienia to nie wpisuj tego ponownie. Po to wpisujesz przed pętlą do...loop to co się nie zmienia żeby nie powtarzać tego w pętli i żeby niepotrzebnie nie odświeżać lcd.
Jeśli przed pętlą napisałeś:
To po wejściu do pętli nie powtarzaj tego tylko napisz:
W ten sposób nadpisujesz tylko te pola które trzeba zmienić a nie wszystkie.
Moja strona w powijakach
Menu
Dzięki wielkie za pomoc i za wskazówki :) na pewno coś pokombinuję :)
rozklad liczby 16 bitowe na 8
Witam
Dzieki tej stronce udalo mi sie uruchomic pamiec.
Teraz mam inny problem.
Mam zmienna np 1030,chialbym ja zapisac do pamieci.
Oczywiscie nie zmiesci sie w jednem adresie, wiec musz eto rozbic na dwa.
Czy moge prosic i jakis przyklad, jak to wrzucic w pamiec i odzczywac, a potem skleic w jedno?
Mam problem z rozbiciem takiej liczby na dwie 8 bitowe i zapis juz jest prosty, ale odczyt i zlozenie ponowne..nie wiem jak.
Oczywiscie bascom.
Pozdrawiam
Re: zapis EEPROM
Do zapisu dzielisz liczbę na dwa bajty:
Do odczytu:
Masz odczytane Hbyte i Lbyte, zatem:
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.