Przerwanie operacji WAIT bascom


Witam.
Chciałbym się zapytać czy można przerwać operację odliczania czasu w języku Bascom.
Chcę wysterować bezprzewodowo(pod RC5) "sterownik" z możliwością ręcznego jak i automatycznego wyłączenia urządzenie po X czasu. Jednak problem pojawia się gdy chcę zresetować sygnał odliczania(WAIT) gdyż nie wiem gdzie i jak można go przerwać.
Takie ustawienie resetu portu jak w CASE 13 nic nie daje, gdyż program wykonuje liczenie. NA googlach czy forum po wpisaniu WAIT (ETC) pojawiają się głównie same programy, chyba że jakoś źle formuję pytania i nie mogę znaleźć odpowiedzi na to pytanie.
Opisy uważam za zbędne, gdyż jest to bardzo prosty program, ale od czegoś się zaczyna.
Jedyne co mi przychodzi na myśl to "twardy" reset Atmegi, ale wolałbym to jakoś zrobić z pilota.

Case 7:                                              
   Set Portd.7                                    
Case 9:                                              
   Reset Portd.7                                     
Case 11:                                              
   Set Portd.0
   Wait 60
   Reset Portd.0
Case 13 :
   Reset Portd.0
Case 15:                                             
   Set Portd.0
   Wait 600
   Reset Portd.0

Pozdrawiam Artur




Portret użytkownika EDC

Odp. Przerwanie operacji Wait

Lepiej byłoby uruchomić jakiś Timer ale jak chcesz to możesz przyjrzeć się takiemu rozwiązaniu.
W Case 15 możesz włączyć lub wylączyć od razu port. Po włączeniu opcję automatycznego wyłączenia po czasie przejmuje zmienna Odmierz. W krótszych odstępach czasu odejmuje co sekunde 1.

Dim Odmierz As Word
'------------------------ zadeklaruj na poczatku programu --
Select Case
.
.
 Case 15:
   If Portd.0 = 0 Then
    Set Portd.0
    Odmierz = 600
   Else
    Reset Portd.0
    Odmierz = 0
   End If
End Select
 
If Odmierz > 0 Then
   Decr Odmierz
   Wait 1
End If
 
If Odmierz = 0 Then  'taki zapis zamiast And daje krótszy kod wynikowy
   If Portd.0 = 1 Then Reset Port
End If

Może nie idealny ale co sekunde masz okienko ;) Do wartości Word możesz załadowac 65535, więc możesz do Odmierz załadować np. 60000 i w odmierzaniu ustawić Waitms 10 ;) co przyspieszy petle.

Tu masz przykład przerobionego projektu z tej strony. Dodałem Timer0 który przy 16MHz będzie tam tykał co 10ms więc potrzebny był dzielnik. Gdybyś nie używał do niczego Timer1 to możesz go odkomentować, ale pamietaj że tam już przerwanie jest co 1 sekunde i dzielnik w obsludze przerwania jest niepotrzebny.

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
 
'*** Timer1 Config for 1s Interrupt CTC Mode 16MHz Clock ***
'Config Timer1 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
'Enable Compare1a : On Compare1a Int_1s : Compare1a = 15624
 
'*** Timer0 Config for 10ms Interrupt CTC Mode 16MHz Clock ***
Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare0a : On Compare0a Int_10ms : Compare0a = 155
 
Config Rc5 = Pind.2
Dioda Alias Portd.6
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Komenda As Byte , Adres As Byte
Dim Dzielnik As Byte , Flaga_1s As Bit
Dim Odmierz_portb0 As Word
'*************  Zmienne Koniec  ****************
 
'**************  Petla glowna ******************
'***********************************************
Do
  Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
  If Adres = 0 Then
    Reset Dioda
 
    Select Case Komenda
      Case 1:
          If Portb.0 = 0 Then
            Set Portb.0
            Odmierz_portb0 = 600
          Else
            Reset Portb.0
            Odmierz_portb0 = 0
          End If
      Case 2:
          Toggle Portb.1
      Case 3:
          Toggle Portb.2
      Case 4:
          Toggle Portb.3
      Case 5:
          Toggle Portb.4
      Case 6:
          Toggle Portb.5
      Case 7:
          Toggle Portb.6
      Case 8:
          Toggle Portb.7
    End Select
 
    Waitms 100
    Set Dioda
    Waitms 100
  End If
 
  If Flaga_1s = 1 Then
     Flaga_1s = 0
      If Odmierz_portb0 > 0 Then Decr Odmierz_portb0
      If Odmierz_portb0 = 0 Then Reset Portb.0
  End If
 
Loop
End
'************ Petla glowna Koniec **************
 
Int_10ms:
Incr Dzielnik
 If Dzielnik = 100 Then
    Dzielnik = 0
    Set Flaga_1s
 End If
Return
 
'Int_1s:
'    Set Flaga_1s
'Return

Ważna uwaga Tu na stronie jest automatyczne zawijanie tekstu tak by pasował do rozdzielczości w której oglądasz. Konfiguracja Timerów w Bascom musi być w jednej linii do wyrażenia "Clear Timer = 1" włącznie.

-

BARTek
Moja strona