Sterownik bramy garażowej

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Sterownik bramy garażowej

Post autor: Radzio » 16 wrz 2018, 18:40

Witam wszystkich po raz pierwszy, i mam prośbę o sprawdzenie kodu sterownika bramy. Kod częściowo zmodyfikowany po znalezieniu w sieci, jednak nie działa, tzn. kompiluje się i wgrywa, lecz wyjścia B.1 i B.2 cały czas są w stanie wysokim. Czego nie zrobiłem, lub co zrobiłem źle, prośba o podpowiedź.
  1.  
  2.     $regfile = "m32def.dat"          'M8
  3.     $crystal = 8000000
  4.  
  5.  
  6.     Dim Ruch_bramy As Byte
  7.  
  8.     Config Lcd = 16 * 2
  9.     Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
  10.     Cls
  11.     Cursor Off Noblink
  12.  
  13.  
  14.     Config Pinb.6 = Input    'Krańcówka góra
  15.     Config Pinb.4 = Input    'Przycisk
  16.     Config Pinb.5 = Input    'Krańcówka dół
  17.     Config Pinb.7 = Input    'Fotokomórka
  18.  
  19.     Krancowka_gora Alias Pinb.6
  20.     Przycisk Alias Pinb.4
  21.     Krancowka_dol Alias Pinb.5
  22.     Fotokomorka Alias Pinb.7
  23.  
  24.     Config Portb.1 = Output  'Przekaźnik otw.
  25.     Config Portb.2 = Output  'Przekaźnik zam.
  26.  
  27.     Przekaznik_otwierania Alias Portb.1
  28.     Przekaznik_zamykania Alias Portb.2
  29.  
  30.     Set Portb
  31.  
  32.  
  33.     Do
  34.        If Przycisk = 0 Then
  35.           Incr Ruch_bramy                          'wiadomo, zwiększasz zmienną
  36.           Bitwait Przycisk , Set
  37.           If Ruch_bramy >= 4 Then Ruch_bramy = 0   'nie muszę opisywać
  38.        End If
  39.  
  40.             Select Case Ruch_bramy
  41.  
  42.                     Case 0:
  43.                                                    'tu ustaw porty do zatrzymania silnika
  44.                        Set Przekaznik_otwierania
  45.                        Set Przekaznik_zamykania
  46.  
  47.                     Case 1:
  48.                         If Krancowka_dol <> 0 And Fotokomorka = 0 Then       'jeśli brama nie zamknięta
  49.                                                                       'i jeśli nic nie stoi w barierze podczerwieni to
  50.                                                                'tu ustaw porty do zamykania bramy
  51.                           Set Przekaznik_otwierania
  52.                           Reset Przekaznik_zamykania
  53.  
  54.                         End If
  55.  
  56.                     Case 2:
  57.                                                     'tu ustaw porty do zatrzymania silnika
  58.                        Set Przekaznik_otwierania
  59.                        Set Przekaznik_zamykania
  60.  
  61.                     Case 3:
  62.                         If Krancowka_gora <> 0 Then        'jeśli brama choćby trochę została zamknięta to
  63.                                                     'tu ustaw porty do otwierania bramy
  64.                            Set Przekaznik_zamykania
  65.                            Reset Przekaznik_otwierania
  66.  
  67.                         End If
  68.              End Select
  69.  
  70.              If Fotokomorka <> 0 And Ruch_bramy = 1 Then        'jeśli coś przerwie barierę w trakcie zamykania to
  71.                                                     'ustaw porty do zatrzymania silnika
  72.                 Set Przekaznik_zamykania
  73.                 Set Przekaznik_otwierania
  74.                 Wait 1                    'brzydko ale jeśli nie używasz timerów to można i tak
  75.                 Ruch_bramy = 3     'ustawiasz zmienną tak by naciśnięcie przycisku spowodowało
  76.                             'następną sekwencję czyli w tym przypadku zatrzymanie bramy
  77.                       'a select case w sekcji 3 zacznie Ci otwierać bramę
  78.              End If
  79.  
  80.              If Krancowka_dol = 0 And Ruch_bramy = 1 Then       'jeśli brama zamknie się to
  81.                 Ruch_bramy = 2
  82.                                            'ustawisz zmienną tak że select case wyłączy silnik
  83.              End If
  84.  
  85.              If Krancowka_gora = 0 And Ruch_bramy = 3 Then      'jeśli brama się otworzy to
  86.                 Ruch_bramy = 0
  87.                                   'ustawisz zmienną tak że select case wyłączy silnik
  88.              End If
  89.  
  90.              Home
  91.  
  92.              Lcd "Kr.ot=" ; Krancowka_gora ; "  " ; "foto=" ; Fotokomorka
  93.              Locate 2 , 1
  94.              Lcd "Kr.za=" ; Krancowka_dol ; "  " ; Ruch_bramy
  95.  
  96.  
  97.           Loop
  98.     End
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterownik bramy garażowej

Post autor: niveasoft » 16 wrz 2018, 19:04

Zacznij od zmiany w linii 30. Instrukcja Set zawsze odnosi się tylko do jednego Bitu
W Helpie można przeczytać, że jeśli nie zaznaczysz dokładnie o który Bit Ci chodzi to ustawiony zostanie Bit 0.
Tak więc nie masz podciągania krańcówek do plusa zasilania bo ustawia Ci tylko PORTB.0 = 1
Żeby mieć podciąganie na całym porcie trzeba napisać PORTB = 255, bądź wybiórczo, opisać binarnie PORTB = &B11111111

I mały dowód. Tak wygląda w Asemblerze ta błędna komenda Set PORTB(wyciągnięte NosaveTool`em):
  1. 30:           Set Portb
  2. 000000A6: 9AC0     SBI       $18, 0       'ustaw bit 0 pod adresem PORTB      
Awatar użytkownika
Radzio
Posty: 8
Rejestracja: 08 lip 2018, 11:36

Re: Sterownik bramy garażowej

Post autor: Radzio » 16 wrz 2018, 19:13

No proszę, bardzo bardzo dziękuję. Okazuje się że jak w linii 30 zmieniłem zapis na:
  1.   30:  Portb=&B11111111
to zaczęło działać, muszę jeszcze wszystko na spokojnie sprawdzić, póki co pozdrawiam.
ODPOWIEDZ