stoper na Attiny2313

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Anax
Użytkownik
Posty: 274
Rejestracja: 08 sie 2006, 15:32
Lokalizacja: JO82KL
Kontakt:

stoper na Attiny2313

Post autor: Anax » 30 lis 2006, 13:22

zamierzam zrobić stoper wykorzystujący program opisany w 'Mikrokontrolerach dla początkujących'. Jako że nie mam zbyt dużego doświadczenia, napotkałem pewien problem:
Jak zmodyfikować program, żeby S1 włączał stoper, ponowne naciśnięcie S1 zatrzymywało go, a S2 kasował wynik :?: :roll:

Z góry dziękuję :D

Kod: Zaznacz cały

'C012a      Bardzo prosty stoper 0,1-sekundowy
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
On Timer0 Co4ms

Do : Loop : End                                             'to jest główny program - pusta nieskończona pętla

Co4ms:                                                      'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
Timer0 = 6                                                  'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
If Pind.0 = 0 Then Licz = 1                                 'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
If Pind.1 = 0 Then Licz = 0                                 'sprawdź stan S2 i ewentualnie zakończ zliczanie czasu
If Licz = 1 Then                                            'tylko wtedy, gdy stoper ma liczyć czas
   Incr 100ms                                               'co 4ms zwiększ wartość licznika o nazwie 100ms
   If 100ms = 25 Then                                       'skróc cykl licznika 100ms właśnie do 100ms
      100ms = 0                                             'czyli 0,1 sekundy
      Incr Dziesek                                          'co 0,1s zwiększ stan licznika dziesiatych części sekundy
      If Dziesek = 10 Then                                  'ten licznik liczy do dziesieciu
         Dziesek = 0                                        'czyli cykl trwa 1 sekundę
         Incr Sekjed                                        'co 1 sekundę  zwiększ licznik jednostek sekund
         If Sekjed = 10 Then
            Sekjed = 0                                      'co 10 sekund
            Incr Sekdzies                                   'zwiększ stan licznika dziesiatek sekund
               If Sekdzies = 6 Then                         'liczy do 6 bo minuta ma 60 sekund
                  Sekdzies = 0
                  Incr Minjed                               'co 60 sekund zwiększ stan licznika minut
                     If Minjed = 10 Then Minjed = 0         '0...9 minut
               End If                                       'więc maksymalny stan licznika to:
         End If                                             '9 minut, 59 sekund i 9 dziesiatych sekundy
      End If
   End If
End If
Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0        'skróć cykl: 0...3
Portd = &B1111111                                           ' wygaś wyświetlacze
Select Case Ktorywysw                                       ' obsługa wyświetlacza
Case 0:                                                     'wyświetl zawartość licznika jednostek
   Portb = Lookup(dziesek , Tabela)                         'najpierw przepisz do PortB kody
   Portd.3 = 0                                              'potem włącz T3 - wyświetlacz jednostek
Case 1:                                                     'wyświetl zawartość licznika dziesiątek
   Portb = Lookup(sekjed , Tabela)                          'najpierw przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.4 = 0                                              'potem włącz T4 - wyświetlacz dziesiątek
Case 2:                                                     'wyświetl zawartość licznika setek
   Portb = Lookup(sekdzies , Tabela)                        'przepisz do PortB kody
   Portd.5 = 0                                              'włącz T5 - wyświetlacz setek
Case 3:                                                     'wyświetl zawartość licznika tysięcy
   Portb = Lookup(minjed , Tabela)                          'przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.6 = 0                                              'włącz T6 - wyświetlacz tysięcy
End Select
Return                                                      'koniec procedury obsługi przerwania

Tabela:                                                     'potrzebna do wyświetlenia cyfr 0...9
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 30 lis 2006, 17:32

Nie sprawdzałem, ale powinno działac. polecenie toggle zmienia stan zmiennej "licz" na przeciwny, a zmienna "pnd0n" uniemożliwia wielokrotne przełączanie stanu podczas przytrzymanego s1. s2 zeruje wszystkie zmienne zliczające czas.

Kod: Zaznacz cały

'C012a      Bardzo prosty stoper 0,1-sekundowy
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit , Pnd0n As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
On Timer0 Co4ms

Do : Loop : End                                             'to jest główny program - pusta nieskończona pętla

Co4ms:                                                      'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
Timer0 = 6                                                  'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
If Pind.0 = 0 And Pnd0n = 0 Then                            'sprawdź stan S1 i jeśli można to rozpocznij/zakończ zliczanie czasu
Toggle Licz                                                 'zmiana stanu "licz" na przeciwny
Pnd0n = 1                                                   'zablokuj możliwośc ponownej zmiany "licz" aż do momentu zwolnienia s1
End If

If Pind.0 = 1 Then Pnd0n = 0                                'jeśli s1 nienaciśnięty to zezwól na zmiane "licz"
If Pind.1 = 0 Then                                          'sprawdź stan S2 i wyzeruj stoper
 Dziesek = 0                                                'zerowanie poszczególnych cyfr
 Sekjed = 0
 Sekdzies = 0
 Minjed = 0
End If
If Licz = 1 Then                                            'tylko wtedy, gdy stoper ma liczyć czas
   Incr 100ms                                               'co 4ms zwiększ wartość licznika o nazwie 100ms
   If 100ms = 25 Then                                       'skróc cykl licznika 100ms właśnie do 100ms
      100ms = 0                                             'czyli 0,1 sekundy
      Incr Dziesek                                          'co 0,1s zwiększ stan licznika dziesiatych części sekundy
      If Dziesek = 10 Then                                  'ten licznik liczy do dziesieciu
         Dziesek = 0                                        'czyli cykl trwa 1 sekundę
         Incr Sekjed                                        'co 1 sekundę  zwiększ licznik jednostek sekund
         If Sekjed = 10 Then
            Sekjed = 0                                      'co 10 sekund
            Incr Sekdzies                                   'zwiększ stan licznika dziesiatek sekund
               If Sekdzies = 6 Then                         'liczy do 6 bo minuta ma 60 sekund
                  Sekdzies = 0
                  Incr Minjed                               'co 60 sekund zwiększ stan licznika minut
                     If Minjed = 10 Then Minjed = 0         '0...9 minut
               End If                                       'więc maksymalny stan licznika to:
         End If                                             '9 minut, 59 sekund i 9 dziesiatych sekundy
      End If
   End If
End If
Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0        'skróć cykl: 0...3
Portd = &B1111111                                           ' wygaś wyświetlacze
Select Case Ktorywysw                                       ' obsługa wyświetlacza
Case 0:                                                     'wyświetl zawartość licznika jednostek
   Portb = Lookup(dziesek , Tabela)                         'najpierw przepisz do PortB kody
   Portd.3 = 0                                              'potem włącz T3 - wyświetlacz jednostek
Case 1:                                                     'wyświetl zawartość licznika dziesiątek
   Portb = Lookup(sekjed , Tabela)                          'najpierw przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.4 = 0                                              'potem włącz T4 - wyświetlacz dziesiątek
Case 2:                                                     'wyświetl zawartość licznika setek
   Portb = Lookup(sekdzies , Tabela)                        'przepisz do PortB kody
   Portd.5 = 0                                              'włącz T5 - wyświetlacz setek
Case 3:                                                     'wyświetl zawartość licznika tysięcy
   Portb = Lookup(minjed , Tabela)                          'przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.6 = 0                                              'włącz T6 - wyświetlacz tysięcy
End Select
Return                                                      'koniec procedury obsługi przerwania

Tabela:                                                     'potrzebna do wyświetlenia cyfr 0...9
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

Awatar użytkownika
Anax
Użytkownik
Posty: 274
Rejestracja: 08 sie 2006, 15:32
Lokalizacja: JO82KL
Kontakt:

Post autor: Anax » 08 gru 2006, 22:21

Sprawa się trochę skomplikowała. To powinno wyglądać tak:

1) włączanie zasilania, S1 i S2 rozwarte,
2) wciśnięcie S1=brak reakcji programu,
3) puszczenie S1=start stopera,
4) wciśnięcie S1=stop stopera,
5) wciśnięcie S2=kasuj licznik,

Możliwe? Dla mnie - nie :mrgreen: (jeszcze). Ufam, że dla was to małe (już po 22 więc pozwolę sobie użyć) piwo :D.

Z góry dziękuję :mrgreen:

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 10 gru 2006, 10:44

To znaczy stoper ma stac tylko wtedy gdy naciśnięty jest s1? Albo na przemian po każdym naciśnięciu ma startowac/stawac tylko z tą różnicą że start rozpoczyna się po puszczeniu s1?

Awatar użytkownika
Anax
Użytkownik
Posty: 274
Rejestracja: 08 sie 2006, 15:32
Lokalizacja: JO82KL
Kontakt:

Post autor: Anax » 10 gru 2006, 11:45

Aro pisze:Albo na przemian po każdym naciśnięciu ma startowac/stawac tylko z tą różnicą że start rozpoczyna się po puszczeniu s1?
tak. ale trzeba uwzględnić, że przy włączeniu zasilania S1 jest rozwarty, a stoper ma jeszcze stać. :roll:

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 10 gru 2006, 14:30

Nic trudnego. Działa, sprawdzałem w symulatorze

Kod: Zaznacz cały

'C012a      Bardzo prosty stoper 0,1-sekundowy
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit , Pnd As Bit , Strt As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
On Timer0 Co4ms
Strt = 0

Do : Loop : End                                             'to jest główny program - pusta nieskończona pętla

Co4ms:                                                      'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
Timer0 = 6                                                  'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
   If Pind.0 = 0 And Pnd = 0 Then                           'za każdym naciśnięciem zmieniaj stan Strt
   Toggle Strt
   Pnd = 1                                                  'zablokuj możliwośc wielokrotnej zmiany Strt
   End If

   If Pind.0 = 1 Then Pnd = 0                               'jeśli s1 nienaciśnięty to pozwól na zmiane Strt przy powtórnym wciśnięciu

   If Strt = 1 And Pind.0 = 1 Then Licz = 1                 'jeśli strt=1 i puszczony s1 to zacznij zliczac

   If Strt = 0 Then Licz = 0                                'jeśli Strt=0 to zatrzymaj zliczanie

If Pind.1 = 0 Then                                          'sprawdź stan S2 i wyzeruj stoper
 Dziesek = 0                                                'zerowanie poszczególnych cyfr
 Sekjed = 0
 Sekdzies = 0
 Minjed = 0
 Strt = 0
 Licz = 0
End If
If Licz = 1 Then                                            'tylko wtedy, gdy stoper ma liczyć czas
   Incr 100ms                                               'co 4ms zwiększ wartość licznika o nazwie 100ms
   If 100ms = 25 Then                                       'skróc cykl licznika 100ms właśnie do 100ms
      100ms = 0                                             'czyli 0,1 sekundy
      Incr Dziesek                                          'co 0,1s zwiększ stan licznika dziesiatych części sekundy
      If Dziesek = 10 Then                                  'ten licznik liczy do dziesieciu
         Dziesek = 0                                        'czyli cykl trwa 1 sekundę
         Incr Sekjed                                        'co 1 sekundę  zwiększ licznik jednostek sekund
         If Sekjed = 10 Then
            Sekjed = 0                                      'co 10 sekund
            Incr Sekdzies                                   'zwiększ stan licznika dziesiatek sekund
               If Sekdzies = 6 Then                         'liczy do 6 bo minuta ma 60 sekund
                  Sekdzies = 0
                  Incr Minjed                               'co 60 sekund zwiększ stan licznika minut
                     If Minjed = 10 Then Minjed = 0         '0...9 minut
               End If                                       'więc maksymalny stan licznika to:
         End If                                             '9 minut, 59 sekund i 9 dziesiatych sekundy
      End If
   End If
End If
Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0        'skróć cykl: 0...3
Portd = &B1111111                                           ' wygaś wyświetlacze
Select Case Ktorywysw                                       ' obsługa wyświetlacza
Case 0:                                                     'wyświetl zawartość licznika jednostek
   Portb = Lookup(dziesek , Tabela)                         'najpierw przepisz do PortB kody
   Portd.3 = 0                                              'potem włącz T3 - wyświetlacz jednostek
Case 1:                                                     'wyświetl zawartość licznika dziesiątek
   Portb = Lookup(sekjed , Tabela)                          'najpierw przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.4 = 0                                              'potem włącz T4 - wyświetlacz dziesiątek
Case 2:                                                     'wyświetl zawartość licznika setek
   Portb = Lookup(sekdzies , Tabela)                        'przepisz do PortB kody
   Portd.5 = 0                                              'włącz T5 - wyświetlacz setek
Case 3:                                                     'wyświetl zawartość licznika tysięcy
   Portb = Lookup(minjed , Tabela)                          'przepisz do PortB kody
   Portb.7 = 0                                              'włącz punkt dziesiętny
   Portd.6 = 0                                              'włącz T6 - wyświetlacz tysięcy
End Select
Return                                                      'koniec procedury obsługi przerwania

Tabela:                                                     'potrzebna do wyświetlenia cyfr 0...9
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

Awatar użytkownika
Anax
Użytkownik
Posty: 274
Rejestracja: 08 sie 2006, 15:32
Lokalizacja: JO82KL
Kontakt:

Post autor: Anax » 11 gru 2006, 18:21

Ozłociłbym Cię, ale cierpię na chwilowy brak gotówki. Przyjmij więc moją wdzięczność. :mrgreen:

Krótko mówiąć - thx :mrgreen:

ODPOWIEDZ