Timer na ATTINY2313


Mam działający programik timera zrealizowny na attiny2313, czasy są liczone na timer1 i teraz mam pytanie jak zrealizować aby z poz_menu można było zmienić wartość Dzielnik_1 aby odliczał w sek. lub min.
Wiem ,że muszę zmienić w poz_menu

Case &B00000100:                                    'poz menu(2 pozycje 0/1/)
           Incr Poz_menu
           If Poz_menu = 2 Then                             'ilosc poz_menu 0/1/)
             Poz_menu = 0

na
Case &B00000100:                                    'poz menu(2 pozycje 0/1/)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/2)
             Poz_menu = 0

ale jak dalej,czy tak będzie można to rozwiązać, dołączam cały kod
 '*******************1*timer attiny 2313*********************
 '*******************marekszy********************************
 '*******************konfiguracja uC*************************
$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01111000 : Portd = &B01101111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
 
Przekaznik1 Alias Portd.4                                   'start PK1  out
Led_menu Alias Portd.3                                      'miganie
 
Declare Sub Loading                                         'animacja ladowana do LCD w trakcie startu
Loading
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit , Flaga_1s As Byte                     'flagi
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany As Word
Dim Poz_menu As Byte
Dim Dzielnik_1s As Byte , Dzielnik_1min As Byte , Dzielnik_1 As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Byte
Dim Czas_odliczony As Byte
Dim Stan_pracy As Byte
Dim Odliczanie As Byte
Dim Wysw_poz As Byte
Dim Migaj As Byte
Dim Mig As Bit , Led_menu As Bit
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 
Readeeprom Czas_zadany , 2
  If Czas_zadany > 99 Then                                  'gdy czas wiekszy od 99s wczytaj 15s
    Czas_zadany = 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
          Migaj = 0
        Case 1:
          Wysw = Czas_zadany
          Migaj = 1
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
      Gosub Miganie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
Timer0 = 100
 Flaga_4ms = 1
  Incr Dzielnik_1s
   If Dzielnik_1s = 250 Then
      Dzielnik_1s = 0
     Toggle Mig
      If Odliczanie = 1 Then
         Led_menu = Mig
      End If
   End If
 Return
 
'*****************przerwanie timer0 koniec*****************
'*****************przerwanie timer1************************
Prztimer1:
Timer1 = 26474
 Flaga_1s = 1
  Incr Dzielnik_1
   If Dzielnik_1 = 60 Then                                  '1s x 60 =1min
      Dzielnik_1 = 0
     If Czas_odliczony > 0 Then
       Decr Czas_odliczony
       If Czas_odliczony = 0 Then
          Stan_pracy = 0
       End If
     End If
   End If
  Return
 
'*****************sterowanie poczatek**********************
Sterowanie:
  Select Case Stan_pracy
    Case 0:                                                 'co ma byc zal/wyl przy menu 0 (STOP)
      Reset Przekaznik1
    Case 1:                                                 'co ma byc zal/wyl przy menu 1 (SW_1)
      Set Przekaznik1
  End Select
Return
 
'*****************sterowanie koniec************************
'*******************miganie********************************
Miganie:
  Select Case Migaj
    Case 0:
      Reset Led_menu
    Case 1:
      If Mig = 1 Then
       Set Led_menu
        Else
       Reset Led_menu
      End If
  End Select
Return
 
'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 2 Then Mux = 0
  Select Case Mux
   Case 0:
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
   Case 1:
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
  End Select
Return
 
'*****************wyswietlanie koniec**********************
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pind And &B00000111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00000011:                                    'start
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 1
             Czas_odliczony = Czas_zadany
             Dzielnik_1 = 0
           Else
             'Stan_pracy = 1                                 'ponowne nacisniecie sw odlicza od nowa
             'Czas_odliczony = Czas_zadany
             'Dzielnik_1 = 0
             Stan_pracy = 0                                 'ponowne nacisniecie sw wylacza
             Czas_odliczony = 0
           End If
         End If
 
 
        Case &B00000100:                                    'poz menu(2 pozycje 0/1/)
           Incr Poz_menu
           If Poz_menu = 2 Then                             'ilosc poz_menu 0/1/)
             Poz_menu = 0
 
               Writeeeprom Czas_zadany , 2                  'zapis do pamieci eeprom
           End If
        Case &B00000101                                     'sek + pd.0
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s
                Else
                 Odliczanie = 0
              End If
          End Select
 
        Case &B00000110                                     'sek - pd.1
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany > 0 Then Decr Czas_zadany     'gdy > 1 ograniczenie do 1s,
                Else                                        '> 0 praca start/stop bez odliczania czsu
                 Odliczanie = 0
              End If
          End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'***************animacje dla LCD****************************************
Sub Loading :                                               'program animacji startowej
Waitms 500
 
    Set Portd.6
    Set Portd.5
    Wysw10 = 254
    Portb = Wysw10
    Reset Portd.6
    Reset Portd.5
    Waitms 250
 
    Wysw10 = 251
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 239
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 191
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 127
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 253
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 247
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 32
    Portb = Wysw10
    Waitms 1000
 
Return
End Sub
 
'**********************tabela*************************
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1    2     3     4     5    6     7    8     9
 
 
'Tabela_1:
  Data 254 , 251 , 239 , 191 , 127 , 253 , 247
'znak:   a     b     c     d     e     f     g
 
'tabela_2:
  Data 254 , 250 , 234 , 170 , 42 , 40 , 32
'znak:   a    ab    abc  abcd abcde abcdef abcdefg

schematu nie daje poniewarz wszystko widać z programu,no chyba ,że jak będzie potrzebny to dołączę.




Portret użytkownika matrix

Re: Timer na ATTINY2313

Jeszcze raz spokojnie i po polsku wyjaśnij co chcesz osiągnąć?
Takim wiesz, normalnym językiem.

Portret użytkownika marekszy

Timer na ATTINY2313

w chwili obecnej czas jest odliczany w min., gdy dzielnik_1 = 1 to wtedy chyba odlicza w sek.

Prztimer1:
Timer1 = 26474
 Flaga_1s = 1
  Incr Dzielnik_1
   If Dzielnik_1 = 60 Then                                  '1s x 60 =1min
      Dzielnik_1 = 0
 

a ja chcę mieć możliwość zmiany z poz_menu dzielnik_1 aby liczył sek. lub min. oraz aby pamiętał po resecie czy odliczał min. czy też sek.
Case &B00000100:                                    'poz menu(3 pozycje 0/1/2)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/)
             Poz_menu = 0
 
               Writeeeprom Czas_zadany , 2                  'zapis do pamieci eeprom
               'zapis min./sek.
           End If
        Case &B00000101                                    
          Select Case Poz_menu
            Case 1:                                         'sek + pd.0
              If Odliczanie = 0 Then
               If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s/99min
                Else
                 Odliczanie = 0
              End If
            Case 2:
              'tu zmiana sek. na min. za pom.+
              End If
           End Select
 
        Case &B00000110                                     
          Select Case Poz_menu
            Case 1:                                         'sek - pd.1
              If Odliczanie = 0 Then
               If Czas_zadany > 0 Then Decr Czas_zadany     'gdy > 1 ograniczenie do 1s./1min.
                Else                                        '> 0 praca start/stop bez odliczania czsu
                 Odliczanie = 0
              End If
             Case 2:
              'tu zmiana sek. na min. za pom.-
              End If
          End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return

Portret użytkownika matrix

Re: Timer na ATTINY2313

Masz dwa wyjścia.
Albo napiszesz warunek na przykład w ten sposób ustalając podstawę czasu jako 1sekunda:

if jakas_flaga = 1 then
   dzielnik_1 = dzielnik_1 + 60   'tu masz odliczanie co minutę
end if
if jakas_flaga = 0 then
   dzielnik_1 = dzielnik_1 + 1    'tu masz odliczanie co sekundę
end if

Albo zmienisz podstawę czasu ustalając przerwanie co 1 sekundę lub co jedną minutę i wtedy mogło by wyglądać to tak:

przerwanie:
if jakas_flaga = 1 then
   timer1 = XXXX      'tu wpisujesz taki timer co da Ci przerwanie co minutę
   incr dzielnik_1    'tu masz odliczanie co minutę
end if
if jakas_flaga = 0 then
   timer1 = XXXX      'tu wpisujesz taką wartość żeby timer odliczył 1 sekundę
   incr dzielnik_1    'tu masz odliczanie co sekundę
end if
return

Obydwa rozwiązania czysto teoretyczne i wymyślone w mniej niż 10 sekund. Nie ogarniam Twojego kodu i nie do końca kojarzę jaki masz zamysł.

Portret użytkownika marekszy

Timer na ATTINY2313

To co napisałeś to nie jes to o co mi chodzi, ustawienie dwóch flag dla min. i sek. to chyba będzie za proste,

Case &B00000100:                                    'poz menu(3 pozycje 0/1/2)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/)
             Poz_menu = 0

gdy naciśniemy SW menu zwierający do masy Pd.0 i Pd.1 wchodzimy do pirwszej poz_menu w której wykonujemy ustawianie czasu jaki ma odliczyć,
Case 1:                                         'sek + pd.0
  If Odliczanie = 0 Then
   If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s/99min
    Else
     Odliczanie = 0
  End If

oraz
 Case 1:                                         'sek - pd.1
  If Odliczanie = 0 Then
   If Czas_zadany > 0 Then Decr Czas_zadany     'gdy > 1 ograniczenie do 1s./1min.
    Else                                        '> 0 praca start/stop bez odliczania czsu
    Odliczanie = 0
  End If

kolejne naciśnięcie SW menu przejdzie do 2 poz_menu gdzie chcę ustawiać dzielnik_1 na zliczanie sek. lub min. czyli dzielnik_1 = 1 lub dzielnik_1 = 60
Case 2:
  'tu zmiana sek. na min. za pom.+ Pd.0
    End If

Case 2: 
  'tu zmiana sek. na min. za pom.- Pd.1
    End If

i ponowne naciśnięcie SW menu wychodzi z ustawień i zapisujemy wszystko

Portret użytkownika matrix

Re: Timer na ATTINY2313

To tak jak pisałem. Zastosuj zmianę podstawy czasu z 1 sekunda na 1 minuta ustawiając w case 2 flagę na 0 lub 1.

Case 2:
  If PIND.0 = 0 then flaga_czasu = 0    'tu ustawisz wskaźnik podstawy czasu co 1 sekundę
  If PIND.1 = 0 then flaga_czasu = 1    'tu ustawisz wskaźnik podstawy czasu na 1 minutę

Teraz przerwanie albo tak:

Przerwanie:
  If flaga_czasu = 0 then Timer1 = XXXX    'wpisz do timera liczbę która da Ci przerwanie co 1 sekundę
  If flaga_czasu = 1 then Timer1 = YYYY    'wpisz do timera liczbę która da Ci przerwanie co 1 minutę
return

Albo lepiej utrzymać podstawę czasu co 1 sekundę i napisać przerwanie jak niżej:

Przerwanie:
  Timer1 = XXXX    'przerwanie co jedną sekundę
  If flaga_czasu = 1 then    'jeśli w case 2 wybrano przerwanie co minutę to
     incr zmienna_pomocnicza    'zwiększ wartość zmiennej pomocniczej
     If zmienna_pomocnicza = 60 then    'jak zmienna pomocnicza osiągnie 60 czyli minutę
        zmienna_pomocnicza = 0    'wyzeruj ją
        incr zmienna_glowna    'i zwiększ wartość zmiennej głównej. tu uzyskasz minutę
     end if
  End if
  If flaga_czasu = 0 then incr zmienna_glowna    'gdy masz wybrane co sekundę to od razu zwiększasz wartość zmiennej
Return

Portret użytkownika marekszy

Timer na ATTINY2313

To ma sens, dzięki ,jutro przećwiczę w praktyce.

Portret użytkownika marekszy

Timer na ATTINY2313

Timer działa już bez problemów, pierwsze naciśnięcie SW3 wchodzi do ustawiania czasu ,ponowne naciśnięcie wchodzi do ustawienia dzielnika (odliczanie w sek. lub min.),kolejne powoduje wyjście z menu i zapis ustawionego czasu i dzielnika min/sek. Przycisk start/stop wiadomo co robi. po małej modyfikacji w obsłudze przycisków Timer pracuje na zasadzie,że każde naciśnięcie START w trakcie odliczania rozpoczyna odliczanie od nowa. Po włączeniu zasilania najpierw jest mała animacja na wysw.LED, następnie jest gotowy do pracy.Dołączam cały kod oraz schemat.CKDIV8 -wewnętrzny podział zegara przez 8 jest wyłączony,kwarc zewn.10MHz. Nie testowałem jeszcze z przekaźnikiem, ale dioda LED sygnalizuje załączenie wyjścia.

 '*******************1*timer V3 attiny 2313******************
 '*******************marekszy********************************
 '*******************konfiguracja uC*************************
 
$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01111000 : Portd = &B01101111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
 
Przekaznik1 Alias Portd.4                                   'start PK1  out
Led_menu Alias Portd.3                                      'miganie
 
Declare Sub Loading                                         'animacja ladowana do LCD w trakcie startu
Loading
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit , Flaga_1s As Byte
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany As Word
Dim Poz_menu As Byte
Dim Dzielnik_1s As Byte , Dzielnik_1 As Byte , Dzielnik_x As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Byte
Dim Czas_odliczony As Byte
Dim Stan_pracy As Byte
Dim Odliczanie As Byte
Dim Migaj As Byte
Dim Mig As Bit , Led_menu As Bit
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 
Readeeprom Czas_zadany , 2
  If Czas_zadany > 99 Then                                  'gdy czas wiekszy od 99s wczytaj 15s
    Czas_zadany = 15
  End If
Readeeprom Dzielnik_x , 4
  If Dzielnik_x > 60 Or Dzielnik_x < 60 Then                'gdy dzielnik_x <> 60 ustawia 1
     Dzielnik_x = 1
  End If
 
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
          Migaj = 0
        Case 1:
          Wysw = Czas_zadany
          Migaj = 1
        Case 2:
           Wysw = Dzielnik_x
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
      Gosub Miganie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
Timer0 = 100
 Flaga_4ms = 1
  Incr Dzielnik_1s
   If Dzielnik_1s = 250 Then
      Dzielnik_1s = 0
     Toggle Mig
      If Odliczanie = 1 Then
         Led_menu = Mig
      End If
   End If
 Return
 
'*****************przerwanie timer0 koniec*****************
'*****************przerwanie timer1************************
Prztimer1:
Timer1 = 26474
 Flaga_1s = 1
  Incr Dzielnik_1
   If Dzielnik_1 = Dzielnik_x Then                          '1s dzielnik_x=1
      Dzielnik_1 = 0                                        '1min dzielnik_x=60
     If Czas_odliczony > 0 Then
       Decr Czas_odliczony
       If Czas_odliczony = 0 Then
          Stan_pracy = 0
       End If
     End If
   End If
  Return
 
'*****************sterowanie poczatek**********************
Sterowanie:
  Select Case Stan_pracy
    Case 0:                                                 'co ma byc zal/wyl stan_pracy=0 (STOP)
      Reset Przekaznik1
    Case 1:                                                 'co ma byc zal/wyl stan_pracy1 (START)
      Set Przekaznik1
  End Select
Return
 
'*****************sterowanie koniec************************
'*******************miganie********************************
Miganie:
  Select Case Migaj
    Case 0:
      Reset Led_menu
    Case 1:
      If Mig = 1 Then
       Set Led_menu
        Else
       Reset Led_menu
      End If
  End Select
Return
 
'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 2 Then Mux = 0
  Select Case Mux
   Case 0:
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
   Case 1:
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
  End Select
 
Return
 
'*****************wyswietlanie koniec**********************
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pind And &B00000111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00000011:                                    'START/STOP Pd.2 (SW4)
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 1
             Czas_odliczony = Czas_zadany
             Dzielnik_1 = 0
           Else
             'Stan_pracy = 1                                 'ponowne nacisniecie sw odlicza od nowa
             'Czas_odliczony = Czas_zadany
             'Dzielnik_1 = 0
             Stan_pracy = 0                                 'ponowne nacisniecie sw wylacza
             Czas_odliczony = 0
           End If
         End If
 
 
        Case &B00000100:                                    'poz menu(3 pozycje 0/1/2) Pd.0 i Pd.1 (SW3)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/2)
             Poz_menu = 0
 
               Writeeeprom Czas_zadany , 2                  'zapis do pamieci eeprom
               Writeeeprom Dzielnik_x , 4
           End If
        Case &B00000101                                     'sek + Pd.1 (SW1)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s
                Else
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then
                If Dzielnik_x = 60 Then                     'ustawienie dzielnika na 1min/1s
                   Dzielnik_x = 1
                 Else
                   Dzielnik_x = 60
                End If
               End If
          End Select
 
        Case &B00000110                                     'sek - Pd.0 (SW2)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany > 0 Then Decr Czas_zadany     'gdy = 1 ograniczenie do 1s,
                Else                                        'gdy 0 praca start/stop bez odliczania czsu
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then                       'ustawienie dzielnika na 1s/1min
                If Dzielnik_x = 1 Then
                   Dzielnik_x = 60
                 Else
                   Dzielnik_x = 1
                End If
               End If
          End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'***************animacje dla LCD****************************************
Sub Loading :                                               'program animacji startowej
Waitms 500
 
    Set Portd.6
    Set Portd.5
    Wysw10 = 254
    Portb = Wysw10
    Reset Portd.6
    Reset Portd.5
    Waitms 250
 
    Wysw10 = 251
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 239
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 191
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 127
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 253
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 247
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 32
    Portb = Wysw10
    Waitms 1000
 
Return
End Sub
 
'**********************tabela*************************
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1    2     3     4     5    6     7    8     9


Podziękowania dla matrix-a za szybką pomoc.

Portret użytkownika matrix

Re: Timer na ATTINY2313

Nie ma kłopotu. Zawsze pomogę jeśli potrafię. Tylko teraz jeszcze się przyznaj co to jest?

Portret użytkownika marekszy

Timer na ATTINY2313

Tak jak wcześniej pisałem, zwykły prosty TIMER odliczający do 99sek lub 99min ,no może trochę bardziej rozbudowany i zbajerzony z możliwością wszechstronnego zastosowania do sterowania co tylko będziesz chciał (od oświetlenia klatki schodowej po sterowanie silnikami,pompami,podgrzewaczami itd),na 100% nie do sprzedaży,przecież nie wrzuciłbym schematu i wsadu, po prostu potrzeba chwili z prostą możliwością konfiguracji z przycisków.
Jeszcze raz dzięki, do następnego problemu.

Portret użytkownika gosc

Problem

Witam, mam problem spodobał mi sie twój projekt. ale próbowałem trochę go przerobić i nic mi nie wychodzi męczę się już tydzień z tym. chce zrobić tak, mam 2 wyświetlacze 7 segmentowe z wspólną anodą na nich miało być wyświetlane sekundy ustawiane swichami(dwoma up i down dodanie sekundy i odejmowanie) potrzebuje tylko sekundy, ale to nie ma być minutnik lub sekundnik tylko aby taki czas jaki ustawie na wyświetlaczu np 25s ma po 25s uruchomić przekaźnik i tak w kółko oczywiście gdy kliknę start/stop to będzie start/stop tego tak zwanego interwałometru napisał byś mi kod albo pomógł napisać ?

Portret użytkownika EDC

Odp. Problem

Masz to już poskładane według tego schematu?

-

BARTek
Moja strona

Portret użytkownika gosc

Na razie nie

Nie ale mam trochę inaczej, tak się "uczyłem" piny:tranzystory: w1 = PD0, w2 = PD1,ekrany: PB7 - A . . . PB1 - G te litery to segmenty wyświetlacza. zrobiłem tak ponieważ znałem kody do sterowania cyframi, oczywiście mogę złożyć tak jak jest schemat ale jeśli chciałeś wiedzieć to proszę.

Portret użytkownika gosc

Tak

złożone, ale nie potrafię przerobić tego tak jak ja chce pomoże ktoś ?

Portret użytkownika EDC

Odp. Timer na ATTINY2313

Ma działać od 1 do 99 sec. Przyciski góra, dół i start/stop. Po starcie ma na przemian włączać i wyłaczać coć z zadanym czasem tam i z powrotem? Napisz jeszcze czy ma odliczac na wyswietlaczu czy wartośc ma tam byc stała a na przykład kropka ma pokazywać że coś działa? Napisz jak najdokładniej to Ci to postaram się napisać z opisem :P

-

BARTek
Moja strona

Portret użytkownika gosc

Timer na ATTINY2313

Dzięki ze mi pomożesz. nigdzie nie ma dobrych poradników na temat multipleksowania i dlatego zdesperowany szukam jakiegoś wzoru, kodu. czyli tak moze na początek powiem co to jest, a wiec tak chciałem zrobić tak zwany interwałometr do aparatu Canon 1100D czyli ustawiam czas i robi zdjęcia przez np 3 godz w odstępach 20 s, potem montuje z tych zdjęć film i powstaje Timelapse bardzo ciekawa technika fotografii. a teraz wyjaśnię działanie jakie sobie wyobrażałem:2 wyświetlacze 7 segmentowe z wspólną anodą maksymalny czas to 99 s (wystarczająco) pod jakie chcesz piny 3 przyciski up down start/stop i klawiszami up down ustawiam sekundy np:15 klikam start i zaczyna sie odliczać gdy dojdzie do zera włącza się przekaźnik na około 1 s (nawet mniej moze być) i po sekundzie się wyłącza, dalej kod znowu odlicza 15 s i tak w kółko oczywiście gdy kliknę stop przestaje i tyle

Portret użytkownika EDC

Odp.Timer na ATTINY

To powinno działać. Specjalnie taki prosty,żeby było widać o co chodzi.
Timer0 ustawiony jest w tryb CTC także nie trzeba go ładować w obsłudze przerwania. Na razie jest napisany pod schemat Marka. Nie budowałem tego ale powinno działać ;)
Przyciskami można zmieniać wartość Interwału. Na razie jest wpisany testowo na sztywno (na początku) na 15sec. Po teście można pokusić się o zapisywanie do eeprom. Sprawa jest prosta. Dopóki wartość Odlicz jest większa od zera to co sekundę odejmowane jest jeden. Kiedy Odlicz osiąga zero włączany jest przekaźnik który będzie wyłączony za sekundę bo wartość Odlicz znów będzie większa od zera.
Przycisk Start przełącza tryb pracy albo ustawiania. Wprowadzenie stałych Odliczaj i Ustaw jest by kod był przejrzystszy i łatwiejszy do czytania.
Multipleksowanie jest proste. Po prostu co 5ms podawany jest plus na inny wyświetlacz.

$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01111000 : Portd = &B01101111
 
'*** Timer0 Config for 5ms Interrupt CTC Mode ***
Config Timer0 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare0a : On Compare0a Int_5ms : Compare0a = 194   '5ms @10MHz  (155 dla 8MHz)
 
Config Portd.0 = Input : Portd.0 = 1 : Plus Alias Pind.0    'przyciski
Config Portd.1 = Input : Portd.1 = 1 : Minu Alias Pind.1
Config Portd.2 = Input : Portd.2 = 1 : Start_ Alias Pind.2
Config Portd.4 = Output : Portd.4 = 1 : Przekaznik Alias Portd.4       'wlaczany stanem niskim
 
Dim Flaga_5ms As Bit , Flaga_1s As Byte , Dzielnik_1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Mux As Byte
Dim Interwal As Byte , Odlicz As Byte , Stan As Byte
 
Const Ustaw = 0
Const Odliczaj = 1
 
Interwal = 15                                               'na razie wpisane na stale, moze byc z pamieci
Enable Interrupts
'*** START ***
Do
 
If Flaga_5ms = 1 Then
    Flaga_5ms = 0
    Incr Dzielnik_1s
     'co 1 sekunde
     If Dzielnik_1s = 200 Then                              '5x200ms=1000ms
         Dzielnik_1s = 0
      If Stan = Odliczaj Then                               'jesli tryb pracy
       If Odlicz > 0 Then                                   'odejmuj od licznika
         Decr Odlicz
         Set Przekaznik                                     'i wylaczaj przekaznik
       Else
         Odlicz = Interwal                                  'jesli dojdzi edo zera
          Reset Przekaznik                                  'zaladuj licznik
       End If                                               'i wlacz przekaznik (za sekunde sam sie wylaczy)
      End If
     End If
End If
 
Debounce Plus , 0 , Plus_ , Sub
Debounce Minu , 0 , Minus , Sub
Debounce Start_ , 0 , Startuj , Sub
 
Loop
End
'*** END ***
 
 
'przerwanie
Int_5ms:
 Flaga_5ms = 1
 
  Select Case Stan
   Case Ustaw : Wysw = Interwal
   Case Odliczaj : Wysw = Odlicz
  End Select
 
Incr Mux
 If Mux = 2 Then Mux = 0
  Select Case Mux
   Case 0:
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
   Case 1:
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
  End Select
 
Return
 
Startuj:
 If Stan = Ustaw Then
  Stan = Odliczaj
  Odlicz = Interwal
 Else
  Stan = Ustaw
  Set Przekaznik
 End If
 
Return
 
Plus_:
 If Interwal < 99 Then Incr Interwal
Return
 
Minus:
 If Interwal > 1 Then Decr Interwal
Return
 
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1    2     3     4     5    6     7    8     9

Jak byś miał inaczej piny i kłopotliwe by było ich przepięcie to pozmieniamy w kodzie. Ten ma pokazać idee działania. Możesz też skorzystać z wewnętrznego oscylatora 8MHz zmieniając wartość dla Timera0.

-

BARTek
Moja strona

Portret użytkownika gosc

Odp.Timer na ATTINY

Działa jest dobrze, dzięki wielkie, teraz jak mam bazę muszę przeanalizować kod i spróbuje zrozumieć co i jak a mam jeszcze jedno pytanie jak zrobić taką funkcje inteligentnego przycisku i go dodać do tego kodu chodzi mi o to by gdy klikasz dodaje liczbę a gdy trzymasz przycisk to dodaje liczby ale szybko

Portret użytkownika gosc

Odp.Timer na ATTINY

i jest jeszcze jedna sprawa przekaźnik u mnie jest ciągle włączony jak zrobić aby się włączał stanem wysokim

Portret użytkownika EDC

Odp. Timer na ATTINY2313

Set Przekaźnik albo Przekaźniki = 1 oznacza stan wysoki. Reset Przekaźnik albo Przekaźnik = 0 oznacza stan niski.
Szukasz w kodzie za pomocą Ctrl + F3 hasła "Przekaznik" i zamieniasz Set na Reset a Reset na Set. Naciskając F3 znajdziesz następne. Opisałem taki sposób bo się przydaje w większych kodach i niczego nie przegapisz.
W tym trzeba też na samym początku zamienić Portd.4 = 1 na Portd.4 = 0
Ten inteligentny przycisk to łatwe, ale może chcesz sam coś pomyśleć ;) Jak nie to to też machnę :)
Dlatego na początku lepiej wypytać o wszystkie opcje bo dopisywanie bywa bardzej kłopotliwe niż napisanie od początku. Ten kodzik jest krótki wiec nie ma sprawy.

-

BARTek
Moja strona

Portret użytkownika gosc

Odp.Timer na ATTINY

nie mam pomysłu jak to zrobić :D jak możesz to ok xD

Portret użytkownika marekszy

Odp.Timer na ATTINY

Zobacz bo wrzuciłem schemat i kod do czasowego wył.cyklicznego
jest w Strona główna ? Projekty inne

Portret użytkownika gosc

Jakiego wyświetlacza użyłeś?

Jakiego wyświetlacza użyłeś? Masz może biblioteki tego wyświetlacza?

Portret użytkownika marekszy

wyświetlacz

Zwykły wyświetlacz LED 2x7 segmentów ze wspólną anodą.Jakie biblioteki? Po co ?

Portret użytkownika gosc

W eagle nie ma takiego

W eagle nie ma takiego wyświetlacza,jakim programem wgrywałeś wsad?

Portret użytkownika gosc

Program

Jakim programem wgrałeś ten wsad? W eagle nie ma takiego wyświetlacza ale już sobie z tym poradziłem.

Portret użytkownika gosc

Program

Jakim programem wgrałeś ten wsad?

Portret użytkownika marekszy

Odp.Timer na ATTINY

Programem mkAVR Calculator , tylko musisz skompilować wcześniej program w Bascom-ie i wgrywasz plik hex.
Pamiętaj aby dobrze ustawić fusbity, CKDIV8 ma być wyłączony.

Portret użytkownika gosc

A jak skompilować w Bascom-ie

A jak skompilować w Bascom-ie nie ma nigdzie pliku hex chyba że przez błąd po kompilacji (Error : 375 Line : 38 Duplicate definition [LED_MENU] , in File : C:\Users\Piotrek\Desktop\timer 1.bas)

Portret użytkownika marekszy

Odp.Timer na ATTINY

Nie wiem co za błąd masz, ale wtedy na pewno nie utworzy pliku hex, napisz który kod ciebie interesuje ,jak wrócę w nocy do domu to sprwdzę.
Daj adres e-mail to podeślę tobie gotowy wsad.
tutaj poprawiony kod ale nie sprawdzałem

 '*******************1*timer V3 attiny 2313******************
 '*******************marekszy********************************
 '*******************konfiguracja uC*************************
 
$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01111000 : Portd = &B01101111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Enable Interrupts
 
Przekaznik1 Alias Portd.4                                   'start PK1  out
Ledmenu Alias Portd.3                                      'miganie
 
Declare Sub Loading                                         'animacja ladowana do LCD w trakcie startu
Loading
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit , Flaga_1s As Byte
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany As Word
Dim Poz_menu As Byte
Dim Dzielnik_1s As Byte , Dzielnik_1 As Byte , Dzielnik_x As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Byte
Dim Czas_odliczony As Byte
Dim Stan_pracy As Byte
Dim Odliczanie As Byte
Dim Migaj As Byte
Dim Mig As Bit , Led_menu As Bit
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 
Readeeprom Czas_zadany , 2
  If Czas_zadany > 99 Then                                  'gdy czas wiekszy od 99s wczytaj 15s
    Czas_zadany = 15
  End If
Readeeprom Dzielnik_x , 4
  If Dzielnik_x > 60 Or Dzielnik_x < 60 Then                'gdy dzielnik_x <> 60 ustawia 1
     Dzielnik_x = 1
  End If
 
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
          Migaj = 0
        Case 1:
          Wysw = Czas_zadany
          Migaj = 1
        Case 2:
           Wysw = Dzielnik_x
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
      Gosub Miganie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
Timer0 = 100
 Flaga_4ms = 1
  Incr Dzielnik_1s
   If Dzielnik_1s = 250 Then
      Dzielnik_1s = 0
     Toggle Mig
      If Odliczanie = 1 Then
         Led_menu = Mig
      End If
   End If
 Return
 
'*****************przerwanie timer0 koniec*****************
'*****************przerwanie timer1************************
Prztimer1:
Timer1 = 26474
 Flaga_1s = 1
  Incr Dzielnik_1
   If Dzielnik_1 = Dzielnik_x Then                          '1s dzielnik_x=1
      Dzielnik_1 = 0                                        '1min dzielnik_x=60
     If Czas_odliczony > 0 Then
       Decr Czas_odliczony
       If Czas_odliczony = 0 Then
          Stan_pracy = 0
       End If
     End If
   End If
  Return
 
'*****************sterowanie poczatek**********************
Sterowanie:
  Select Case Stan_pracy
    Case 0:                                                 'co ma byc zal/wyl stan_pracy=0 (STOP)
      Reset Przekaznik1
    Case 1:                                                 'co ma byc zal/wyl stan_pracy1 (START)
      Set Przekaznik1
  End Select
Return
 
'*****************sterowanie koniec************************
'*******************miganie********************************
Miganie:
  Select Case Migaj
    Case 0:
      Reset Ledmenu
    Case 1:
      If Mig = 1 Then
       Set Ledmenu
        Else
       Reset Ledmenu
      End If
  End Select
Return
 
'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 2 Then Mux = 0
  Select Case Mux
   Case 0:
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
   Case 1:
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
  End Select
 
Return
 
'*****************wyswietlanie koniec**********************
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pind And &B00000111                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00000011:                                    'START/STOP Pd.2 (SW4)
         If Poz_menu = 0 Then
           If Stan_pracy = 0 Then
             Stan_pracy = 1
             Czas_odliczony = Czas_zadany
             Dzielnik_1 = 0
           Else
             'Stan_pracy = 1                                 'ponowne nacisniecie sw odlicza od nowa
             'Czas_odliczony = Czas_zadany
             'Dzielnik_1 = 0
             Stan_pracy = 0                                 'ponowne nacisniecie sw wylacza
             Czas_odliczony = 0
           End If
         End If
 
 
        Case &B00000100:                                    'poz menu(3 pozycje 0/1/2) Pd.0 i Pd.1 (SW3)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/2)
             Poz_menu = 0
 
               Writeeeprom Czas_zadany , 2                  'zapis do pamieci eeprom
               Writeeeprom Dzielnik_x , 4
           End If
        Case &B00000101                                     'sek + Pd.1 (SW1)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s
                Else
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then
                If Dzielnik_x = 60 Then                     'ustawienie dzielnika na 1min/1s
                   Dzielnik_x = 1
                 Else
                   Dzielnik_x = 60
                End If
               End If
          End Select
 
        Case &B00000110                                     'sek - Pd.0 (SW2)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany > 0 Then Decr Czas_zadany     'gdy = 1 ograniczenie do 1s,
                Else                                        'gdy 0 praca start/stop bez odliczania czsu
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then                       'ustawienie dzielnika na 1s/1min
                If Dzielnik_x = 1 Then
                   Dzielnik_x = 60
                 Else
                   Dzielnik_x = 1
                End If
               End If
          End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'***************animacje dla LCD****************************************
Sub Loading :                                               'program animacji startowej
Waitms 500
 
    Set Portd.6
    Set Portd.5
    Wysw10 = 254
    Portb = Wysw10
    Reset Portd.6
    Reset Portd.5
    Waitms 250
 
    Wysw10 = 251
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 239
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 191
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 127
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 253
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 247
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 32
    Portb = Wysw10
    Waitms 1000
 
Return
End Sub
 
'**********************tabela*************************
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1    2     3     4     5    6     7    8     9

Portret użytkownika gosc

Dziękuje kod nie wyświetla

Dziękuje kod nie wyświetla błędu wgrałem do procesora.Jak byś mógł to przyślij plik hex na adres zachowuje się timer przy naciśnięciu i trzymaniu przycisku start/stop? Chodzi mi o to aby przy zwarciu przycisku odliczył czas i wyłączył przekaźnik do następnego zwarcia przycisku.

Portret użytkownika marekszy

Odp.Timer na ATTINY

No w takim przypadku trzeba będzie troszeczkę przerobić w kodzie, teraz działa tak ,że naciśnięcie start startuje odliczanie ,a kolejne zeruje odliczanie. Działa to tobie tak na marginesie.
Jak znajdę chwilę to przerobię i podeślę tobie do testu.

Portret użytkownika gosc

Wielkie dzięki

Wielkie dzięki

Portret użytkownika gosc

Timer

Witam
Mógłbym prosić o przerobienie ostatniego kodu żeby po włączeniu zasilania przekaźnik był rozwarty po naciśnięciu start nadal pozostał rozwarty do momentu zakończenia odliczania.

Portret użytkownika marekszy

timer

Na spokojnie damy radę, jak ma działać przycisk start?
naciskamy na chwilę i tom dr startuje ,po doliczonym czasie załącza Pk?
Jak ma działać Pk, zalaczy po upływie czasu i co dalej, ma tak sobie trzymać?

Portret użytkownika gosc

Przekaźnik normalnie ma być

Przekaźnik normalnie ma być wyłączony po naciśnięciu START i trzymaniu ma załączyć przekaźnik dopiero po zakończeniu odliczania.

Portret użytkownika marekszy

re:timer

Proszę bardzo

'*************1*timer V4 attiny 2313****zajete 87%**********
 '**************************marekszy*************************
 
 'po wlaczeniu wyswietla czas zadany ,PK1 wylaczony
 'przy wcisnieciu i trzymaniu "START" PK1wylaczony i zaczyna odliczac czas
 'gdy czas = 00 wlacza PK1(PK1 zalaczony do czasu puszczenia przycisku "START)
 'po puszczeniu przycisku wyswietla czas zadany a PK1 jest wylaczony
 'puszczenie przycisku "START" w trakcie odliczania powoduje ,ze czas powraca do zadanego
 'przycisk "MENU - 3 pozycje
 'pozycja 1 - ustawianie sekund lub minut do 99 , LED miga
 'pozycja 2 - ustawianie dzielnika (01 = sek. lub 60 = min.), LED miga
 'pozycja 3 - powrot do pracy , LED nie swieci
 
 '*******************konfiguracja uC*************************
$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01111000 : Portd = &B01100111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Config Watchdog = 1024
 
Enable Interrupts
 
Pk1 Alias Portd.4                                           'PK1  out
Led Alias Portd.3                                           'miganie
 
Declare Sub Loading                                         'animacja ladowana do LCD w trakcie startu
Loading
'*****************konfiguracja koniec************************
'*****************zmienne poczatek***************************
 
Dim Flaga_4ms As Bit , Flaga_1s As Byte
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Czas_zadany As Word
Dim Poz_menu As Byte
Dim Dzielnik_1s As Byte , Dzielnik_1 As Byte , Dzielnik_x As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte
Dim Mux As Byte
Dim Czas_odliczony As Byte
Dim Stan_pracy As Byte
Dim Odliczanie As Byte
Dim Migaj As Byte , Blokada As Bit
Dim Mig As Bit , Led_menu As Bit , Pozycja_menu As Bit
 
'*****************zmienne koniec*****************************
'*****************warunki poczatek***************************
 
Readeeprom Czas_zadany , 2
  If Czas_zadany > 99 Then                                  'gdy czas wiekszy od 99s wczytaj 15s
    Czas_zadany = 15
  End If
Readeeprom Dzielnik_x , 4
  If Dzielnik_x > 60 Or Dzielnik_x < 60 Then                'gdy dzielnik_x <> 60 ustawia 1
     Dzielnik_x = 1
  End If
 
Start Watchdog
'****************warunki koniec******************************
'****************petla glowna********************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
   Reset Watchdog
    If Pind.2 = 0 Then
      If Poz_menu = 0 Then
       If Blokada = 0 Then
         If Stan_pracy = 0 Then
            Dzielnik_1 = 0
         End If
       End If
      End If
    End If
 
     If Czas_odliczony > 0 Then
        Blokada = 1
        stan_pracy =1
     end if
     If Czas_odliczony = 0 Then Stan_pracy = 2
 
     If Pind.2 = 1 Then
       Stan_pracy = 0
       Czas_odliczony = 0
       Blokada = 0
       Czas_odliczony = Czas_zadany
     End If
 
      Select Case Poz_menu
        Case 0:
          Wysw = Czas_odliczony
          Migaj = 0
        Case 1:
          Wysw = Czas_zadany
          Migaj = 1
        Case 2:
           Wysw = Dzielnik_x
      End Select
      Gosub Wyswietlanie
      Gosub Przyciski
      Gosub Sterowanie
      Gosub Miganie
  End If
 Loop
End
'*****************petla glowna koniec**********************
'*****************przerwanie timer0************************
Prztimer0:
Timer0 = 100
 Flaga_4ms = 1
  Incr Dzielnik_1s
   If Dzielnik_1s = 250 Then
      Dzielnik_1s = 0
     Toggle Mig
      If Odliczanie = 1 Then
         Led_menu = Mig
      End If
   End If
 Return
 
'*****************przerwanie timer0 koniec*****************
'*****************przerwanie timer1************************
Prztimer1:
Timer1 = 26474
 Flaga_1s = 1
  Incr Dzielnik_1
   If Dzielnik_1 = Dzielnik_x Then                          '1s dzielnik_x=1
      Dzielnik_1 = 0                                        '1min dzielnik_x=60
     If Czas_odliczony > 0 Then
       Decr Czas_odliczony
       If Czas_odliczony = 0 Then
          Stan_pracy = 0
       End If
     End If
   End If
  Return
 
'*****************sterowanie poczatek**********************
Sterowanie:
  Select Case Stan_pracy
    Case 0:                                                 'co ma byc zal/wyl stan_pracy=0 (STOP)
      reset Pk1
    Case 1:                                                 'co ma byc zal/wyl stan_pracy1 (START)
      reset pk1
    Case 2:
       set Pk1                                            'co ma być po zakonczeniu odliczania (czas 00)
  End Select
Return
 
'*****************sterowanie koniec************************
'*******************miganie********************************
Miganie:
  Select Case Migaj
    Case 0:
      Reset Led
    Case 1:
      If Mig = 1 Then
       Set Led
        Else
       Reset Led
      End If
  End Select
Return
 
'*****************wyswietlanie*****************************
Wyswietlanie:
Incr Mux
  If Mux = 2 Then Mux = 0
  Select Case Mux
   Case 0:
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
   Case 1:
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
 
  End Select
 
Return
 
'*****************wyswietlanie koniec**********************
 
'*****************przyciski poczatek***********************
Przyciski:
Sw = Pind And &B00000011                                    'maskowanie nieużywanych pinów
 
If Sw <> &B00000011 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B00000000:                                    'poz menu(3 pozycje 0/1/2) Pd.0 i Pd.1 (SW3)
           Incr Poz_menu
           If Poz_menu = 3 Then                             'ilosc poz_menu 0/1/2)
             Poz_menu = 0
 
               Writeeeprom Czas_zadany , 2                  'zapis do pamieci eeprom
               Writeeeprom Dzielnik_x , 4
           End If
        Case &B00000001                                     'sek + Pd.1 (SW1)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany < 99 Then Incr Czas_zadany    'ograniczenie do 99s
                Else
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then
                If Dzielnik_x = 60 Then                     'ustawienie dzielnika na 1min/1s
                   Dzielnik_x = 1
                 Else
                   Dzielnik_x = 60
                End If
               End If
          End Select
 
        Case &B00000010                                     'sek - Pd.0 (SW2)
          Select Case Poz_menu
            Case 1:
              If Odliczanie = 0 Then
               If Czas_zadany > 0 Then Decr Czas_zadany     'gdy = 1 ograniczenie do 1s,
                Else                                        'gdy 0 praca start/stop bez odliczania czsu
                 Odliczanie = 0
              End If
            Case 2:
               If Odliczanie = 0 Then                       'ustawienie dzielnika na 1s/1min
                If Dzielnik_x = 1 Then
                   Dzielnik_x = 60
                 Else
                   Dzielnik_x = 1
                End If
               End If
          End Select
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return
 
'***************animacje dla LCD****************************************
Sub Loading :                                               'program animacji startowej
Waitms 500
 
    Set Portd.6
    Set Portd.5
    Wysw10 = 254
    Portb = Wysw10
    Reset Portd.6
    Reset Portd.5
    Waitms 250
 
    Wysw10 = 251
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 239
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 191
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 127
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 253
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 247
    Portb = Wysw10
    Waitms 250
 
    Wysw10 = 32
    Portb = Wysw10
    Waitms 1000
 
Return
End Sub
 
'**********************tabela*************************
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1    2     3     4     5    6     7    8     9

niżej plik hex

/files/user_img/u758/timer%20x1%20attiny2313%2002.2016r%20V4.zip

Portret użytkownika gosc

Dziękuje działa super.

Dziękuje działa super.