Prosty Timer


7.5
Ocena: None Średnia: 7.5 (2 głosujących)

Opisywane urządzenie jest prostym timerem mikroprocesorowym odliczającym czas w zakresie 1-99s (lub 1-99m po drobnej modyfikacji programu). Steruje on dowolnym odbiornikiem prądu przemiennego o maksymalnej mocy wyznaczonej jedynie przez zastosowany triak. Układ został zaprojektowany jako timer fotograficzny, przydatny w amatorskiej fotografii do włączania lampy powiększalnika na określony czas. Po modyfikacji programu może działać na przykład jako timer kuchenny itp. Do zasilania urządzenia zastosowano mini ładowarkę od telefonu komórkowego, przez co całość zmieściła się w płaskiej i niewielkiej obudowie.

Działanie:


Schemat ideowy timera przedstawiony jest na rysunku poniżej:

Sercem układu jest mikrokontroler U1 (AT89C2051) wraz z elementami X1 (12MHz), C1 (33pF) i C2 (33pF). Kondensator C3 ma za zadanie zresetować procesor po włączeniu zasilania. Wyświetlacz W1 (LED) podłączony jest do portu P3 mikrokontrolera przez rezystory ograniczające prąd R1 - R7 (330R). Anodami wyświetlacza sterują tranzystory T1 (BC556) i T2 (BC556) wraz z rezystorami R8 - R11 (3,3k). Do złącza Sw dołączona jest klawiatura złożona z pięciu przycisków. Ze względu na małą liczbę wyprowadzeń mikrokontrolera ostatni przycisk wykorzystuje prosty dekoder zbudowany na diodach D1 (1N4148) i D2 (1N4148). Tranzystor T3 (BC556) wraz z elementami R14 (3,3k) i R15 (3,3k) steruje pracą buzzera z generatorem B1. Obwód wykonawczy stanowi triak Tr1 (BT138-600E) oraz optotriak OPT1 (MOC3042). Rezystor R13 (330R) ogranicza prąd optotriaka. Do złącza 230V (ARK) należy dołączyć odbiornik w taki sposób jakby złącze to stanowiło zwykły wyłącznik sieciowy. Do złącza Zas (Goldpin) doprowadzamy napięcie zasilające o wartości około 7-12V. Stabilizator U2 (7805) wraz z kondensatorami C4 (47uF) i C5 (22uF) dostarczają napięcia stabilizowanego na poziomie 5V.

Budowa:


Urządzenie można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym można pobrać tutaj. Montaż należy rozpocząć od wlutowania pięciu zworek a następnie wszystkie rezystory. Na sam koniec warto zostawić elementy największe. Pod mikrokontroler U1 bezwzględnie konieczna jest podstawka, natomiast pod wyświetlacz W1 można zastosować podstawkę DIP18 przeciętą na dwie części. Rozwiąże to problem kondensatorów wystających ponad wyświetlacz i ułatwi montaż całości w obudowie. Triak Tr1 i stabilizator U2 należy wlutować w pozycji leżącej, jak pokazuje schemat montażowy. Timer wygodnie jest zasilać z mini ładowarki do komórki ze względu na małe wymiary i niewielki ciężar. Po rozmontowaniu taka ładowarka da się upchnąć w prawie każdej obudowie. Pomocą przy budowie może się okazać schemat montażowy dostępny tutaj.

Wykaz Elementów:


1x Złącze śrubowe ARK2
5x uSwitch 12x12mm

1x 220R
8x 330R
6x 3,3k

2x 33pF
1x 22uF Elektrolit
1x 1uF Elektrolit
1x 47uF Elektrolit

1x Rezonator Kwarcowy 12MHz
1x Buzzer 5V z generatorem
1x Wyświetlacz podwójny, wspólna anoda
2x 1N4148
1x 7805
1x AT89C2051 + Podstawka
3x BC556
1x MOC3042
1x BT138-600E

Programowanie:


Mikrokontroler do timera został zaprogramowany w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

$crystal = 12000000                                           '12MHz
$regfile = "89C2051.DAT"
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
Enable Interrupts
 
Dim Co4ms As Byte , Co1s As Byte
Dim Czas As Byte , Czas_ust As Byte
Dim Wysw As Byte , Wysw10 As Byte , Wysw1 As Byte
Dim Sw_port As Byte , Stan_portu As Byte , Licznik_sw As Byte
Dim Mux As Bit
Dim Odliczanie As Bit
Dim Flaga4ms As Bit
Dim Flaga1s As Bit
 
Czas_ust = 12
Odliczanie = 0
Wysw = Czas_ust
 
Triak Alias P1.1
Buzzer Alias P1.0
'****************************
      'Petla glowna
'****************************
Do
 
If Flaga4ms = 1 Then
  Flaga4ms = 0
  Gosub Wyswietlanie
  Gosub Przyciski
End If
 
If Flaga1s = 1 Then
  Flaga1s = 0
  If Odliczanie = 1 Then
    Decr Czas
    Wysw = Czas
    If Czas = 0 Then
      Odliczanie = 0
      Triak = 1
      Stop Timer0
      P3 = 255
      Wysw = Czas_ust
      Buzzer = 0
      Waitms 200
      Buzzer = 1
      Waitms 200
      Buzzer = 0
      Waitms 200
      Buzzer = 1
      Start Timer0
    End If
  End If
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Flaga4ms
   Incr Co1s
   If Co1s = 250 Then
     Co1s = 0
     '***************************************  co 1s
     Set Flaga1s
   End If
 End If
 
Return
'****************************
Wyswietlanie:
  Mux = Not Mux
 
  If Mux = 1 Then
    Set P1.6
    Wysw10 = Wysw / 10
    If Wysw < 10 Then Wysw10 = 10
    Wysw10 = Lookup(wysw10 , Tabela)
    P3 = Wysw10
    Reset P1.7
  Else
    Set P1.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    P3 = Wysw1
    Reset P1.6
  End If
Return
 
Przyciski:
  Sw_port = P1
  Sw_port = Sw_port Or &B11000011
  If Sw_port <> 255 And Stan_portu = Sw_port Then
    Incr Licznik_sw
    If Licznik_sw = 120 Then
      Licznik_sw = 0
      Select Case Stan_portu
        Case 223:                                             '+1
          If Odliczanie = 0 Then
            If Czas_ust < 99 Then Incr Czas_ust
          Else
            Odliczanie = 0
            Triak = 1
          End If
        Case 239:                                             '-1
          If Odliczanie = 0 Then
            If Czas_ust > 1 Then Decr Czas_ust
          Else
            Odliczanie = 0
            Triak = 1
          End If
        Case 247:                                             '+10
          If Odliczanie = 0 Then
            If Czas_ust < 90 Then Czas_ust = Czas_ust + 10
          Else
            Odliczanie = 0
            Triak = 1
          End If
        Case 251:                                             '-10
          If Odliczanie = 0 Then
            If Czas_ust > 10 Then Czas_ust = Czas_ust - 10
          Else
            Odliczanie = 0
            Triak = 1
          End If
        Case 207:                                             'start
          If Odliczanie = 0 Then
            Co4ms = 0
            Co1s = 0
            Load Timer0 , 250
            Flaga4ms = 0
            Flaga1s = 0
            Czas = Czas_ust
            Odliczanie = 1
            Triak = 0
          Else
            Odliczanie = 0
            Triak = 1
          End If
      End Select
 
      Wysw = Czas_ust
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 80
  End If
Return
                           'Tabela do wyswietlania
'*******************************************************************************
Tabela:
    Data 65 , 207 , 82 , 70 , 204 , 100 , 96 , 79 , 64 , 68 , 255
     'znak:    0     1    2    3    4    5     6    7    8   9   pusty

Zdjęcia Projektu:

ZałącznikWielkość
Schemat80.85 KB
Płytka15.27 KB
Płytka (odbicie lustrzane)15.34 KB
Płytka (4 na stronie)53.08 KB
Montowanie21.01 KB
Kod Źródłowy4.26 KB
Program po kompilacji (BIN)780 bajtów
Program po kompilacji (HEX)2.17 KB
Nadruk na obudowę36.46 KB



Portret użytkownika Robert Bar

PRŚBA O ZMIANE PROGRAMU

Witam serdecznie
Na wstępie muszę pochwalić projekty są one dobrze dopracowane dla początkujących takich jak ja.
Che parę z nich zrealizować w praktyce . Powstały pierwsze trzy, miedzy innymi ten timer ,w którym chciałem dokonać zmiany odliczanego czasu na minuty (1-99 minut). Niestety brak wiedzy nie pozwala mi tego zrobić. Bardzo proszę o wskazówki jak ,lub poprawę kodu zródłowego.
Bardzo proszę jeżeli to możliwe o podanie nr kontaktowego ,ponieważ zależało by mi na kontakcie z doświadczoną osobą piszącą programy na mikro kontrolery.
Tak na marginesie też mam kilka fajnych pomysłów do zrealizowania ,ale niestety brak wiedzy.

Z góry dziękuje

pozdrawiam
Robert

Portret użytkownika mirley

Re: Prosty Timer

Aby timer odliczał w minutach zamiast w sekundach wystarczy zmienić dzielnik w obsłudze przerwania:

Przerwanie0:
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Flaga4ms
   Incr Co1s
   If Co1s = 15000 Then                     '<<<<  Tu należy zmienic
     Co1s = 0
     '***************************************  co 1m
     Set Flaga1s
   End If
 End If
Return

Zmieniamy wartość z 250*4ms = 1s na 15000*4ms = 1min i to już chyba wszystko. Jeszcze tylko należy zmienić typ zmiennej na początku programu na Word tak aby obsługiwała większe wartości (linijka poniżej)

Dim Co4ms As Byte , Co1s As Word

Zmiany które napisałem nie są sprawdzane gdyz nie mam w domu juz tego timera. W razie dalszych problemów proszę dać znać. Pytania o konkretny projekt najlepiej pisać właśnie tak jak to pytanie, bezpośrednio na stronie. Jedyna formą kontaktu jest mail: mirley(at)op.pl lub formularz kontaktowy na stronie co sprowadza się do tego samego. Na mail możesz napisać o propozycjach układów i ewentualnie zapytać o inne rzeczy nie związane z projektami na stronie. Odpowiem zaraz w wolnej chwili

-

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 Robert Bar

Dziękuje

Witam
Dziękuję bardzo za tak szybką odpowiedż,dzisiaj dokonam zmian i wypróbuje .

Pozdrawiam
Robert

Portret użytkownika Robert Bar

Odpowiedż

Witam
Wszystko działa po zmianach .
Taki sposób przekazywanie wiedzy dla początkujących jest nieoceniony.

Dziękuje bardzo

Pozdrawiam
Robert

Portret użytkownika Kamil

Czy można zamiast tego

Czy można zamiast tego mikroprocesora użyć ATtiny2313?? Jeżeli tak to jakich zmian w programie trzeba by było dokonać??

-

Są ludzie i parapety, ale żeby klamką się urodzić to jest sztuka.

Portret użytkownika mirley

Re: Timer

Należy pozmieniać wyprowadzenia typ mikrokontrolera, ustawienia ttimera i wiele innych, na końcu skompilować to pod bascom AVR. Troszkę roboty jest

-

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 demsy1

Programowanie AT89C2051

Czy układzik AT89C2051 mogę zaprogramować programatorem USBasp?

Portret użytkownika mirley

RE: 2051

Nie, tylko programator równoległy

-

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 emailos

W przypadku tworzenia

W przypadku tworzenia podobnego timera na atmega8, gdzie Piny od segmentów mam na PB0 - PB5 i 7 segment na PD5. Jak mam skonfigurować porty i czy trzeba coś zmieniać jeszcze w programie aby to działało. Oczywiście pozmieniałem ustawienia timera, i specyficzne. 2 PINY od Anod Piny potrafię skonfigurować.

Inna konfiguracja wyjsć segmentów jest niemożliwa do zrealizowana ponieważ inne porty są zajęte.

Portret użytkownika emailos

POMOC

Jak skonfigurować Porty dla atmegi8, gdzie segmenty mam na pb0-pb5 i pd5 czy jest to możliwe??

Portret użytkownika mirley

Re: Timer

Zrób sobie w programie zmienną pomocnicza typu Byte. Zamias przypisywac poleceniem lookup do portu to przypisuj do tej zmiennej, a potem przypisz bit po bicie zmienna do odpowiednich pinów wyjściowych

-

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 emailos

Wiem że to meczące ;p

Ale w jaki sposób przypisać bit po bicie zmienna do odpowiednich pinów wyjściowych??

Portret użytkownika mirley

Re: Timer

 If Mux = 1 Then
    Set P1.6  
    Wysw10 = Wysw / 10
    If Wysw < 10 Then Wysw10 = 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Zmienna = Wysw10
    Portx.y = zmienna.x 'i tak kolejne bity 7 linijek
    Portx.y = zmienna.x 
    Portx.y = zmienna.x 
    '.....
    Reset P1.7
  Else
    Set P1.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Zmienna = Wysw1
    Portx.y = zmienna.x 'i tak kolejne bity 7 linijek
    Portx.y = zmienna.x 
    Portx.y = zmienna.x
    '.....
    Reset P1.6
  End If

Można to potem zoptymalizować za pomocą operacji logicznych.... narazie zobacz czy idzi

-

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 emailos

czy to powinno tak wugladac??

  If Mux = 1 Then
    Set Pind.6
    Wysw10 = Wysw / 10
    If Wysw < 10 Then Wysw10 = 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portwysw = Wysw10
    Portb.0 = Portwysw.0
    Portb.1 = Portwysw.1
    Portb.2 = Portwysw.2
    Portb.3 = Portwysw.3
    Portb.4 = Portwysw.4
    Portb.5 = Portwysw.5
    Portd.1 = Portwysw.6
    Reset Pind.7
  Else
 
    Set Pind.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portwysw = Wysw1
    Portb.0 = Portwysw.0
    Portb.1 = Portwysw.1
    Portb.2 = Portwysw.2
    Portb.3 = Portwysw.3
    Portb.4 = Portwysw.4
    Portb.5 = Portwysw.5
    Portd.1 = Portwysw.6
    Reset Pind.6
  End If

Portret użytkownika mirley

Re: Timer

Powinno tak zadziałać, to najprostsza wersja... Optymalniej będzie jednak nie przypisywać: Portwysw = Wysw1 a od razu do portów wpisac bity zmiennej Wysw1.x a w drugim przypadku wysw10.x..... Można też spróbować tak:

Portb = wysw1 And &B00111111
Portd.1 = wysw1.6

-

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 emailos

If Mux = 1 Then Set

  If Mux = 1 Then
    Set Pind.6
    Wysw10 = Wysw / 10
    If Wysw < 10 Then Wysw10 = 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10 And &B00111111
    Portd.1 = Wysw1.6
    Reset Pind.7
  Else
    Set Pind.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1 And &B00111111
    Portd.1 = Wysw1.6
    Reset Pind.6
  End If

w tym przypadku usuwam jeszcze ta zmienna co robiłem - portwysw tak?

Portret użytkownika mirley

Re: Timer

Tak.... okazała się niepotrzebna. Sprawdź czy to działa tak jak chcesz

-

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 MULTIMEN

Timer 24s.

Witaj Mirek bedzie duzo roboty zeby timer zliczal od 24s. do 0 i wlaczal syrene na 2 sek po odliczeniu 24 sekund. 2 przysiki sterujace Start powduje wyswietlenie 24 sek i zliczanie do 0 i stop zatrzymuje odliczanie i resetuje licznik. kolejne nacisniecie start ponowne zliczanie od 24s. jesli odliczy cale 24 sek. tu przekaznik zwiera na 2 sek. Timer jest potrzebny na mecz koszykowki firma sprowadzajaca tablice niewyrobila sie z zamowieniem :) i musze na szybko zrobic cos w zastepstwie :) jesli ktos ma moze jakis pomysl na cod. to z gory dziekuje za pomoc bo mam czas do srody :)

-

MULTI

Portret użytkownika mirley

Re: timer

Będzie to działało.. bo dokładnie tak to jest zrobione z tym że na początku jest 12 sekund ustawione. Trzeba zmienić:

      Buzzer = 0
      Waitms 200
      Buzzer = 1
      Waitms 200
      Buzzer = 0
      Waitms 200
      Buzzer = 1

na

      Buzzer = 0
      Wait 2
      Buzzer = 1

oraz na początku Czas_ust = 12 na Czas_ust = 24

-

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 MULTIMEN

Super :) a możliwość

Super :) a możliwość zatrzymana timera zanim odliczy do 0 24 sek? czasem bedzie potrzebne anulowanie tego odliczania jesli pilka zostanie zucona do kosza :) i niepotrzebnie by robilo halas :) przegladam co mam i mam ATtint2313 reszte powinienem miec wyswietlacz musze zrobic na ledach conajmniej 30cm wysokosci ale to juz do zrobienia mozna by uzyc gotowego ktore sa uzywane do wyswietlania numerkow w sklapach albo na poczcie :) w razie gdybm mial sie nie wyrobic :)

-

MULTI

Portret użytkownika mirley

Re: Stop

Drugie naciśnięcie start zatrzyma odliczanie i zresetuje ustawiony czas na ustawiony wcześniej

-

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 MULTIMEN

:) no to ideal :D

:) no to ideal :D

-

MULTI

Portret użytkownika Piotr59mb

Witam. Nigdy nie pisałem w

Witam.
Nigdy nie pisałem w bascomie, ale robię układ wykorzystujący 3 fazowy układ wykonawczy, gdzie sterowanie dobywałoby się poprzez właśnie układ mikroprocesorowy. Chciałem wykorzystać w części ten program, ale nie wiem za bardzo co i jak zmienić aby układ po prostu podał 1 log na jedno wyjście, powiedzmy P1.4 (AT89S4051), potem po otrzymaniu sygnału (z przekaźnika, więc może być to zarówno 1 jak i 0 log) zmieniłby stan na P1.4 z 1 na 0 log, potem odczekałby daną liczbę sekund a następnie znów podałby 1 log na P1.4. Do tego 2 przyciski: +1 i -1 (dodanie/odjęcie 1 sekundy). Postanowiłem użyć fragmentu z tego programu, ponieważ układ wykorzystuje przyciski. Mógłbym liczyć na małą pomoc lub wskazówkę?

Pozdrawiam
Piotr59mb

Portret użytkownika mirley

Re: Timer

Ale do tego nie potrzebujesz prawie nic modyfikować. Wystarczy że z programu usuniesz:

     Stop Timer0
      P3 = 255
      Wysw = Czas_ust
      Buzzer = 0
      Waitms 200
      Buzzer = 1
      Waitms 200
      Buzzer = 0
      Waitms 200
      Buzzer = 1
      Start Timer0

zostaw jedynie linijkę Wysw = Czas_ust w tym miejscu co była.

Stan aktywny w mikrokontolerach 89 powinien być stanem niskim, wiec trzeba to uwzględnić. Sygnał z przekaźnika wystarczy podać na przycisk start, zwieranie do masy. Powinno zadziałać

-

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 piotr59mb

Dlqczego stanem aktywnym

Dlqczego stanem aktywnym powinien być stan niski? Chodzi o wydajność prądową rzędu 15mA? Jeśli tak to planuję poprowadzić sygnał poprzez tranzystor, więc właściwie będę mógł użyć stanu wysokiego (poniżej 2 na bazę)

Portret użytkownika mirley

Re: Timer

No właśnie dlatego że stan wysoki robiony jest wewnętrznym rezystorem..... zrobisz jak uważasz

-

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 Piotr59mb

Witam ponownie. Co mam

Witam ponownie.
Co mam jeszcze zmienić, aby na wyświetlaczu nie pokazywało się odliczanie, tylko czas który się ustawiło przyciskami?
I jeśli rozumiem, to układ ruszy ze stanem niskim na P1.1, a po odliczeniu ustalonego czasu, procesor ustali stan wysoki P1.1, tak? Natomiast potem jak zachowuje się układ? Czeka na przycisk start i rusza od nowa? (w sumie to by było logiczne, ale wolałbym się upewnić).

Pozdrawiam
Piotr59mb

Portret użytkownika Piotr59mb

Witam ponownie. Nie chciałem

Witam ponownie.
Nie chciałem pisać 2 postów pod rząd, ale nie ma tu opcji edycji postów. Da się pozbyć tego dekodera do przycisku, skoro buzzera nie wykorzystuję i nie będzie go w programie?

Portret użytkownika mirley

Re: Timer

Po kliknięciu start pojawi się stan niski na porcie wyjściowym P1.1 a po skończeniu odliczania wróci na wysoki i czeka na kolejny start do momentu aż nie braknie zasilania. Żeby cały czas pokazywał się ustawiony czas wystarczy zamienić:

Wysw = Czas

na

Wysw = Czas_ust

Buzzer można zastąpić przyciskiem ale trzeba przerobic procedurę obsługi klawiatury a to jest kłopotliwe.

Ps. Jak chcesz edytować posty to musisz być zalogowany na stronie

-

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 Piotr59mb

Ok, program ruszył, jednak

Ok, program ruszył, jednak mam jedno pytanie.
Mianowicie jak już wspominałem, zamiast przycisku start jest podłączona fotokomórka. Jak zmienić program, żeby program wystartował na zbocze narastające? (a właściwie opadające skoro ma być do masy zwierane) Chodzi o to, że fotokomórka nie wyśle tylko impulsu lecz ciągły sygnał, a w tym momencie program się zapętla i co jedną sekundę się resetuje.

Pozdrawiam
Piotr59mb

Portret użytkownika Piotr59mb

W innym projekcie użył Pan

W innym projekcie użył Pan programu reagującego na zbocze.
http://mirley.firlej.org/odbiornik_rc5
Dałoby się zrobić tutaj podobnie? nawet jeśli miałbym zamienić P3.2 na powiedzmy P1.0 (tak, żeby P3.2 odpowiadał za przycisk start, dzięki czemu wykryłby zbocze opadające, a segment 'e' do P1.0).
Połączyłbym odpowiednio te wyjścia na płytce za pomocą przewodów.

Portret użytkownika mirley

Re: timer

Dorzuć do programu jedną zmienną bitową i po problemie..... poniżej fragment obsługi przycisków, będzie teraz wyglądał tak:

        Case 207:                                             'start
          If start_flag = 1 Then
            start_flag = 0
            If Odliczanie = 0 Then
              Co4ms = 0
              Co1s = 0
              Load Timer0 , 250
              Flaga4ms = 0
              Flaga1s = 0
              Czas = Czas_ust
              Odliczanie = 1
              Triak = 0
            Else
              Odliczanie = 0
              Triak = 1
            End If
          End If
      End Select
 
      Wysw = Czas_ust
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 80
    start_flag = 1
  End If
Return

Teraz przycisk start będzie reagował jednorazowo. Jak go puścisz i przyciśniesz znowu to zareaguje drugi raz

-

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 piotr59mb

Zareaguje na zbocze? Chodzi o

Zareaguje na zbocze? Chodzi o to zeby wlaczyl sie kiedy "przycisk" bedzie wciśnięty, a nie dopiero gdy sie go pusci.

Portret użytkownika mirley

Re: Timer

Zareaguje jak przycisk wciśniesz czyli jak zewrzesz do masy.... Jak będziesz trzymał dalej to się nic nie stanie aż do momentu jak nie wystąpi na porcie stan wysoki chociaż na chwilę.

-

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 piotr59mb

Ok działa, ale pozostał

Ok działa, ale pozostał jeszcze mały problem, ale to już kwestia estetyki. Gdy przedmiot znajduje się między fotokomórkami, na wyświetlaczu pojawia się na zmianę ustawiony czas i odliczanie (tj. ustawiony np. na 12 sekund: 12, 11, 12, 10, 12, 9, itd). Natomiast gdy przedmiot po prostu przetnie wiązkę z fotokomórek tylko przez chwilę, tak żeby uruchomić odliczanie, to wyświetlacz pokazuje tak jak powinien (samo odliczanie).
Jak się pozbyć tego problemu?

Portret użytkownika mirley

Re: Timer

Co to znaczy że przedmiot znajduje się między fotokomórkami? Jaki jest wtedy stan na przycisku start lub innych do których podłączasz fotokomórkę?

-

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 piotr59mb

Jezeli przedmiot znajduje sie

Jezeli przedmiot znajduje sie miedzy fotokomorkami to jest caly czas stan niski. Tak jakbysmy przytrzymali przycisk START

Portret użytkownika mirley

Re: timer

Zamiast końcówki obsługi klawiatury :

 ....
      Wysw = Czas_ust
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 80
    start_flag = 1
  End If
Return

wstaw:

 ....
      If start_flag = 1 Then Wysw = Czas_ust 
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 80
    start_flag = 1
  End If
Return

w sumie polega to na zmodyfikowaniu jednej linii :)

-

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 piotr59mb

Teraz na wyświetlaczu jest

Teraz na wyświetlaczu jest już PRAWIE tak jak powinno być. :) Po odliczeniu na wyświetlaczu pokazuje się 0 a nie ponownie czas ust.

Portret użytkownika mirley

Re: Timer

Zamieść cały swój program bo już się pogubiłem co zmodyfikowaliśmy

-

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 piotr59mb

$crystal = 12000000

$crystal = 12000000                                           '12MHz
$regfile = "89S4051.DAT"
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
Enable Interrupts
 
Dim Co4ms As Byte , Co1s As Byte
Dim Czas As Byte , Czas_ust As Byte
Dim Wysw As Byte , Wysw10 As Byte , Wysw1 As Byte
Dim Sw_port As Byte , Stan_portu As Byte , Licznik_sw As Byte
Dim Mux As Bit
Dim Odliczanie As Bit
Dim Flaga4ms As Bit
Dim Flaga1s As Bit
Dim Start_flag As Bit
 
Czas_ust = 12
Odliczanie = 0
Wysw = Czas_ust
 
Triak Alias P1.1
'****************************
      'Petla glowna
'****************************
Do
 
If Flaga4ms = 1 Then
  Flaga4ms = 0
  Gosub Wyswietlanie
  Gosub Przyciski
End If
 
If Flaga1s = 1 Then
  Flaga1s = 0
  If Odliczanie = 1 Then
    Decr Czas
    Wysw = Czas
    If Czas = 0 Then
      Odliczanie = 0
      Triak = 0
    End If
  End If
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Flaga4ms
   Incr Co1s
   If Co1s = 250 Then
     Co1s = 0
     '***************************************  co 1s
     Set Flaga1s
   End If
 End If
 
Return
'****************************
Wyswietlanie:
  Mux = Not Mux
 
  If Mux = 1 Then
    Set P1.6
    Wysw10 = Wysw / 10
    If Wysw < 10 Then Wysw10 = 10
    Wysw10 = Lookup(wysw10 , Tabela)
    P3 = Wysw10
    Reset P1.7
  Else
    Set P1.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    P3 = Wysw1
    Reset P1.6
  End If
Return
 
Przyciski:
  Sw_port = P1
  Sw_port = Sw_port Or &B11000011
  If Sw_port <> 255 And Stan_portu = Sw_port Then
    Incr Licznik_sw
    If Licznik_sw = 120 Then
      Licznik_sw = 0
      Select Case Stan_portu
        Case 223:                                             '+1
          If Odliczanie = 0 Then
            If Czas_ust < 99 Then Incr Czas_ust
          Else
            Odliczanie = 0
            Triak = 0
          End If
        Case 239:                                             '-1
          If Odliczanie = 0 Then
            If Czas_ust > 1 Then Decr Czas_ust
          Else
            Odliczanie = 0
            Triak = 0
          End If
        Case 247:                                             '+10
          If Odliczanie = 0 Then
            If Czas_ust < 90 Then Czas_ust = Czas_ust + 10
          Else
            Odliczanie = 0
            Triak = 0
          End If
        Case 251:                                             '-10
          If Odliczanie = 0 Then
            If Czas_ust > 10 Then Czas_ust = Czas_ust - 10
          Else
            Odliczanie = 0
            Triak = 0
          End If
        Case 207:                                             'start
          If Start_flag = 1 Then
            Start_flag = 0
            If Odliczanie = 0 Then
              Co4ms = 0
              Co1s = 0
              Load Timer0 , 250
              Flaga4ms = 0
              Flaga1s = 0
              Czas = Czas_ust
              Odliczanie = 1
              Triak = 1
            Else
              Odliczanie = 0
              Triak = 0
            End If
          End If
      End Select
 
      If Start_flag = 1 Then Wysw = Czas_ust
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 80
    Start_flag = 1
  End If
Return
                           'Tabela do wyswietlania
'*******************************************************************************
Tabela:
    Data 65 , 207 , 82 , 70 , 204 , 100 , 96 , 79 , 64 , 68 , 255
     'znak:    0     1    2    3    4    5     6    7    8   9   pusty

Portret użytkownika mirley

Re: Timer

Spróbuj dodać linijkę w obsłudze flagi 1s:

If Flaga1s = 1 Then
  Flaga1s = 0
  If Odliczanie = 1 Then
    Decr Czas
    Wysw = Czas
    If Czas = 0 Then
      Odliczanie = 0
      Triak = 0
      Wysw = Czas_ust              'to dodaj
    End If
  End If
End If

-

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 kekek

Dzien dobry chcial bym

Dzien dobry chcial bym zapytac czy by szlo program nagrac do attiny2313 cz nusie zrobic jakes zmiany jesli tak tak jakie ?

Portret użytkownika mirley

Re: Timer

Tak poprostu to programu nie da się wgrać do tiny.... trzeba napisać nowy program w bascomie avr, korzystając z obecnego.... trzeba skonfigurować timer do odliczania opóźnienia 4ms, przy kwarcu 16MHZ podzielnik 256, dostaniesz 4ms jak przerwanie będzie wyglądał tak:

Przerwanie0:
   Timer0 = 6
   '***************************************  co 4ms
   Set Flaga4ms
   Incr Co1s
   If Co1s = 250 Then
     Co1s = 0
     '***************************************  co 1s
     Set Flaga1s
   End If 
Return

W programie należy też zmienić nazwy pinów na takie jak ma tiny2313, a piny na których są przyciski ustawić jako wejścia. Pozostałe piny to wyjścia

-

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 kekek

mogl by pan mi tego programu

mogl by pan mi tego programu zmenic bo probowalem ale mie to nieidzie

Portret użytkownika Farmer760

timer

Czy jest jakaś szansa na opisanie konfiguracji timera z powyższego wsadu krok po kroku (włączenie przerwań,dzielniki w zależności od kwarcu itp.)?
Ewentualnie "wyłowienie" z przedstawionego wsadu komend z timerem związanych z komentarzem dlaczego tak ?
Będę wdzięczny bo nie mogę tego ogarnąć. Pozdrawiam.

Portret użytkownika Piotr59mb

Zapomniałem podziękować za

Zapomniałem podziękować za pomoc przy modyfikacji programu więc... Dzięki serdeczne :)

Portret użytkownika mirley

Re: Timer

Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
Enable Interrupts

Konfiguracja timera ustawia go w tryb 2 czyli timer 8 bitowy z automatycznym przeładowaniem wartości. Pisząc Load timer0 = 250 w praktyce w starszej części licznika ląduje wartość 6 bo licznik liczy do 255 i nastepny impuls go przepełnia czyli dokładnie 250 cykli które chcemy uzyskać poleceniem load. W następnych liniach włączamy przerwania od timera i uruchamiamy timer. Po każdym przerwaniu czyli przejściu licznika z max wartości 255 na 6 wywoływana jest procedura Przerwanie0. Wywoływanie to następuje co określony czas w tym przypadku kwarc 12MHz/ 12 (bo taki jest dzielnik wewnętrzny) trafia na wejście timera. Czyli licznik timera liczy przebieg 1MHz i po 250 okresach wywoła przerwanie. Przerwanie wystąpi zatem z częstotliwościa 4kHz czyli dokładnie co 0,25us. W procedurze obsługi przerwania liczę sobie 16 przerwań co daje odcinki czasu po 4ms a następnie liczę 250 odcinków czasu po 4ms co daje 1s.

-

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 farmer760

timer

Dzięki za proste i rzeczowe wyjaśnienie. Jakbyś Mirku mógł wyjaśnić jeszcze kestie: "kwarc 12Mhz/12". Czy wewnętrzny dzielnik ustawia się auto czy trzeba go ustawić ręcznie np. w atmega16, kwarc 8 lub 16 Mhz ?

Portret użytkownika mirley

Re: Kwarc

Dzielnik wewnętrzny w 2051 jest ustawiony na stałe na 12, nie da się przestawiać tak jak w AVR. Procesor 2051 może działać tylko z kwarcem, nie ma żadnych fusbitów ani innych ustawień

-

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.