Prośba o wskazówkę.


Witam.
Stworzyłem taki programik (docelowo będzie na atmega8).

$regfile = "m32def.dat"
$crystal = 16000000
 
 
Config Portc = Output
 
Config Portd = &B00000000
 
Portc = &B11111111
Portd = &B11111111
 
Dim A As Byte
Dim B As Byte
 
 
Do
 
 A = 0
 
  If Pind.0 = 0 Then
  Waitms 50
  A = A + 1
  End If
  If Pind.1 = 0 Then
  Waitms 50
  A = A + 2
  End If
  If Pind.2 = 0 Then
  Waitms 50
  A = A + 5
  End If
  If Pind.3 = 0 Then
  Waitms 50
  A = A + 2
  End If
 
   Do
   Loop Until Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1
 '
   If A <> 0 Then
      For A = A To 1 Step - 1
      Waitms 150
      Reset Portc.0
      Waitms 150
      Set Portc.0
      Next
   End If
 
 
Waitms 50
Loop
 
End

Program ma w zależności od wartości wrzuconej monety lub żetonu wygenerować na wyjściu odpowiednią liczbę impulsów.
Dioda zastępuje docelowy licznik mechaniczny impulsów. (nie pytajcie o co kaman z tym licznikiem bo dużo by było o tym pisać).
Ten powyżej swoje zadanie spełnia ale...
Czas od wrzucenia monety 5zł do końca wygenerowania ostatniego impulsu na wyjściu wynosi ponad 1,5sek. Może się tak zdarzyć że układ nie zaliczy kolejnej monety jeżeli zostanie za szybko wrzucona.
Jak to rozwiązać? Żeby niezależnie od generowanego impulsu wyjściowego cały czas kontrolować wejście i korygować ilość impulsów wyjściowych?
Dodam że jestem początkujący w kwestii programowania i trochę się zawiesiłem na tym.




Portret użytkownika RomaN

Jeśli chodzi o wskazówkę,

Jeśli chodzi o wskazówkę, proponuję usunąć z pętli generacje impulsów i zapomnieć o poleceniu "Waitms". Waitms w pętli powoduje duże opóźnienia w wykrywaniu następnych wrzucanych monet. Wrzucone monety zapisywałbym do jakiejś zmiennej i od wartość zmiennej było by generowanie impulsów.

Portret użytkownika mirley

RE: Timer

Należy tutaj uruchomić timer i zrobić sobie taktowanie na flagach (tak jak we wszystkich moich programach) 4ms do obsługi przycisków (wrzucenie monety możesz potraktować jak przycisk) i 150ms do generacji impulsów.

w głownej pętli będzie obsługa tych flag: Pod 4ms: zwiększanie zmiennej A o określone wartości, Pod 150ms sprawdzanie czy A >0 i jeśli tak to zmień wartość portu na przeciwny... np:

if A > 0 then
  If Portc.0 = 1 Then
    Reset Portc.0
  Else
    Set Portc.0
    Decr A
  End If
Else
  Set Portc.0
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.