3*timer na ATMEGA 8


Witam,nie znam się na pisaniu programów,mam zamiar zacząć naukę.Potrzebuję zbudować sterownik który będzie posiadał 3 timery np.do 90s każdy z możliwością programowania czsu pracy+zapis,osobne przyciski START i wyjścia dla timera 1,2, i 3 ,dodatkowo jedno wyjście w ATMEGA załączone na stałe gdy żaden z timerów nie pracuje (po wystartowaniu timera 1,2,lub 3 wyjście przechodzi w stan WYŁ).Stany wyświetlane na LCD 2*16.Czy wogle jest możliwe zrealizowanie tego na ATMEGA 8.Proszę o jakieś sugestie i kody źródłowe.




Portret użytkownika matrix

Re: 3*timer na ATMEGA 8

Do odliczania różnych czasów na procesorze wcale nie potrzeba tylu timerów. Wystarczy jedna podstawa czasu (jeden timer) plus kilka zmiennych i po problemie.

Portret użytkownika marekszy

3*timer na ATMEGA 8

dzięki za podpowiedź,niestety dla mnie to wyzwanie,tak jak elektronika nie stanowi żadnego problemu to w programowaniu leżę.

Portret użytkownika matrix

Re: 3*timer na ATMEGA 8

marekszy wrote:
niestety dla mnie to wyzwanie,tak jak elektronika nie stanowi żadnego problemu to w programowaniu leżę.

No to trzeba trochę poczytać.

Portret użytkownika mirley

Re: Timery

Co dokładnie chcesz zrobić z tymi timerami, ma to sobie tak poprostu liczyć do 90s i nic? Do tego zastosowania wystarczy jeden timer

-

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.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Timery mają w zależności który przycisk nacisnę (1,2 lub3) włączyć odpowiednie urządzenie na czas nastawiony z przedziału do 90s,z tym,że pracuje tylko w danej chwili 1,2 lub 3 (nie może być możliwości załączenia np.2jednocześnie,praca jednego z nich blokuje pozostałe). dodatkowo jedno wyjście z ATMEGI przechodzące w stan wył.(normalnie zał.)gdy pracuje jeden z timerów. 3 przyciski start/stop dla timerów + 3 wyjścia zał., 1 wyjście wspólne wył.gdy pracuje jakiś timer.
Może to i banalnie proste,ale dla mnie to pewnie za parę miesięcy.
pozdrawiam.

Portret użytkownika matrix

Re: 3*timer na ATMEGA 8

Może powiedz co za urządzenie planujesz to będziemy mieli łatwiej Ci pomóc.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Urządzenie ma za zadanie sterować przez przekaźniki elektrozaworami w prysznicu wrażeń(ciepły deszcz,zimny deszcz,bryza poranna),dadatkowe wyjście ma za zadanie po włączeniu jednej z funkcji wyłączyć oświetlenie na czas działania jednej z atrakcji. Dodatkowo chciałbym mieć możliwość zminy czasów (ale to już w samum sterowniku).

Portret użytkownika marekszy

3*timer na ATMEGA 8

witam,widzę ,że temat skomplikowany,czy w takim przypadku jest możliwość przerobienia układu "Prosty Timer"z AT89C2051 na ATMEGA 8 i dołożenie tego co chciałem wyżej(SW1,SW2,SW3-jako start dla t1,t2 lub t3;dla każdego timera wyjście na przekaźnik-zał.gdy timer pracuje;1 wyjście na przekaźnik-wspólne dla trzech timerów).Przypominam,że praca jednego timera nie pozwala uruchomić pozostałych oraz każdy ma możliwość ustawiania czasów.
Pozdrawiam

Portret użytkownika mirley

Re: Timery

Program nie jest skomplikowany ale nikt za Ciebie go nie napisze od podstaw. Zacznij od konfiguracji timera napisz cos co odlicza czas w sekundach. Wstaw tu jakiś kod to pomożemy Ci uzupełnić

-

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.

Portret użytkownika marekszy

3*timer na ATMEGA 8

ok,trochę mi zejdzie,zakupiłem książkę M.Wiązani,czekam na dostawę wtedy pokombinuję.Mam nadzieję ,że po przeczytaniu i testach coś ruszymy.
Pozdrowienia.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Narysowałem schemat i napisałem początek programu,co dalej

/files/user_img/u758/pocz%C4%85tek%20kodu.png

niestety nie wiem jak to dołączyć,pozdrawiam

Portret użytkownika mirley

Re: Timery

Normalnie kod skopiuj z bascoma i wklej w tekst posta.... potem zaznacz cały kod co wkleiłeś i kliknij przycisk BAS u góry formularza. Niestesty nic nie widać z twojego kodu

-

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.

Portret użytkownika marekszy

3*timer na ATMEGA 8

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejście
 
Config Lcd = 16 * 2                                         'konfiguracja wyświetlacza
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls
Cursor Off Noblink
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
Sw4 Alias Pind.4
Sw5 Alias Pind.3
Sw6 Alias Pind.2
Sw7 Alias Pind.1
Sw8 Alias Pind.0
 '****konfiguraja timera0 do zliczania 1s****
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
Do
Loop
End
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
End If
Return

Portret użytkownika lukk13

przykład odliczania

Witam,
proste odliczanie 90s

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejście
 
Config Lcd = 16 * 2                                         'konfiguracja wyświetlacza
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls
Cursor Off Noblink
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
Sw4 Alias Pind.4
Sw5 Alias Pind.3
Sw6 Alias Pind.2
Sw7 Alias Pind.1
Sw8 Alias Pind.0
 '****zmiene, stale sterujące on/off
   const czas_zadany = 90    '90 sekund - max działanie przekaźnika
   dim czas_odliczany as byte 
 
 
 '****konfiguraja timera0 do zliczania 1s****
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
Do
'****najprostsza obsługa przycisków to debounce *******************
   debounce sw1 , 0, Pr1, sub
   debounce sw2 , 0, Pr2, sub
   debounce sw3 , 0, Pr3, sub
   debounce sw4 , 0, Pr4, sub
   debounce sw5 , 0, Pr5, sub
   debounce sw6 , 0, Pr6, sub
   debounce sw7 , 0, Pr7, sub
   debounce sw8 , 0, Pr8, sub
Loop
End
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
	Licz_8ms = 0
	if czas_odliczany > 0 then
		decr czas_odliczany   'zmniejszenie zmiennej o 1	
		if czas_odliczany=0 then
			gosub power_off
		end if
	end if 
End If
Return
'***wylaczenie wszystkiego 
power_off:
  reset Przekaznik1
  reset Przekaznik2
  reset Przekaznik3
  reset Przekaznik4
return
'****on przekaźnik nr 1
pr1:
gosub power_off
  set przekaznik1
  czas_odliczany=czas_zadany
  return
'****on przekaźnik nr 2
pr2:
  gosub power_off
  set przekaznik2
  czas_odliczany=czas_zadany
return
'****on przekaźnik nr 3
pr3:
  gosub power_off
  set przekaznik3
  czas_odliczany=czas_zadany
return
'****on przekaźnik nr 4
pr4:
  gosub power_off
  set przekaznik4
  czas_odliczany=czas_zadany
return

Pisane z głowy(niekompilowane) mogą być błędy.
Stosuj wcięcia w kodzie, łatwiej się połapać co do czego należy.
Niestety nie wiem nic z twojego schematu (za mały), napisz co dokładnie ma robić kolejne przyciski,
napewno brakuje rezystorów podciągających (np 3,3k)- bez nich może "świrować"
zamiast debounce można użyć również instrukcj if..waitms

Portret użytkownika marekszy

3*timer na ATMEGA 8

Dzięki za przykłady, wygląda to dosyć prosto,pokombinuję i zastosuję jako sterownik tymczasowy. W wersji końcowej sterownik będzie dużo bardziej skomplikowany, SW1 start/stop na ustawiony czas załącza PK1,PK4,SW2-PK2,PK4,SW3-PK3,PK4.Załączenie SW1 ma zablokować na czas pracy możliwość wybrania SW2 i SW3, to samo jak działa SW2 blokuje SW1 i SW3 itd. Pozostałe przyciski mają służyć do możliwości zmiany czsów timerów 1,2,3 z podglądem na LCD oraz zapisem do pamięci SW4-menu/ok, SW5-up,SW6-down,SW7-left,SW8-right.Mam nadzieję ,że coś wykombinujemy,wieczorem spróbuję dać większy schemat.Jeszcze raz dzięki za wsparcie dla zaczynającego przygodę z pisaniem w języku BASCOM.

Portret użytkownika marekszy

/files/user_img/u758/schemat%

/files/user_img/u758/schemat%20czas%C3%B3wki%20x%203.zip
link do schematu,nie wiem jak będzie wyglądał,spakowany.

Portret użytkownika marekszy

3*timer na ATMEGA 8

***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejście
 
Config Lcd = 16 * 2                                         'konfiguracja wyświetlacza
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls
Cursor Off Noblink
'*****przypisanie nazw przekazników*******
Przekaznik1 Alias Portb.0                                   'zał.gdy pracuje timer 1
Przekaznik2 Alias Portb.1                                   'zał.gdy pracuje timer 2
Przekaznik3 Alias Portb.2                                   'zał.gdy pracuje timer 3
Przekaznik4 Alias Portb.3                                   'zał.gdy pracuje timer 1 albo 2 albo 3
 '******przypisanie przycisków******
Sw1 Alias Pind.7                                            'timer 1 start/stop
Sw2 Alias Pind.6                                            'timer 2 start/stop
Sw3 Alias Pind.5                                            'timer 3 start/stop
Sw4 Alias Pind.4                                            'wejście do menu/ok
Sw5 Alias Pind.3                                            'up
Sw6 Alias Pind.2                                            'down
Sw7 Alias Pind.1                                            'left
Sw8 Alias Pind.0                                            'right
 
Set Portd.0                                                 'rezystory podciągające dla przycisków
Set Portd.1
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
 
'*******obsługa przycisków**********
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Debounce Sw4 , 0 , Pr4 , Sub
Debounce Sw5 , 0 , Pr5 , Sub
Debounce Sw6 , 0 , Pr6 , Sub
Debounce Sw7 , 0 , Pr7 , Sub
Loop
End
 
 '****konfiguraja timera0 do zliczania 1s****
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
Do
Loop
End
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
End If
Return

Portret użytkownika lukk13

Przed naukom programowania w

Przed naukom programowania w BasCom, dobrze by było się zapoznać z podstawami algorytmów - ułatwi ci to życie z uC.

działanie i schemat już łapia
a więc:
on/off sw1->pk1,pk4
on/off sw2->pk2,pk4
on/off sw3->pk3,pk4
trochę namieszałeś w kodzie masz dwie główne pętle loop..do
odrobina kodu do analizy (standardowo napisane na kolanie :) ):

***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejście
 
Config Lcd = 16 * 2                                         'konfiguracja wyświetlacza
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls
Cursor Off Noblink
'*****przypisanie nazw przekazników*******
Przekaznik1 Alias Portb.0                                   'zał.gdy pracuje timer 1
Przekaznik2 Alias Portb.1                                   'zał.gdy pracuje timer 2
Przekaznik3 Alias Portb.2                                   'zał.gdy pracuje timer 3
Przekaznik4 Alias Portb.3                                   'zał.gdy pracuje timer 1 albo 2 albo 3
 '******przypisanie przycisków******
Sw1 Alias Pind.7                                            'timer 1 start/stop
Sw2 Alias Pind.6                                            'timer 2 start/stop
Sw3 Alias Pind.5                                            'timer 3 start/stop
Sw4 Alias Pind.4                                            'wejście do menu/ok
Sw5 Alias Pind.3                                            'up
Sw6 Alias Pind.2                                            'down
Sw7 Alias Pind.1                                            'left
Sw8 Alias Pind.0                                            'right
 
Set Portd.0                                                 'rezystory podciągające dla przycisków
Set Portd.1
Set Portd.2
Set Portd.3
Set Portd.4
Set Portd.5
Set Portd.6
Set Portd.7
 
 
 
 
 '****konfiguraja timera0 do zliczania 1s****
	Config Timer0 = Timer , Prescale = 256
	On Timer0 Odmierz_1s
	Dim Licz_8ms As Byte
	Enable Interrupts
	Enable Timer0
	Load Timer0 = 250
'****zmiene, stale sterujące on/off
   	const czas_zadany = 90    '90 sekund - max działanie przekaźnika
   	dim czas_odliczany as byte 
	dim aktywny_pro as byte
aktywny_pro=0
Do
'*******obsługa przycisków**********
	Debounce Sw1 , 0 , Pr1 , Sub
	Debounce Sw2 , 0 , Pr2 , Sub
	Debounce Sw3 , 0 , Pr3 , Sub
	Debounce Sw4 , 0 , Pr4 , Sub
	Debounce Sw5 , 0 , Pr5 , Sub
	Debounce Sw6 , 0 , Pr6 , Sub
	Debounce Sw7 , 0 , Pr7 , Sub
Loop
End
'***taimer********
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
	Licz_8ms = 0
	if czas_odliczany > 0 then
		decr czas_odliczany   'zmniejszenie zmiennej o 1	
		if czas_odliczany=0 then
			select case aktywny_pro
				case 1: 
						gosub pr1
				case 2: 
						gosub pr2
				case 3: 
						gosub pr3
			end select
		end if
	end if 
End If
Return
'*wyłączenie wszystkiego
power_off:
  	reset Przekaznik1
  	reset Przekaznik2
  	reset Przekaznik3
  	reset Przekaznik4
return
'****on przekaźnik nr 1
pr1:
	if aktywny_pro=0 then			
		aktywny_pro=1	
  		set przekaznik1
		set przekaznik4
  		czas_odliczany=czas_zadany
	end if
	if aktywny_pro = 1 then
		reset Przekaznik1
	  	reset Przekaznik4
		aktywny_pro=0
	end if
return
'****on przekaźnik nr 2
pr2:
	if aktywny_pro=0 then
  		aktywny_pro=2
  		set przekaznik2
		set przekaznik4
  		czas_odliczany=czas_zadany
	end if
	if aktywny_pro = 2 then
		reset Przekaznik2
	  	reset Przekaznik4
		aktywny_pro=0
	end if
return
'****on przekaźnik nr 3
pr3:
	if aktywny_pro=0 then
  		aktywny_pro=3
  		set przekaznik3
		set przekaznik4
  		czas_odliczany=czas_zadany
	end if
	if aktywny_pro = 3 then
		reset Przekaznik3
	  	reset Przekaznik4
		aktywny_pro=0
	end if
return

a tak w ogóle to używany będzie tylko jeden timer ( a dokładnie timer0 ), czy chodzi ci o możliwość ustawienia niezależnych czasów?
np.
sw1 na 30s
sw2 na 90s
sw3 na 59s
( oczywiście dowolna zmiana tych parametrów.)

Portret użytkownika marekszy

3*timer na ATMEGA 8

Trochę się z tym pobawiłem i na chwilę obecną wywaliłem niepotrzebne rzeczy w schemacie i programie.Fusebity ustawiłem na wewnętrznym oscylatorze 8MHz,wszystko skompilowało się dobrze,niestety po wgraniu nie reaguje na nic,na wyjściach przekaźników jest cały czas stan niski.

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejści
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
 
Set Portd.5                                                 'rezystory podciągające dla przyciskó
Set Portd.6
Set Portd.7
 '****konfiguraja timera0 do zliczania 1s****
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*******zmienne,stałe sterujące on/off*****
Const Czas_zadany = 90                                      '90 sekund-czas max działania przekaźnika
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
Do
 
'********obsługa przycisków**********
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End
 
'******timer********
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o1
If Czas_odliczony = 0 Then
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return
 
'*****wyłączenie wszystkiego******
Power_off:
Reset Przekaznik1
Reset Przekaznik2
Reset Przekaznik3
Reset Przekaznik4
Return
 
'****on przekaźnik nr.1/4*****
Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 1 Then
Reset Przekaznik1
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaźnik nr.2/4*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Przekaznik2
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 2 Then
Reset Przekaznik2
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaźnik nr.3/4*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Przekaznik3
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 3 Then
Reset Przekaznik3
Reset Przekaznik4
Aktywny_pro = 0
End If
Return

Portret użytkownika lukk13

może się gdzieś

może się gdzieś rombłem(chociaż nie wiem za bardzo gdzie ),
spróbuj przetestować same przyciski i przekaźniki np tak:

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejści
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
 
Set Portd.5                                                 'rezystory podciągające dla przyciskó
Set Portd.6
Set Portd.7
Do
 
'********obsługa przycisków**********
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End
 
 
 
 
'****on przekaźnik nr.1/4*****
Pr1:
	toggle Przekaznik1
Return
 
'*****on przekaźnik nr.2/4*****
Pr2:
	toggle Przekaznik2
Return
 
'*****on przekaźnik nr.3/4*****
Pr3:
	toggle Przekaznik3
	toggle Przekaznik4
Return

toggle -> zmiana stanu na przeciwny

Portret użytkownika marekszy

sprawdziłem obsługę

sprawdziłem obsługę przycisków i przekaźników (dopisałem jeszcze do PR1: i PR2: toggle przekaznik4),wszystko działa,tylko należy zezwolić na działanie 1 przycisku w danej sekwencji (gdy zał.SW1-przekaźnik 1/4 nie powinno być możliwości włączenia SW2 lub SW3 itd)w przeciwnym razie przekaźnik 4 zaczyna mieć różne stany.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Witam ,czy może jeszcze ktoś zerknąć na ten kod ,gdzie jest jakiś błąd,a może mam coś skopane w fusebit, przestawiłem w BASCOM tylko na 8MHz wewnętrzny.

Portret użytkownika mirley

Re: Timery

A co się dzieje po jego wgraniu? niestety nie mam czasu żeby to na płytce testowej sprawdzić

-

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.

Portret użytkownika marekszy

Re: Timery

No właśnie nic się nie dzieje,nie reaguje na przyciski tak jakby timer wcale nie pracował.

Portret użytkownika mirley

Re: Timery

Wstaw w tym miejscu w kodzie:

Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
 
toggle Przekaznik1         'wstaw to
 
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o1
If Czas_odliczony = 0 Then
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return

teraz bez naciskania przycisków powinien przekaźnik 1 zmieniać swój stan na przeciwny co 1s. Jeśli tak nie jest to timer nie chodzi. Możesz jeszcze dopisać Start Timer0 zaraz po enable ale wydaje mi się że powinien sam wystartować

-

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.

Portret użytkownika marekszy

Re: Timery

Niestety timer0 nie pracuje,nic się nie dzieje,wgrałem same ustawienie timera0 na 8000000MHz aby mrugał diodą dla sprawdzenia ustawień fusebit i dioda pięknie mruga co 1s,więc coś musi go blokować w programie.

Portret użytkownika marekszy

Re: Timery

w takim układzie przekaźnik zał.co sekundę jednak całość nie reaguje na przyciski.

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejści
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
 
Set Portd.5                                                 'rezystory podciągające dla przyciskó
Set Portd.6
Set Portd.7
 
 
'*****konfiguracja timer0*******
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*****zmienne,stałe sterujące on/off*****
Const Czas_zadany = 90                                      '90sek.-max działanie przekaźnika
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End
'*****timer*****
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
Toggle Przekaznik1
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o 1
If Czas_odliczony = 0 Then
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return
 
'*****wyłączenie wszystkiego******
Power_off:
Reset Przekaznik1
Reset Przekaznik2
Reset Przekaznik3
Reset Przekaznik4
Return
 
'******on przekaznik nr.1/4******
Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 1 Then
Reset Przekaznik1
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.2/4*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Przekaznik2
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 2 Then
Reset Przekaznik2
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.3/4*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Przekaznik3
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 3 Then
Reset Przekaznik3
Reset Przekaznik4
Aktywny_pro = 0
End If
Return

Portret użytkownika marekszy

Re: Timery

mam jeszcze jedno pytanie,czy te 2 fragmenty się przypadkiem nie dublują?

'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End

Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return

Portret użytkownika mirley

Re: Timery

Dopisz jeszcze na poczatku Portd = 255, tak wogóle to reszta pinów też powinna mieć jakąś wartość początkową.

Fragmenty się nie dublują bo w założeniu przycisk wywołuje odpowiedni podprogram a potem po odliczeniu czasu, case wywołuje drugi raz ten sam podprogram żeby wyłączyć przekaźnik

czekaj.... teraz dopiero zauważyłem... popatrz na procedurę :

Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Set Przekaznik4
Czas_odliczony = Czas_zadany
End If
If Aktywny_pro = 1 Then
Reset Przekaznik1
Reset Przekaznik4
Aktywny_pro = 0
End If
Return

Ta procedura nic nie robi.... aktywny_pro jest zero, wtedy ustawia się na 1 i włącza się przekaźnik, od razu wchodzi w następnego ifa i wyłącza przekaźnik i ustawia aktywny_pro spowrotem na 1. Zmień tą procedurę na taką:

Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Set Przekaznik4
Czas_odliczony = Czas_zadany
elseIf Aktywny_pro = 1 Then
Reset Przekaznik1
Reset Przekaznik4
Aktywny_pro = 0
End If
Return

i pozostałe tak samo

-

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.

Portret użytkownika lukk13

sorry mój błąd - dobrze że

sorry mój błąd - dobrze że go znalazłeś (),

Portret użytkownika marekszy

3*timer na ATMEGA 8

sprawdziłem,wszystko śmida jak należy,przyciski działają na zasadzie start/stop dla każdego timerka (tak jak chciałem),czas wspólny dla wszystkich ustawiamy programowo bez problemu.Wstawiam cały gotowy i przetestowany programik ,może się komuś przydać,jest dużo możliwości modyfikacji dla własnych potrzeb.
Podziękowania dla lukk13 i mirley-a

'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = Output                                       'wszystkie linie wyjście
Config Portc = Output                                       'wszystkie linie wyjście
Config Portd = Input                                        'wszystkie linie wejści
 
Przekaznik1 Alias Portb.0                                   'przypisanie nazw dla przekaźników
Przekaznik2 Alias Portb.1
Przekaznik3 Alias Portb.2
Przekaznik4 Alias Portb.3
 
Sw1 Alias Pind.7                                            'przypisanie nazw przycisków
Sw2 Alias Pind.6
Sw3 Alias Pind.5
 
Set Portd.5                                                 'rezystory podciągające dla przyciskó
Set Portd.6
Set Portd.7
 
 
'*****konfiguracja timer0*******
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*****zmienne,stałe sterujące on/off*****
Const Czas_zadany = 30                                      '30sek.-max działanie przekaźnika
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
 
'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Loop
End
 
'*****timer*****
Odmierz_1s:
Load Timer0 = 250
Incr Licz_8ms
If Licz_8ms = 125 Then
Licz_8ms = 0
If Czas_odliczony > 0 Then
Decr Czas_odliczony                                         'zmniejszenie zmiennej o 1
If Czas_odliczony = 0 Then
 
 
Select Case Aktywny_pro
Case 1:
Gosub Pr1
Case 2:
Gosub Pr2
Case 3:
Gosub Pr3
End Select
End If
End If
End If
Return
'*****wyłączenie wszystkiego******
Power_off:
Reset Przekaznik1
Reset Przekaznik2
Reset Przekaznik3
Reset Przekaznik4
Return
 
'******on przekaznik nr.1/4******
Pr1:
If Aktywny_pro = 0 Then
Aktywny_pro = 1
Set Przekaznik1
Set Przekaznik4
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 1 Then
Reset Przekaznik1
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.2/4*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Przekaznik2
Set Przekaznik4
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 2 Then
Reset Przekaznik2
Reset Przekaznik4
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.3/4*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Przekaznik3
Set Przekaznik4
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 3 Then
Reset Przekaznik3
Reset Przekaznik4
Aktywny_pro = 0
End If
Return

Jeszcze mam chęć powalczyć z możliwością zmiany czasu z przycisków + zapis oraz wyświetleniem tego na LCD,ale to póżniej.
Pozdrawiam marekszym.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Chciałem dołożyć do tego timera podwójny wyświetlacz LED ze wsp.anodą aby wyświetlał czas oraz możliwość jego zmiany dwoma przyciskami i zapis do eeprom,ale niestety poległem.Zmodernizowałem trochę kod, dałem cały portd na sterowanie katodami wyświetlacza i dołożyłem 2 przyciski +/-, ale niestety nie wiem jak ruszyć dalej

 '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb = &B00000000 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
 W1 Alias Portc.4                                           'anoda 1 wyswietlacza
 W2 Alias Portc.5                                           'anoda 2 wyswietlacza
 
 Sw1 Alias Pinb.0                                           'start program 1
 Sw2 Alias Pinb.1                                           'start program 2
 Sw3 Alias Pinb.2                                           'start program 3
 Sw4 Alias Pinb.3                                           'start program 4
 Sw5 Alias Pinb.4                                           '+ sekundy (ustawianie)
 Sw6 Alias Pinb.5                                           '- sekundy (ustawianie)
 
'*****konfiguracja timer0*******
Config Timer0 = Timer , Prescale = 256
On Timer0 Odmierz_1s
Dim Licz_8ms As Byte
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
'*****zmienne,stałe sterujące on/off*****
Const Czas_zadany = 45                                      '45sek.-max działanie przekaźnika
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
 
'******obsługa przycisków******
Do
Debounce Sw1 , 0 , Pr1 , Sub
Debounce Sw2 , 0 , Pr2 , Sub
Debounce Sw3 , 0 , Pr3 , Sub
Debounce Sw4 , 0 , Pr4 , Sub
 
Loop
End
 
 
'*****timer*****
Odmierz_1s:
 Load Timer0 = 250
  Incr Licz_8ms
  If Licz_8ms = 125 Then
   Licz_8ms = 0
  If Czas_odliczony > 0 Then
 Decr Czas_odliczony                                        'zmniejszenie zmiennej o 1
If Czas_odliczony = 0 Then
 
 
Select Case Aktywny_pro
 Case 1:
  Gosub Pr1
   Case 2:
    Gosub Pr2
     Case 3:
      Gosub Pr3
      Case 4:
     Gosub Pr4
   End Select
  End If
 End If
End If
Return
 
 
 
'*****wyłączenie wszystkiego******
Power_off:
Reset Przekaznik1
Reset Przekaznik2
Reset Przekaznik3
Reset Przekaznik4
Reset Przekaznik5
Return
 
'******on przekaznik nr.1/4******
Pr1:
 If Aktywny_pro = 0 Then
 Aktywny_pro = 1
  Set Przekaznik1
  Set Przekaznik4
  Set Przekaznik5
 Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 1 Then
  Reset Przekaznik1
   Reset Przekaznik4
    Reset Przekaznik5
   Aktywny_pro = 0
  End If
 Return
 
'*****on przekaznik nr.2/4*****
Pr2:
If Aktywny_pro = 0 Then
Aktywny_pro = 2
Set Przekaznik2
Set Przekaznik4
Set Przekaznik5
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 2 Then
Reset Przekaznik2
Reset Przekaznik4
Reset Przekaznik5
Aktywny_pro = 0
End If
Return
 
'*****on przekaznik nr.3/4*****
Pr3:
If Aktywny_pro = 0 Then
Aktywny_pro = 3
Set Przekaznik3
Set Przekaznik4
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 3 Then
Reset Przekaznik3
Reset Przekaznik4
Reset Przekaznik5
Aktywny_pro = 0
End If
Return
 
'****on przekaznik nr.5*******
Pr4:
If Aktywny_pro = 0 Then
Aktywny_pro = 4
Set Przekaznik5
Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 4 Then
Reset Przekaznik5
Aktywny_pro = 0
End If
Return
 
'********************tabela********************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

Proszę o jakąś pomoc, co dalej,i czy jest możliwość ustawienia trzech różnych czasów z zapisaniem do eeprom.

Portret użytkownika mirley

Re: Timer

Program musisz napewno zmienić bo masz za długą obsługę przerwania. Przerwanie niech tylko taktuje i ustawia zmienne flagi np co 4ms niech ustawi sie np F4ms (potrzebna do wysw. LED) a potem w pętli głównej trzeba sprawdzać stan tych flag. W przerwaniu możesz przecież zmniejszać wartość 3 liczników a nie jednego. Na starcie każdy z nich załadujesz inną wartością początkową i będą sobie liczyły do zera każdy inną ilość cykli

-

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.

Portret użytkownika marekszy

3*timer na ATMEGA 8

Mirley możesz mi z tym pomóc? Zacząłem tak, ale na pewno coś mieszm

'***********3 x timer V2****************
'***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb = &B10000000 : Portb = &B01111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
 Sw1 Alias Pinb.0                                           'start timer 1
 Sw2 Alias Pinb.1                                           'start timer 2
 Sw3 Alias Pinb.2                                           'start timer 3
 Sw4 Alias Pinb.3                                           'start timer 4
 Sw5 Alias Pinb.4                                           '+ sekundy
 Sw6 Alias Pinb.5                                           '- sekundy
'*****************konfiguracja koniec************************
 
'*****************zmienne poczatek**************************
Dim Flaga_4ms As Bit
Dim Wyswietlanie As Bit
Dim Licz_1s As Word
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_odliczony As Byte
Dim Aktywny_pro As Byte
Aktywny_pro = 0
'***************zmienne koniec**************************
 
 
'****************petla glowna*****************
Do
 If Flaga_4ms = 1then
   Flaga_4ms = 0
    Gosub Przyciski
      Gosub Wyswietlanie
        End If
         Debounce Sw1 , 0 , Pr1 , Sub
          Debounce Sw2 , 0 , Pr2 , Sub
            Debounce Sw3 , 0 , Pr3 , Sub
             Debounce Sw4 , 0 , Pr4 , Sub
              Loop
              End
'***************petla glowna koniec*************
'**************przerwanie timer0****************
Prztimer0:
 Timer0 = 6
  Flaga_4ms = 1
   If Czas_odliczony = 1 Then
    End If
'**************przerwanie timer0 koniec*********

napisz co z tego wywalić i co dalej...

Portret użytkownika mirley

Re: Timer

Dobra to tak....

Do
 
  If Flaga_4ms = 1 then
    Flaga_4ms = 0
    'tutaj polecenia wykonują sie co 4ms. Obsługa klawiszy albo skok do tej obsługi itp
 
    'przykład obsługi sw1
    If Sw1 = 0 then
      incr licz_sw1
      if licz_sw1 = 200 then
        licz_sw1 = 0
        'tutaj polecenia które wykonują się po kliknięciu sw1  
      end if
    else
      licz_sw1 = 195
    end if
 
 
  End If
 
Loop
End
'***************petla glowna koniec*************
'**************przerwanie timer0****************
Prztimer0:
 Timer0 = 6
 Flaga_4ms = 1
Return
'**************przerwanie timer0 koniec*********

Po pierwsze popracuj nad prawidłowymi wcięciami. Jak masz do loop to są one równoważne i powinny być na tym samym poziomie. Potem jest If od flagi 4ms, jest to polecenie wewnątrz do loop wiec wcinasz go w stosunku do do loop. Wewnątrz If znowu wcinasz ale jakby się w przyszłości pojawiła np druga flaga ustawian w przerwaniu to powinna być wcięta tak samo jak ten if flaga_4ms.... nie trudno to zrozumieć a bez tego nie da się czytać programu.

Co do obsługi przycisków to po to masz timer i taktowanie flagami żeby nie używać poleceń debounce które wstrzymują program bo zawierają waity w środku. Przykład obsługi przycisku wstawiłem do kodu wyżej... Dla jednego przycisku wygląda to właśnie tak. Popatrz do kodów źródłowych napewno zamieszczałem tam obsługę przycisków w bascomie.

-

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.

Portret użytkownika marekszy

3x timer V2

Witam, możesz zerknąć jak to teraz wygląda ,oraz co jest źle i jak dalej

'*******************3*timer V2******************************
       '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B10000000 : Portb = &B01111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
 Sw1 Alias Pinb.0                                           'start timer 1
 Sw2 Alias Pinb.1                                           'start timer 2
 Sw3 Alias Pinb.2                                           'start timer 3
 Sw4 Alias Pinb.3                                           'pozycja menu
 Sw5 Alias Pinb.4                                           '+ sekundy
 Sw6 Alias Pinb.5                                           '- sekundy
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
Dim Licz_1s As Word
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Czas_odliczony1 As Byte , Czas_odliczony2 As Byte , Czas_odliczony3 As Byte
Dim Aktywny_pro As Byte
Dim Poz_menu As Byte
 
 
'*****************zmienne koniec*****************************
'*****************zmienne poczatek***************************
 Czas_zadany1 = 15
 Czas_zadany2 = 20
 Czas_zadany3 = 25
 Aktywny_pro = 0
'****************zmienne koniec******************************
'****************petla glowna********************************
         Do
 
  If Flaga_4ms = 1 then
    Flaga_4ms = 0
      Gosub Przyciski
      Gosub Wyswietlanie
     End If
  Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
 Timer0 = 6
 Flaga_4ms = 1
Return
'*****************przerwanie timer0 koniec*****************
 
 
 
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B01111111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B01111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1
 
        Case 1:
           If Aktywny_pro = 0 Then
            Aktywny_pro = 1
             Set Przekaznik1
             Set Przekaznik4
             Set Przekaznik5
              Czas_odliczony1 = Czas_zadany1
           Elseif Aktywny_pro = 1 Then
             Reset Przekaznik1
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
        Case &B01111101:                                    'tutaj to co będzie po kliknięciu S2
 
           If Aktywny_pro = 0 Then
            Aktywny_pro = 2
             Set Przekaznik2
             Set Przekaznik4
             Set Przekaznik5
              Czas_odliczony2 = Czas_zadany2
           Elseif Aktywny_pro = 2 Then
             Reset Przekaznik2
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
 
        Case &B01111011:                                    'tutaj to co będzie po kliknięciu S3
 
           If Aktywny_pro = 0 Then
            Aktywny_pro = 3
             Set Przekaznik3
             Set Przekaznik4
              Czas_odliczony3 = Czas_zadany3
           Elseif Aktywny_pro = 3 Then
             Reset Przekaznik3
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
 
        Case &B01110111:                                    'tutaj to co będzie po kliknięciu S4
       'pozycja menu ustawianie czasu 1,2,3
        Case &B01101111:                                    'tutaj to co będzie po kliknięciu S5
       'ustawianie czasu +
        Case &B01011111:                                    'tutaj to co będzie po kliknięciu S6
       'ustawianie czasu -
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return

cały PORT.D zostawiłem na segmenty wyświetlacza, natomiast PORTC.4 PORTC.5 na anody A2,A1.
Jeszcze jedno,czy jak PORTB obsługuje przyciski to czy mogę np.na jedno wyjście PORTB.7 ustawić przekaźnik,tak jak tutaj.

Portret użytkownika mirley

Re: timer

Miałeś popracować nad wcięciami... wiec co to jest:

        Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1
 
        Case 1:
           If Aktywny_pro = 0 Then
            Aktywny_pro = 1
             Set Przekaznik1
             Set Przekaznik4
             Set Przekaznik5
              Czas_odliczony1 = Czas_zadany1
           Elseif Aktywny_pro = 1 Then
             Reset Przekaznik1
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return

program od linii:

Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1

do kolejnej takiej ma obsługiwać reakcję na stan klawiszy dany wartościa &B01111110, czyli jak widzisz przycisk S1 zwarty do masy. To zero na pierwszej pozycji zawsze występuje bo na początku procedury jest kasowana ta wartość.

Co tam robi Case 1: i Return.... do czego się ma program wracać?

Próbowałeś to kompilować i wgrywać do procka?

-

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.

Portret użytkownika marekszy

3x timer V2

Wiem,że mam nad tymi wcięciami popracować, ale systematycznie do tego dojdę. Case 1: to niechcący, natomiast odnośnie RETURN to nie wiem, ale do oczekiwania po skończeniu programu na kolejne naciśnięcie jakiegoś przycisku. Pierwsze 0 to PORTB.7 służy jako jedno z wyjść przekaźnika.
Kompiluje się, jednak brak reakcji na przyciski.Po dołożeniu wyświetlania wyświetla tylko 00.

'*******************3*timer V2******************************
       '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B10000000 : Portb = &B01111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
 Sw1 Alias Pinb.0                                           'start timer 1
 Sw2 Alias Pinb.1                                           'start timer 2
 Sw3 Alias Pinb.2                                           'start timer 3
 Sw4 Alias Pinb.3                                           'pozycja menu
 Sw5 Alias Pinb.4                                           '+ sekundy
 Sw6 Alias Pinb.5                                           '- sekundy
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Czas_odliczony1 As Byte , Czas_odliczony2 As Byte , Czas_odliczony3 As Byte
Dim Aktywny_pro As Byte
Dim Poz_menu As Byte
Dim Mux As Bit
Dim Wysw As Byte , Wysw10 As Byte , Wysw1 As Byte
Dim Licz_1s As Word , Dzielnik As Byte
Dim Flaga_100ms As Bit
Dim Dzielnik2 As Byte
 
'*****************zmienne koniec*****************************
'*****************zmienne poczatek***************************
 Czas_zadany1 = 15
 Czas_zadany2 = 20
 Czas_zadany3 = 25
 Aktywny_pro = 0
'****************zmienne koniec******************************
'****************petla glowna********************************
         Do
 
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Gosub Przyciski
      Gosub Wyswietlanie
     End If
  Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
   Prztimer0:
 Timer0 = 6
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 250 Then
   Dzielnik = 0
   Incr Dzielnik2
   If Dzielnik2 = 10 Then
     Dzielnik2 = 0
     Incr Licz_1s
   End If
 End If
Return
'*****************przerwanie timer0 koniec*****************
'*****************wyswietlanie*****************************
 Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set Portc.4
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portd = Wysw10
    Reset Portc.5
  Else
    Set Portc.5
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portd = Wysw1
    Reset Portc.4
  End If
Return
'*****************wyswietlanie koniec**********************
 
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B01111111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B01111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1
 
   If Aktywny_pro = 0 Then
            Aktywny_pro = 1
             Set Przekaznik1
             Set Przekaznik4
             Set Przekaznik5
              Czas_odliczony1 = Czas_zadany1
   Elseif Aktywny_pro = 1 Then
             Reset Przekaznik1
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
        Case &B01111101:                                    'tutaj to co będzie po kliknięciu S2
 
   If Aktywny_pro = 0 Then
            Aktywny_pro = 2
             Set Przekaznik2
             Set Przekaznik4
             Set Przekaznik5
              Czas_odliczony2 = Czas_zadany2
   Elseif Aktywny_pro = 2 Then
             Reset Przekaznik2
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
 
        Case &B01111011:                                    'tutaj to co będzie po kliknięciu S3
 
  If Aktywny_pro = 0 Then
            Aktywny_pro = 3
             Set Przekaznik3
             Set Przekaznik4
              Czas_odliczony3 = Czas_zadany3
  Elseif Aktywny_pro = 3 Then
             Reset Przekaznik3
             Reset Przekaznik4
             Reset Przekaznik5
   Aktywny_pro = 0
  End If
Return
 
        Case &B01110111:                                    'tutaj to co będzie po kliknięciu S4
       'pozycja menu ustawianie czasu 1,2,3
        Case &B01101111:                                    'tutaj to co będzie po kliknięciu S5
       'ustawianie czasu +
        Case &B01011111:                                    'tutaj to co będzie po kliknięciu S6
       'ustawianie czasu -
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'**********************tabela*************************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

po naciśnięciu przyciku np.sw1 ma się wykonać program

'******on przekaznik nr.1/4/5******
Pr1:
 If Aktywny_pro = 0 Then
 Aktywny_pro = 1
  Set Przekaznik1
  Set Przekaznik4
  Set Przekaznik5
 Czas_odliczony = Czas_zadany
Elseif Aktywny_pro = 1 Then
  Reset Przekaznik1
   Reset Przekaznik4
    Reset Przekaznik5
   Aktywny_pro = 0
  End If
 Return

czyli załączyć przekaźniki 1/4/5 na czas_zadany1.

Portret użytkownika mirley

Re: Timer

SKoro po naciśnięciu ma się wykonywać ten podprogram toma to wyglądac tak:

.............
      Select Case Stan_sw
        Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1
          If Aktywny_pro = 0 Then
            Aktywny_pro = 1
            Set Przekaznik1
            Set Przekaznik4
            Set Przekaznik5
            Czas_odliczony1 = Czas_zadany1
          Elseif Aktywny_pro = 1 Then
            Reset Przekaznik1
            Reset Przekaznik4
            Reset Przekaznik5
            Aktywny_pro = 0
          End If
 
        Case &B01111101:                                    'tutaj to co będzie po kliknięciu S2
 
         ....'dalsza część obsługi przycisków

return ma być jeden na końcu procedury obsługi przycisków

-

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.

Portret użytkownika marekszy

3x timer V2

Widzę,że mam wywalić tylko return z wszystkich przycisków, pokombinuję i trochę jeszcze dopiszę ,ale dopiero niestety wieczorem, jeszcze jedno pytanie-czy jak będę wstawiał obsługę menu na SW4

Incr Poz_menu
          If Poz_menu = 3 Then Poz_menu = 0

to poz_menu =4 then poz_menu = 0 , chodzi o zmianę 3 czasów.

Portret użytkownika mirley

Re: Menu

Dokładnie tak, tylko wcięcie złe.... dwa polecenia równoważne powinny być tak samo wcięte

Potem w przyciskach które robią + i - dodasz case zależny od poz_menu.

Select Case Poz_menu
  case 0:
    'polecenie zwiększ lub zmniejsz czas T1
  case 1:
    'polecenie zwiększ lub zmniejsz czas T2
  case 2:
    'polecenie zwiększ lub zmniejsz czas T2
end select

-

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.

Portret użytkownika marekszy

3x timer V2

nie chce mi to ruszyć,możesz napisać przerwania do timer 0 ,bo kombinowałem na różne sposoby i nic.Jeszcze co trzeba dopisać i zmienić aby ruszyło wyświetlanie czasów w sek.do 99.Wszystko się kompiluje, tylko nie działa.

'*******************3*timer V2******************************
       '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B10000000 : Portb = &B01111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
 Sw1 Alias Pinb.0                                           'start timer 1
 Sw2 Alias Pinb.1                                           'start timer 2
 Sw3 Alias Pinb.2                                           'start timer 3
 Sw4 Alias Pinb.3                                           'pozycja menu
 Sw5 Alias Pinb.4                                           '+ sekundy
 Sw6 Alias Pinb.5                                           '- sekundy
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Czas_odliczony1 As Byte , Czas_odliczony2 As Byte , Czas_odliczony3 As Byte
Dim Aktywny_pro As Byte
Dim Poz_menu As Byte
Dim Mux As Bit
Dim Wysw As Byte , Wysw10 As Byte , Wysw1 As Byte
Dim Licz_1s As Word , Dzielnik As Byte
 
'*****************zmienne koniec*****************************
'*****************zmienne poczatek***************************
 Czas_zadany1 = 15
 Czas_zadany2 = 20
 Czas_zadany3 = 25
 Aktywny_pro = 0
'****************zmienne koniec******************************
'****************petla glowna********************************
         Do
 
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Gosub Przyciski
      Gosub Wyswietlanie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
 Timer0 = 6
  Flaga_4ms = 1
   Incr Dzielnik
    If Dzielnik = 250 Then
     Dzielnik = 0
      If Licz_1s = 0 Then
      End If
    End If
Return
'*****************przerwanie timer0 koniec*****************
'*****************wyswietlanie*****************************
 Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set Portc.4
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portd = Wysw10
    Reset Portc.5
  Else
    Set Portc.5
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portd = Wysw1
    Reset Portc.4
  End If
Return
'*****************wyswietlanie koniec**********************
 
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B01111111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B01111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B01111110:                                    'tutaj to co będzie po kliknięciu S1
           If Aktywny_pro = 0 Then
            Aktywny_pro = 1
             Set Przekaznik1
              Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony1 = Czas_zadany1
            Elseif Aktywny_pro = 1 Then
              Reset Przekaznik1
               Reset Przekaznik4
                Reset Przekaznik5
             Aktywny_pro = 0
           End If
 
        Case &B01111101:                                    'tutaj to co będzie po kliknięciu S2
           If Aktywny_pro = 0 Then
            Aktywny_pro = 2
             Set Przekaznik2
              Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony2 = Czas_zadany2
             Elseif Aktywny_pro = 2 Then
              Reset Przekaznik2
               Reset Przekaznik4
                Reset Przekaznik5
             Aktywny_pro = 0
          End If
 
        Case &B01111011:                                    'tutaj to co będzie po kliknięciu S3
           If Aktywny_pro = 0 Then
            Aktywny_pro = 3
             Set Przekaznik3
              Set Przekaznik4
               Czas_odliczony3 = Czas_zadany3
            Elseif Aktywny_pro = 3 Then
             Reset Przekaznik3
              Reset Przekaznik4
               Reset Przekaznik5
             Aktywny_pro = 0
           End If
 
        Case &B01110111:
          Incr Poz_menu                                     'tutaj to co będzie po kliknięciu S4
           If Poz_menu = 4 Then Poz_menu = 0                'pozycja menu ustawianie czasu 1,2,3
 
 
        Case &B01101111:                                    'tutaj to co będzie po kliknięciu S5
         Select Case Poz_menu
          Case 0:                                           'ustawianie czasu +
         If Czas_zadany1 < 3600 Then Incr Czas_zadany1
          Case 1:
         If Czas_zadany2 < 3600 Then Incr Czas_zadany2
          Case 2:
         If Czas_zadany3 < 3600 Then Incr Czas_zadany3
 
        Case &B01011111:                                    'tutaj to co będzie po kliknięciu S6
         Select Case Poz_menu
          Case 0:                                           'ustawianie czasu -
         If Czas_zadany1 > 0 Then Decr Czas_zadany1
          Case 1:
         If Czas_zadany2 > 0 Then Decr Czas_zadany2
          Case 2:
         If Czas_zadany3 > 0 Then Decr Czas_zadany3
        End Select
       End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'**********************tabela*************************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

wiem ,że wcięcia mam bez sensu,ale daj mi czas,w kolejnym projekcie będzie dużo lepiej,

Portret użytkownika marekszy

3x timer V2

możesz mi napisać co jest nie tak, po naciśnięciu przycisku SW1 lub SW2,SW3 załącza przekazniki i na wyświetlaczu odlicza zadane czasy,jednak gdy czas dojdzie do zera nic się dalej nie dzieje, przekaźniki są nadal załączone jedynie mogę je wyłączyć ponownym naciśnięciem SW. Wklejam na chwilę obecną trochę okrojony kod

 '*******************3*timer V2******************************
       '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B10000000 : Portb = &B00000111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Czas_odliczony1 As Byte , Czas_odliczony2 As Byte , Czas_odliczony3 As Byte
Dim Aktywny_pro As Byte
Dim Poz_menu As Byte
Dim Licz_1s As Word , Dzielnik As Byte
Dim Wysw As Byte , Wysw10 As Byte , Wysw1 As Byte
Dim Mux As Bit
Dim Czas_odliczony As Byte
 
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 Czas_zadany1 = 15
 Czas_zadany2 = 20
 Czas_zadany3 = 25
 Aktywny_pro = 0
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Gosub Wyswietlanie
      Gosub Przyciski
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
 Timer0 = 6
  Flaga_4ms = 1
   Incr Dzielnik
    If Dzielnik = 250 Then
     Dzielnik = 0
      If Licz_1s = 0 Then
        If Czas_odliczony > 0 Then
         Decr Czas_odliczony
          If Czas_odliczony = 0 Then
          End If
        End If
      End If
    End If
 Return
'*****************przerwanie timer0 koniec*****************
 
 
'*****************wyswietlanie*****************************
 Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set Portc.4
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portd = Wysw10
    Reset Portc.5
  Else
    Set Portc.5
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portd = Wysw1
    Reset Portc.4
  End If
  Wysw = Czas_odliczony
Return
'*****************wyswietlanie koniec**********************
 
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B00000111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B01111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00000110:                                    'tutaj to co będzie po kliknięciu S1
          If Aktywny_pro = 0 Then
            Aktywny_pro = 1
               Set Przekaznik1
               Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony = Czas_zadany1
             Elseif Aktywny_pro = 1 Then
               Reset Przekaznik1
               Reset Przekaznik4
               Reset Przekaznik5
             Aktywny_pro = 0
          End If
 
        Case &B00000101:                                    'tutaj to co będzie po kliknięciu S2
           If Aktywny_pro = 0 Then
            Aktywny_pro = 2
               Set Przekaznik2
               Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony = Czas_zadany2
             Elseif Aktywny_pro = 2 Then
               Reset Przekaznik2
               Reset Przekaznik4
               Reset Przekaznik5
             Aktywny_pro = 0
          End If
 
        Case &B00000011:                                    'tutaj to co będzie po kliknięciu S3
         If Aktywny_pro = 0 Then
            Aktywny_pro = 3
              Set Przekaznik3
              Set Przekaznik4
               Czas_odliczony = Czas_zadany3
            Elseif Aktywny_pro = 3 Then
               Reset Przekaznik3
               Reset Przekaznik4
             Aktywny_pro = 0
           End If
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
'**********************tabela*************************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

nie wiem co jest z tym
aktywny_pro

Portret użytkownika marekszy

3x timer V2

ok,udało mi się to uruchomić, programy się wykonują,przyciski działają,tylko jak zrobić aby przy ustawianiu czasów wyświetlało mi który czas i jaka wartość? Nie wiem co i jak ustawiam. Jak to ruszy muszę jeszcze dołożyć zapis i ograniczenia w ustawianiu czasów od 0 do 99s.

 '*******************3*timer V2******************************
       '***********konfiguracja uC**********
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B11000000 : Portb = &B00111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1
 Przekaznik3 Alias Portc.2
 Przekaznik4 Alias Portc.3
 Przekaznik5 Alias Portb.7                                  'pompka zapachów
 
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Aktywny_pro As Byte
Dim Poz_menu As Byte
Dim Licz_1s As Word , Dzielnik As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Bit
Dim Czas_odliczony As Byte
 
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 Czas_zadany1 = 15
 Czas_zadany2 = 20
 Czas_zadany3 = 25
 Aktywny_pro = 0
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Gosub Wyswietlanie
      Gosub Przyciski
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
 Timer0 = 6
  Flaga_4ms = 1
   Incr Dzielnik
    If Dzielnik = 250 Then
     Dzielnik = 0
      If Licz_1s = 0 Then
        If Czas_odliczony > 0 Then
         Decr Czas_odliczony
          If Czas_odliczony = 0 Then
           Select Case Aktywny_pro
            Case 1:
              Gosub Pr1
            Case 2:
              Gosub Pr2
            Case 3:
              Gosub Pr3
           End Select
          End If
        End If
      End If
    End If
 Return
'*****************przerwanie timer0 koniec*****************
'*****************wylaczenie wszystkiego*******************
Power_off:
  Reset Przekaznik1
  Reset Przekaznik2
  Reset Przekaznik3
  Reset Przekaznik4
  Reset Przekaznik5
Return
'**********************************************************
'*****************wyswietlanie*****************************
 Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set Portc.4
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portd = Wysw10
    Reset Portc.5
  Else
    Set Portc.5
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portd = Wysw1
    Reset Portc.4
  End If
  Wysw = Czas_odliczony
Return
'*****************wyswietlanie koniec**********************
 
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B00111111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00111110:
        Pr1:                                                'tutaj to co będzie po kliknięciu S1
          If Aktywny_pro = 0 Then
            Aktywny_pro = 1
               Set Przekaznik1
               Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony = Czas_zadany1
             Elseif Aktywny_pro = 1 Then
               Reset Przekaznik1
               Reset Przekaznik4
               Reset Przekaznik5
             Aktywny_pro = 0
          End If
 
        Case &B00111101:
        Pr2:                                                'tutaj to co będzie po kliknięciu S2
           If Aktywny_pro = 0 Then
            Aktywny_pro = 2
               Set Przekaznik2
               Set Przekaznik4
               Set Przekaznik5
                Czas_odliczony = Czas_zadany2
             Elseif Aktywny_pro = 2 Then
               Reset Przekaznik2
               Reset Przekaznik4
               Reset Przekaznik5
             Aktywny_pro = 0
          End If
 
        Case &B00111011:
        Pr3:                                                'tutaj to co będzie po kliknięciu S3
         If Aktywny_pro = 0 Then
            Aktywny_pro = 3
              Set Przekaznik3
              Set Przekaznik4
               Czas_odliczony = Czas_zadany3
            Elseif Aktywny_pro = 3 Then
               Reset Przekaznik3
               Reset Przekaznik4
             Aktywny_pro = 0
         End If
 
        Case &B00110111:                                    'poz menu
           Incr Poz_menu
           If Poz_menu = 4 Then Poz_menu = 0
 
        Case &B00101111                                     'sek +
          Select Case Poz_menu
            Case 1:
              Incr Czas_zadany1
            Case 2:
              Incr Czas_zadany2
            Case 3:
              Incr Czas_zadany3
          End Select
 
        Case &B00011111                                     'sek -
          Select Case Poz_menu
            Case 1:
              Decr Czas_zadany1
            Case 2:
              Decr Czas_zadany2
            Case 3:
              Decr Czas_zadany3
         End Select
      End Select
         'Wysw = Czas_odliczony
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
'**********************tabela*************************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

nic nie mogę wykombinować z tym wyświetlaniem, możesz poradzić jak dopisać procedurę do wyświetlania tego co chcę w danym momencie..

Portret użytkownika mirley

Re: Timer

No to teraz nagrzebałeś nieźle..... po co ci te etykiety Pr1, pr2 itp w środku obsługi przycisków.... Skaczesz z obsługi timera, która ma być krótka gdzieś w środek obsługi procedury przycisków, wykonuje się ona cała gdzieś od środka i nie wiadomo co się dzieje... może i działa na razie ale za chwile dopiszesz 2 linijki i przestanie działać.... Po to dzielisz program na procedury aby każda robiła co innego. Skoro masz obsługę przycisków to po co tam pchasz przekaźniki do tego. Zrób procedurę sterowania która zajmie się obsługą przekaźników. Ale to na samym końcu.... najpierw ma działać wyświetlanie czasu i ustawianie czasu i zanim to nie ruszy zapomnij o przekaźnikach.

W procedurze przycisków zrób sobie tak:

If Sw <> &B00111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00111110:
          if Poz_menu = 0  then
            if Stan_pracy = 0 then
              stan_pracy = 1
              Czas_odliczony = Czas_zadany1
            end if
          end if
        Case &B00111101:
          if Poz_menu = 0  then
            if Stan_pracy = 0 then
              stan_pracy = 2
              Czas_odliczony = Czas_zadany2
            end if
          end if
        Case &B00111011:
          if Poz_menu = 0  then
            if Stan_pracy = 0 then
              stan_pracy = 3
              Czas_odliczony = Czas_zadany1
            end if
          end if
 
'..................pozostałe case bez zmian

Zmienna stan_pracy jest typu byte, określa który czas został włączony do odliczania, w stanie 0, gdy wszystko wyłączone można włączyć jakiś przekaźnik. W przerwaniu timera:

Prztimer0:
 Timer0 = 6
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 250 Then
   Dzielnik = 0
   If Czas_odliczony > 0 Then
     Decr Czas_odliczony
     If Czas_odliczony = 0 Then
       Stan_pracy = 0    
     End If
   End If
 End If
 Return

Teraz wyświetlanie, w pętli głównej trzeba dopisać:

Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
        Case 1:
          Wysw = Czas_zadany1    
        Case 2:
          Wysw = Czas_zadany2
        Case 3:
          Wysw = Czas_zadany3
      End Select   
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
  End If
 Loop
End

No i procedura sterowania(przekaźnik tylko tu ma prawo się zmienić, tu wstaw sobie set i reset poszczególnych przekaźników):

Sterowanie:
  Select Case Stan_pracy
    Case 0:
      'nic nie pracuje tu napisz stan przekaźników jak nic nie pracuje, np set p1 reset p2 itp 
    Case 1:
      'pracuje timer 1       
    Case 2:
      'pracuje timer 2    
    Case 3:
      'pracuje timer 3     
  End Select   
Return

Pozostałe procedury w programie, które napisałeś są niepotrzebne, tak samo dodatkowe zmienne trzeba skasować.

Zapis do pamięci trzeba zrobić pod casem od zmiany pozycji menu:

    Case &B00110111:                                    'poz menu
      Incr Poz_menu
      If Poz_menu = 4 Then 
        Poz_menu = 0
        'tu zapis do eeprom albo skok do procedury zapisu
      End if

Zanim coś wkleisz do kodu zastanów się czy rozumiesz co wklejasz i jak to działa. Zacznij od samego wyświetlania

-

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.

Portret użytkownika marekszy

3x timer V2

dzięki,wieczorem to wszystko poprawię.Odnośnie sterowania przekaźnikami w procedurze obsługi przycisków to sam mnie tak nakierowałeś a reszta poszła już lawinowo tak aby zaczęło działać.Ale i tak byłem zadowolony,że wogle coś działało.

Portret użytkownika marekszy

3x timer V2

wszystko działa bez problemu,sterowanie,wyświetlanie oraz zapis jest ok.Zapomniałem tylko ,że portB.6,portB.7 jest zajęty przez kwarc i przekaźnik5 wystawiłem teraz na portD.7 (przecinek od wyświetlaczy jest niepotrzebny).
Mam pytanie czy jest możliwość ustawienia przycisków SW1,SW2,SW3 aby działały tak jak w poprzedniej wersji to znaczy wciśnięcie SW1 -załączenie,ponowne wciśnięcie anuluje odliczanie i możliwość wyboru kolejnego itd.,ewentualnie np. po wybraniu sw1 naciśnięcie sw2/sw3 powoduje anulowanie wykonywania programu dla sw1 i wybranie programu dla sw2/sw3.
I jeszcze jedno, jeżeli zwolnię portb.3 (wybór poz_menu zrobię z diodami s+ i s-),czy jest możliwość dołożenia tam anody 3 wyświetlacza i wyświetlenia na nim który czas ustawiamy, lub podłączyć LED-y i wysterować czas_zadany1 segment A,czas_zadany2 segment G, czas_zadany3 segment D (i tu podłączę diody LED)

'*******************3*timer V2******************************
 '*******************marekszy********************************
 '*******************konfiguracja uC*************************
 
$regfile = "m8def.dat"
$crystal = 16000000
 
 
Config Portb = &B11000000 : Portb = &B00111111
Config Portc = &B11111111 : Portc = &B11110000
Config Portd = &B11111111 : Portd = &B01111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
 Przekaznik1 Alias Portc.0                                  'wylaczenie LED biala
 Przekaznik2 Alias Portc.1                                  'zalaczenie zaw.1
 Przekaznik3 Alias Portc.2                                  'zalaczenie zaw.2
 Przekaznik4 Alias Portc.3                                  'zalaczenie zaw.3+pompka zapachow 2
 Przekaznik5 Alias Portd.7                                  'pompka zapachow 1 wspolna dla zaw.1/2
 
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany1 As Word , Czas_zadany2 As Word , Czas_zadany3 As Word
Dim Poz_menu As Byte
Dim Licz_1s As Word , Dzielnik As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Bit
Dim Czas_odliczony As Byte
Dim Stan_pracy As Byte
Dim Odliczanie As Byte
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 
Readeeprom Czas_zadany1 , 2
  If Czas_zadany1 > 99 Then                                 'gdy czas wiekszy od 99s wczytaj 15s
    Czas_zadany1 = 15
  End If
Readeeprom Czas_zadany2 , 4
  If Czas_zadany2 > 99 Then
    Czas_zadany2 = 15
  End If
Readeeprom Czas_zadany3 , 6
  If Czas_zadany3 > 99 Then
    Czas_zadany3 = 15
  End If
 
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
        Case 1:
          Wysw = Czas_zadany1
        Case 2:
          Wysw = Czas_zadany2
        Case 3:
          Wysw = Czas_zadany3
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
  Timer0 = 6
  Flaga_4ms = 1
  Incr Dzielnik
    If Dzielnik = 250 Then
      Dzielnik = 0
      If Czas_odliczony > 0 Then
         Decr Czas_odliczony
          If Czas_odliczony = 0 Then
            Stan_pracy = 0
          End If
      End If
    End If
    Return
 
'*****************przerwanie timer0 koniec*****************
'*****************sterowanie poczatek**********************
Sterowanie:
  Select Case Stan_pracy
    Case 0:
      Reset Przekaznik1
      Reset Przekaznik2
      Reset Przekaznik3
      Reset Przekaznik4
      Reset Przekaznik5
    Case 1:
      Set Przekaznik1
      Set Przekaznik2
      Set Przekaznik5
      Reset Przekaznik3
      Reset Przekaznik4
    Case 2:
      Set Przekaznik1
      Set Przekaznik3
      Set Przekaznik5
      Reset Przekaznik2
      Reset Przekaznik4
    Case 3:
      Set Przekaznik1
      Set Przekaznik4
      Reset Przekaznik2
      Reset Przekaznik3
      Reset Przekaznik5
  End Select
Return
 
'*****************sterowanie koniec************************
'*****************wyswietlanie*****************************
 Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set Portc.4
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portd = Wysw10
    Reset Portc.5
  Else
    Set Portc.5
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portd = Wysw1
    Reset Portc.4
  End If
Return
'*****************wyswietlanie koniec**********************
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pinb And &B00111111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00111111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00111110:
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 1
             Czas_odliczony = Czas_zadany1
           End If
         End If
 
        Case &B00111101:
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 2
             Czas_odliczony = Czas_zadany2
           End If
         End If
 
        Case &B00111011:
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 3
             Czas_odliczony = Czas_zadany3
           End If
         End If
 
        Case &B00110111:                                    'poz menu(4 pozycje 0/1/2/3)
           Incr Poz_menu
           If Poz_menu = 4 Then
             Poz_menu = 0
               Writeeeprom Czas_zadany1 , 2                 'zapis do pamieci eeprom
               Writeeeprom Czas_zadany2 , 4
               Writeeeprom Czas_zadany3 , 6
           End If
        Case &B00101111                                     'sek +
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany1 < 99 Then Incr Czas_zadany1  'ograniczenie do 99s
                Else
                 Odliczanie = 0
              End If
            Case 2:
              If Odliczanie = 0 Then
               If Czas_zadany2 < 99 Then Incr Czas_zadany2
                Else
                 Odliczanie = 0
              End If
            Case 3:
              If Odliczanie = 0 Then
               If Czas_zadany3 < 99 Then Incr Czas_zadany3
                Else
                 Odliczanie = 0
              End If
          End Select
 
        Case &B00011111                                     'sek -
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany1 > 1 Then Decr Czas_zadany1   'ograniczenie do 1s
                Else
                 Odliczanie = 0
              End If
            Case 2:
              If Odliczanie = 0 Then
               If Czas_zadany2 > 1 Then Decr Czas_zadany2
                Else
                 Odliczanie = 0
              End If
            Case 3:
              If Odliczanie = 0 Then
               If Czas_zadany3 > 1 Then Decr Czas_zadany3
                Else
                 Odliczanie = 0
              End If
         End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
'**********************tabela*************************
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'     0     1     2     3     4     5     6     7     8     9    pusty

Portret użytkownika marekszy

3x timer V2

zmienilem przyciski teraz menu jest przez diody z sw+/sw- i uzyskany port
portB.5 przepisałem jako anoda trzeciego wyświetlacza oraz dodałem obsługę

'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 3 Then Mux = 0
    Select Case Mux
 
    Case 0:
      Set Portb.5
        Wysw100 = Wysw Mod 10
        Wysw100 = Lookup(wysw100 , Tabela)
        Portd = Wysw100
      Reset Portc.4
    Case 1:
      Set Portc.4
        Wysw10 = Wysw / 10
        Wysw10 = Lookup(wysw10 , Tabela)
        Portd = Wysw10
      Reset Portc.5
   Case 2:
    Set Portc.5
      Wysw1 = Wysw Mod 1
      Wysw1 = Lookup(wysw1 , Tabela)
      Portd = Wysw1
    Reset Portb.5
 
  End Select
Return
 
'*****************wyswietlanie koniec**********************

jak wyswietlic poz_menu 0/1/2/3 jako 0,1,2,3. No i oczywiście jeszcze to co pisałem wcześniej z przyciskami.

Portret użytkownika marekszy

3x timer V2

trochę dodałem,utworzyłem zmienną wysw_poz_menu i dodałem do pętli gł. oraz wyświetlania,działa to przy ustawianiu czasów,jednak co dopisać aby wyświetlało równiż przy działaniu sw1/sw2/sw3, i zostanie tylko problem "czy jest możliwość ustawienia przycisków SW1,SW2,SW3 aby działały tak jak w poprzedniej wersji to znaczy wciśnięcie SW1 -załączenie,ponowne wciśnięcie anuluje odliczanie i możliwość wyboru kolejnego itd.,ewentualnie np. po wybraniu sw1 naciśnięcie sw2/sw3 powoduje anulowanie wykonywania programu dla sw1 i wybranie programu dla sw2/sw3.

'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 3 Then Mux = 0
    Select Case Mux
 
    Case 0:
      Set Portb.5
        Wysw100 = Wysw Mod 10
        Wysw100 = Lookup(wysw100 , Tabela)
        Portd = Wysw100
      Reset Portc.4
    Case 1:
      Set Portc.4
        Wysw10 = Wysw / 10
        Wysw10 = Lookup(wysw10 , Tabela)
        Portd = Wysw10
      Reset Portc.5
   Case 2:
    Set Portc.5
      Wysw1 = Wysw_poz_menu                                 'wuswietlanie poz_menu
      Wysw1 = Lookup(wysw1 , Tabela)
      Portd = Wysw1
    Reset Portb.5
 
  End Select
Return
 
'*****************wyswietlanie koniec**********************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
          Wysw_poz_menu = 0
        Case 1:
          Wysw = Czas_zadany1
          Wysw_poz_menu = 1                                 '"FRESH"
        Case 2:
          Wysw = Czas_zadany2
          Wysw_poz_menu = 2                                 '"FUN"
        Case 3:
          Wysw = Czas_zadany3
          Wysw_poz_menu = 3                                 '"TROPIC"
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
  End If
 Loop
End
'*****************petla glowna koniec**********************

Portret użytkownika marekszy

3x timer V2

No to tak ze sobą popiszę.Wyświetlanie poz_menu mam już zrobione,może trochę bez ładu i składu ,ale działa prawidłowo.Dodałem kolejną zmienną wysw_poz ,a wprogramie

'*****************wyswietlanie*****************************
Wyswietlanie:
 Select Case Wysw_poz
        Case 0:
          Wysw_poz_menu = 0
        Case 1:
          Wysw_poz_menu = 1
        Case 2:
          Wysw_poz_menu = 2
        Case 3:
          Wysw_poz_menu = 3
 End Select

sterowanie:
   Case 1:                                                 'co ma byc zal/wyl przy menu 1 (SW_1)
      Set Przekaznik1
      Set Przekaznik2
      Set Przekaznik5
      Reset Przekaznik3
      Reset Przekaznik4
      Wysw_poz = 1

no i w pętli głównej
Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
        Case 1:
          Wysw = Czas_zadany1
          Wysw_poz = 1                                      '"FRESH"
        Case 2:
          Wysw = Czas_zadany2
          Wysw_poz = 2                                      '"FUN"
        Case 3:
          Wysw = Czas_zadany3
          Wysw_poz = 3                                      '"TROPIC"
      End Select

Mirley,podpowiedz mi jak mam wybrnąć z tymi przyciskami,nic mi nie przychodzi do głowy
-ustawienie przycisków SW1,SW2,SW3 aby działały tak jak w poprzedniej wersji to znaczy wciśnięcie SW1 -załączenie,ponowne wciśnięcie anuluje odliczanie i możliwość wyboru kolejnego itd.,ewentualnie np. po wybraniu sw1 naciśnięcie sw2/sw3 powoduje anulowanie wykonywania programu dla sw1 i wybranie programu dla sw2/sw3.
Jak jest możliwoś to chciałbym przetestować obie wersje i dopiero wybrać