Koszmar stróża :D


Witam. Nazwałem to urządzenie przewrotnie ponieważ służy do tego by rozliczać nocnego stróża z obchodów. W różnych miejscach fabryki na których zależy nam by stróż je odwiedzał co godzine rozłożone sa takie urządzenia. Stróż robiąc obchód co godzine powinien nacisnąć przycisk docierając do tego miejsca. Ma na to furtkę czasową plus minus 10min w każda stronę co godzinę. Osiem diod symbolizuje każda godzinę. Jeśli stróż nie naciśnie guzika w określonym czasie (50-70 min) to odpowiadającej tej godzinie diody już nie włączy. Może dopiero następną za 40min bo jest juz 10min po pełnej godzinie kiedy kończy się czas furtki. Minuty liczone sa osobno a Counter w dół jest po to żeby tylko jedną diode można było zapalić w furtce czasowej.
Nie spotkałem się jeszcze z takim rozwiązaniem aż tu nagle oglądam Gang Olsena i patrze że tam stróż miał taki zegar i w biurach gdzie miał zrobić obchód wisiały klucze pasujące do zegara którymi musiał zaznaczyć obecnośc w zegarze :D - a film z minionej epoki.
Urządzenie jest prototypowe i działa u mnie na płytce. O schemat i projekt płytki pokusiłem się tylko dla zabawy :) Program napisałem dla kogoś z innego forum i pewnie wymaga jakichś poprawek. Jest tam rozwiazanie które sie może komuś przydać.
Wiadomo że w małych mikrokontrolerach jest mniej miejsca więc żeby zyskać na funkcjonalności liczy się użycie możliwie najmniejszych zmiennych.
Żeby zapisać jakąś liczbę ujemną musiałbym użyć typu Integer. Przy różnych operacjach na zmiennych najlepiej żeby były tego samego typu. Można użyć rzutowania ale żeby sprawę uprościć i się nie bawić przesunąłem o 10 całość obliczeń. Teraz 70`ta minuta to 60`ta, a 0 minut to -10.

$regfile = "2313def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
 
Config Portb = &B11111111 : Portb = &B11111111              'cały portB jako wyjścia dla LED, LED zgaszone
Config Portd = &B00000000 : Portd = &B11111111              'cały portD jako wejscia, podciaganie rezystorami wł
 
Config Timer1 = Timer , Prescale = 64
Enable Timer1 : On Timer1 Clock                             'co sekunde skok do podprogramu Clock
 
Const Presettimer1 = 49912                                  ' wartosc ladowana do Timera1
 
Dim Seconds As Byte , Minutes As Byte , Hours As Byte
Dim Countdown As Byte , B_port As Byte , Help As Byte
 
Waitms 100                                                  'czas na wszelki wypadek
 
If Pind.6 = 0 Then                                          'jesli przy starcie nacisniety jest przycisk
 Hours = 0                                                  'zeruj liczniki
 B_port = 255
 Writeeeprom Hours , 2
 Writeeeprom B_port , 4
 Waitms 100
End If
 
Readeeprom Hours , 2                                        'przy zaniku zasilania odczytaj zapisany już czas
Readeeprom B_port , 4                                       'i stan diod
 
If Hours > 24 Then Hours = 0                                'zabezpieczenie dla czystej pamieci (FF przy programowaniu)
Minutes = 10                                                ' przesuniecie by nie uzywac wartosci ujemnych
Portb = B_port                                              'przypisanie portowi wartości z pamieci
 
Enable Interrupts
'************* START ******************
Do
 
If Minutes = 81 Then                                        'jesli nic nie nacisnieto do 70minuty to
    Minutes = 21                                            'nie pozwoli właczyć tej diody
    Incr Hours
    Writeeeprom Hours , 2
    Waitms 50
    Countdown = 39                                          'odlicza tylko 40min bo jest juz 10min po
End If
 
Debounce Pind.6 , 0 , Time_check , Sub                      'switch to ground
 
Loop
'************ END *********************
Time_check:
 
Select Case Minutes
 
 Case 60 To 80                                              'pomiedzy 50 a 70min wliczajac przesuniecie
 If Countdown = 0 Then
  If Minutes < 70 Then                                      'obliczanei minut do kolejnej możliwości
   Help = 70 - Minutes
   Minutes = 10 - Help
  Elseif Minutes > 70 Then
   Help = Minutes - 70
   Minutes = 10 + Help
  End If
 
    Countdown = 49                                          ' zablokowanie nastepnych przycisniec na 50min
   Select Case Hours
    Case 1
     Reset Portb.0
    Case 2
     Reset Portb.1
    Case 3
     Reset Portb.2
    Case 4
     Reset Portb.3
    Case 5
     Reset Portb.4
    Case 6
     Reset Portb.5
    Case 7
     Reset Portb.6
    Case 8
     Reset Portb.7
   End Select
   B_port = Portb                                           'zapisz wartość portu do zmiennej
   Incr Hours                                               'i zapisz
   Writeeeprom B_port , 4
   Writeeeprom Hours , 2
   Waitms 50
 End If
 
 End Select
 
Return
 
 
 
 
Clock:
Timer1 = Presettimer1
Incr Seconds
  If Seconds >= 60 Then
     Seconds = 0
     Incr Minutes
     If Countdown > 0 Then Decr Countdown
  End If
Return

Miłego dnia :D