Witam.
Napisałem taki program do sekundnika i mam problem z obsługą przycisków. Chciałbym zrobić tak żeby przyciskiem S1 zmniejszać minuty i godziny zaś S2 sekundy i dziesiątki sekund, a gdy nacisnę oba przyciski na raz wystartuje lub stanie zliczanie sekund. W pewnym sensie mi się to udało lecz aby zatrzymać zliczanie muszę kilka razy nacisnąć oba przyciski. Prosiłbym o jakieś wskazówki ponieważ nie mam już pomysłu jak to zrobić.
Schemat płytki jest na stronie:
http://www.google.pl/imgres?imgurl=http://www.frogger.ovh.org/ele/schemat.jpg&imgrefurl=http://www.elektroda.pl/rtvforum/topic1167767.html&usg=__F1kJlRA_Vfmrao2otEKCY0-9Myk=&h=535&w=813&sz=107&hl=pl&start=0&zoom=1&tbnid=Kvn5-masyol-JM:&tbnh=113&tbnw=172&prev=/images%3Fq%3Davr%2B2313%2BschemaT%26um%3D1%26hl%3Dpl%26client%3Dfirefox-a%26rls%3Dorg.mozilla:pl:official%26biw%3D1600%26bih%3D671%26tbs%3Disch:1&um=1&itbs=1&iact=rc&dur=452&ei=Y7EgTaijNdCEhQeK9fy3Dg&oei=i7AgTbTaCcip8QORv62EBw&esq=9&page=1&ndsp=34&ved=1t:429,r:18,s:0&tx=79&ty=25
$crystal = 4000000
Dim Sekundy As Byte
Dim Dziesek As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Obs_wys As Byte
Dim Flaga1 As Bit
Flaga1 = 0
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B11111111
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 64
Enable Interrupts : Enable Timer0 : Enable Timer1
On Timer0 Co4ms
On Timer1 Cols
Start Timer0
Stop Timer1
S1 Alias Portd.0
S2 Alias Portd.1
Do
If S1 = 0 Then
Waitms 70
If S1=0 And S2=0 And Flaga1 = 0 Then
Start Timer1
Flaga1 = 1
Else
Debounce S1 , 0 , Pr2 , Sub
End If : End If
If S2 = 0 Then
Waitms 70
If S2 = 0 And S1 = 0 And Flaga1 = 1 Then
Stop Timer1
Flaga1 = 0
Else
Debounce S2 , 0 , Pr1 , Sub
End If : End If
Loop : End
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Pr1:
Stop Timer1
If S1 = 1 And S2 = 0 Then
Waitms 25
Incr Sekundy
If Sekundy = 10 Then
Sekundy = 0
Incr Dziesek
If Dziesek = 10 Then
Dziesek = 0
Flaga1 = 0
Return
End If : End If : End If
Pr2:
Stop Timer1
If S1 = 0 And S2 = 1 Then
Waitms 25
Incr Minuty
If Minuty = 10 Then
Minuty = 0
Incr Godziny
If Godziny = 10 Then
Godziny = 0
Flaga1 = 0
Return
End If : End If : End If
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Co4ms: ' obsługa wyświetlaczy co 4,096ms
Incr Obs_wys : If Obs_wys = 4 Then Obs_wys = 0 : Portd = &B1111111
Select Case Obs_wys ' obsługa wyświetlacza
Case 0: 'wyświetl zawartość licznika jednostek minut
Portb = Lookup(sekundy , Tabela) : Portd.3 = 0
Case 1: 'wyświetl zawartość licznika dziesiątek minut
Portb = Lookup(dziesek , Tabela) : Portd.4 = 0
Case 2: 'wyświetl zawartość licznika jednostek godzin
Portb = Lookup(minuty , Tabela) : Portd.5 = 0
Case 3: 'wyświetl zawartość licznika dziesiatek godzin
Portb = Lookup(godziny , Tabela) : Portd.6 = 0
End Select : Return 'koniec obsługi przerwania od T/C0
Cols:
Timer1 = 3036
Incr Sekundy
If Sekundy = 10 Then
Sekundy = 0
Incr Dziesek
If Dziesek = 10 Then
Dziesek = 0
Incr Minuty
If Minuty = 10 Then
Minuty = 0
Incr Godziny
If Godziny = 10 Then
Godziny = 0
End If : End If : End If : End If : Return
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Tabela: 'potrzebna do wyświetlenia cyfr 0...9
'Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
Data 144 , 128 , 248 , 130 , 146 , 153 , 176 , 164 , 249 , 192
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Re: Program
ja bym ten program zrobił inaczej... gdzie znalazłeś taka propozycję programu z wait w środku do loop...... w ogóle nie powinieneś używać tych poleceń.... Nie rozumiem jeszcze jednego: jak na 4 wyświetlaczach prezentujesz sekundy, dzies. sekund, minuty i godziny?
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.
Program
Program pisałem sam. Jeszcze mało wiem o Bascomie. Mała pomyłka, ogólnie jest to sekundnik który liczy od 0 do 9999s lub odwrotnie.
Re: Sekundnik
Sprawdż tak.... tylko dopisz sobie akcje do kombinacji przycisków we wskazanym miejscu i powinno działać.... normalnie da sie to zrobic jeszcze prościej.. popatrz do moich procedur obsługi klawiatury
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.
Czyli w te wskazane miejsca
Czyli w te wskazane miejsca mam dopisać:
Debounce S1 , 0 , Pr2 , Sub
Debounce S2 , 0 , Pr1 , Sub
Pr1:
Stop Timer1
If S1 = 1 And S2 = 0 Then
Waitms 25
Incr Sekundy
If Sekundy = 10 Then
Sekundy = 0
Incr Dziesek
If Dziesek = 10 Then
Dziesek = 0
Flaga1 = 0
Return
End If : End If : End If
Pr2:
Stop Timer1
If S1 = 0 And S2 = 1 Then
Waitms 25
Incr Minuty
If Minuty = 10 Then
Minuty = 0
Incr Godziny
If Godziny = 10 Then
Godziny = 0
Flaga1 = 0
Return
End If : End If : End If
???
Re: Sekundnik
Nie... broń boże... debunce jest do kitu... zawiera w środku wait'y itp polecenia których się nie stosuje.... we wskazanym miejscu masz dopisać akcję przycisku.... czyli co ma robić, czyli np:
beż żadnego waitms itp poleceń
w drugim miejscu podobnie dla minut
a w ostatnim miejscu po prostu StartTimer1 i tyle
Zmienna licz(x) zapewnia automatycznie obsługę styków usuwanie drgań
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.
Sekundnik
Niestety nie udało mi się tego uruchomić. Program wygląda tak:
Sekundnik
Jakbyś mógł mi jeszcze wytłumaczyć o co chodzi z tą zmienną licz(x) to byłbym bardzo wdzięczny.
Re: licznik
Masz zmienną flaga która ustawia się co około 4ms w przerwaniu.... potem w głównej pętli masz sprawdzanie flagi i program goniący w pętli nic nie robi dopóki flaga nie będzie 1.... zwalnia to przerwanie od robienia głupot takich jak obsługa klawiatury lub wyświetlacz.... szczerze mówiąc w przerwaniu w tym przypadku powinno być tylko set flaga i nic więcej
Nie działa ci bo narobiłeś głupot.... wrzuciłeś byle jak do kodu polecenia ustawiające... skasowałeś na końcu do loop End if od flagi i teraz nie wiadomo którego ifa to dotyczy...... zacznij jeszcze raz od kodu który ci podałem..... wklej obsługę tak jak teraz ale zrób wcięcia w kodzie żeby był czytelny.... w pierwszym wklejonym fragmencie jest za dużo End if i program robi głupoty..... wzoruj się na tym co ci wysłałem, zapis i forma a będzie działało
Obsługa przycisków jest banalna..... jak są jednocześnie naciśnięty klawisz S1 a s2 nie to zwiększa się licznik od 40 który ustawia się zawsze jak nic nie naciskasz do 50 czyli liczy 10 x 4ms i reakcja na switch następuje pop 40ms, następna reakcja po trzymaniu będzie po 200ms bo jak przycisk jest trzymany to licznik się zeruje a nie ustawia na 40.
Zadumaj się nad ifami bo z bezmyślnego wklejania nic ci nie przyjdzie... podobnie jak z pisania komend jedna pod drugą bez żadnych wcięć
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.
Sekundnik
Poprawiłem program i dalej nic. Naciskanie przycisków nic nie zmienia. Dopiero od niedawna uczę się programować w BASCOMIE stąd tyle pytań, a ten układ muszę zrobić na zaliczenie I semestru pracowni. Ten program który wstawiłem za pierwszym razem zaproponował mi mój nauczyciel a tu dowiedziałem się że waity w do loop w ogóle nie powinny występować.
Re: Program
Spróbuj tak......
Jak napisałem Ci w którym miejscu masz wrzucić fragment kodu, to nie rozumem czemu modyfikujesz inne fragmenty kodu wstawijąc end if w losowe miejsce. Patrz wyżej ..... nie masz prawa wyjść kodem poza te komentarze z gwiazdkami....
Sens z wcięciami jest taki że zawsze jak coś jest wcięte na dwie spacje to wewnątrz nie może być coś wcięte na jedną... to jest fizycznie niemożliwe.... potraktuj zewnętrzny if i wszystko co jest w środku jako "pojemnik", w tym "pojemniku" znajdują się instrukcje i może być drugi if "pojemnik".... nie jest możliwe aby wewnętrzny if kończył się instrukcją end if poza ifem zewnętrznym w którym się znajduje.... czyli:
takie coś natomiast to jakiś bezsens i utrudnia analizę programu, będzie to działać o ile dobrze sa dane end if
To co napisałeś po zrobieniu poprawnych wcięć wygląda tak, więc działanie uległe cołkowitej zmianie.... co z tego że się przekompilowało jak trudno ocenc co to dokładnie zrobi:
Program który podałeś to pzykład z "Mikroprocesorowej oślej łączki" wydanej na łamach EdW, napisanej do płytki która jest w linku
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.
Sekundnik
Niestety dalej nic. Program nie reaguje na żadne naciśnięcie przycisku.
Re: Przyciski
Jasne że nie reaguje..... przoczyłem na początku zamiast:
daj:
czytanie trzeba zrobic z rejestru wejściowego a nie wyjściowego
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.
Sekundnik
Wszystko się zgadza tylko mi chodziło o to żeby startować Timer1 naciskając S1 i S2 a potem stopować Timer1 tymi samymi przyciskami.
Re: sekundnik
Teraz masz tak że staruje się dwoma naraz a naciśniecie ustawien wyłącza timer, zrób sobie jeszcze zmienną bitową
ustawiaj trun = 1 wszędzie tam gdzie timer 1 ustawiasz na start a trun=0 tam gdzie zatrzynmujesz timer... wostatnim przycisku będzie wtedy
w przyciskach S1 i S2 wywal stop timer1
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.