2 przekaźniki, diody oraz czujnik zbliżeniowy sterowane przyciskiem


Witam serdecznie, Witam ponownie

zmagam się z prostym lecz dla mnie jednak trudnym zadaniem i liczę na waszą jakąkolwiek pomoc.
Muszę stworzyć sterownik przekaźników które będą pozycjonowały pewien pion względem maszyny.

zasada jest taka iż na panelu operatora jest panel na którym zostaną umieszczone diody wskazujące położenie pionu w sumie 7 diod, 3 czerwone, jedna zielona i znów 3 czerwone. Oczywiście zielona informuje o prawidłowym położeniu.

sprawa jest taka iż na manipulatorze ma być przycisk który będzie aktywował cały system poziomowania, jednakże diody mają pokazywać ciągle stan położenia pionu niezależnie od przyciśnięcia.

Naciśnięcie przycisku ma służyć tylko jako aktywator przekaźników które wysterują pion. Napisałem pewien program, jednak nie do końca działa prawidłowo. Chciałem zrobic skok do podprogramu zależnie od stanu przycisku jednak nie dałem rady i próbowałem podjąć inną próbę, oto ona w której ani przycisk ani przekaźniki nie reagują, diody natomiast pracują poprawnie.

ADC to sygnał z czujnika optycznego zbliżeniowego

$regfile = "m8def.dat"
$crystal = 1000000
 
Config Portd.0 = Input
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.7 = Output
Config Portb.6 = Output
 
Config Portc.5 = Input
 
Przycisk Alias Portd.0
Przekaznik1 Alias Portb.7
Przekaznik2 Alias Portb.6
 
 
Przycisk = 0
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , Rs = Portb.5 , E = Portb.4
Cursor Off
 
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
 
Dim Led As Byte                                             ' wartosc diod dla chwilowej wartosci
Dim Sample As Integer                                       ' wartosc diod dla chwilowej wartosci
 
Wait 2
Do
  Waitms 1
  Sample = Getadc(5)
 
    If Sample >= 16 Then
  Set Portd.1
 
  If Przycisk = 1 Then
   Set Przekaznik1
 Reset Przekaznik2
 Else
 Reset Przekaznik1
 End If
 
  Reset Portd.7
  Else
  Reset Portd.1
  End If
 
 
 
 
  If Sample >= 32 Then
  Set Portd.2
  If Przycisk = 1 Then
   Set Przekaznik1
 Reset Przekaznik2
 Else
 Reset Przekaznik1
 End If
 
  Reset Portd.1
  Else
  Reset Portd.2
  End If
 
 
 
 
    If Sample >= 48 Then
  Set Portd.3
  If Przycisk = 1 Then
   Set Przekaznik1
 Reset Przekaznik2
 Else
 Reset Przekaznik1
 End If
 
  Reset Portd.2
    Else
    Reset Portd.3
    End If
 
 
 
 
    If Sample >= 64 Then
  Set Portd.4
  If Przycisk = 1 Then
   Reset Przekaznik1
 Reset Przekaznik2
 End If
  Reset Portd.3
    Else
    Reset Portd.4
    End If
 
 
 
 
    If Sample >= 80 Then
  Set Portd.5
  If Przycisk = 1 Then
   Set Przekaznik2
 Reset Przekaznik1
 Else
 Reset Przekaznik2
 End If
  Reset Portd.4
    Else
    Reset Portd.5
    End If
 
 
 
 
    If Sample >= 96 Then
   Set Portd.6
  If Przycisk = 1 Then
   Set Przekaznik2
 Reset Przekaznik1
 Else
 Reset Przekaznik2
 End If
  Reset Portd.5
    Else
    Reset Portd.6
    End If
 
 
 
 
    If Sample >= 110 Then
    Set Portd.7
  If Przycisk = 1 Then
   Set Przekaznik2
 Reset Przekaznik1
 Else
 Reset Przekaznik2
 End If
  Reset Portd.6
  Else
  Reset Portd.7
End If
 
 
 
 
  Cls
  Locate 1 , 1
  Lcd "dane"
  Locate 2 , 1
  Lcd Sample
    Waitms 50
  Locate 2 , 1
  Lcd "    "
 
 Loop
  End

A tutaj wersja która działa, jednak bez możliwości włączenia lub wyłączenia za pomocą przycisku sterowania przekaźników (działają ciągle tak jak diody pokazują).

$regfile = "m8def.dat"
$crystal = 1000000
 
Config Portd.0 = Input
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.7 = Output
Config Portb.6 = Output
 
Config Portc.5 = Input
 
Przycisk Alias Portd.0
Przekaznik1 Alias Portb.7
Przekaznik2 Alias Portb.6
 
 
Przycisk = 0
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , Rs = Portb.5 , E = Portb.4
Cursor Off
 
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
 
Dim Led As Byte                                             ' wartosc diod dla chwilowej wartosci
Dim Sample As Integer                                       ' wartosc diod dla chwilowej wartosci
 
Wait 2
Do
  Waitms 1
  Sample = Getadc(5)
 
    If Sample >= 16 Then
  Set Portd.1
   Set Przekaznik1
 Reset Przekaznik2
  Reset Portd.7
  Else
  Reset Portd.1
  End If
 
 
 
 
  If Sample >= 32 Then
  Set Portd.2
   Set Przekaznik1
 Reset Przekaznik2
  Reset Portd.1
  Else
  Reset Portd.2
  End If
 
 
 
 
    If Sample >= 48 Then
  Set Portd.3
   Set Przekaznik1
 Reset Przekaznik2
  Reset Portd.2
    Else
    Reset Portd.3
    End If
 
 
 
 
    If Sample >= 64 Then
  Set Portd.4
   Reset Przekaznik1
 Reset Przekaznik2
  Reset Portd.3
    Else
    Reset Portd.4
    End If
 
 
 
 
    If Sample >= 80 Then
  Set Portd.5
   Set Przekaznik2
 Reset Przekaznik1
  Reset Portd.4
    Else
    Reset Portd.5
    End If
 
 
 
 
    If Sample >= 96 Then
   Set Portd.6
   Set Przekaznik2
 Reset Przekaznik1
  Reset Portd.5
    Else
    Reset Portd.6
    End If
 
 
 
 
    If Sample >= 110 Then
    Set Portd.7
   Set Przekaznik2
 Reset Przekaznik1
  Reset Portd.6
  Else
  Reset Portd.7
End If
 
 
 
 
  Cls
  Locate 1 , 1
  Lcd "dane"
  Locate 2 , 1
  Lcd Sample
    Waitms 50
  Locate 2 , 1
  Lcd "    "
 
 Loop
  End

Bardzo dziękuję za pomoc lub jakiekolwiek nakierowanie na to co powinienem był zrobić




Portret użytkownika EDC

Odp. Ustawianie do pionu

Nie wstawiłeś żadnego schematu wiec nie wiadomo czy przyciski zwierają do masy. Jeśli jednak.. to błąd leży w niezrozumieniu tej sprawy:
W procesorze są odzielne rejestry dla ustawiania, czy port jest wejściowym czy wyjściowym, w jakim się ma znajdować stanie i w jakim jest, dla każdego portu.
Żeby móc sprawdzać czy dany przycisk jest wciśnięty należy:

Config Portd.0 = Input 'ustawić dany pin jako wejściowy
Portd.0 = 1            'ustawić stan wysoki przez wpis do portu i podłaczenie wewnetrznych rezystorów
Przycisk Alias Pind.0  'można nadać przyjazną nazwę !ALE! dla Pinu, nie dla Portu, bo stan odczytuje się z Pin
 
'teraz w programie możesz sprawdzać czy przyciskiem zwierany jest stan portu no masy
 
If Przycisk = 0 Then
'...
End If

Trzeba uważać z drugą konfiguracją gdy ustawiamy Port jako wyjściowy. W tym trybie wszelkie odbiorniki należy podłączać już z uwzględnieniem maxymalnego prądu! Jesli Port ustawisz jako wyjściowy, potem ustawisz w stan wysoki i zewrzesz go do masy przyciskiem możesz uszkodzić procesor!. W stanie niskim też trzeba uważać by nie przekroczyć maksymalnego prądu, więc wszystko przez odpowiednio dobrane rezystory.
Bezpieczniej jest więc nie konfigurować nieużywanych portów jako wyjściowe, ale warto ustalić ich stan podłączając rezystory wewnętrzne.
Coś pozmieniaj i daj kod na stronkę to jeszcze go udoskonalimy o Select case ;) zamiast tych If`ów

Ps. W Twoim programie przekaźniki są sterowane "niby" odrazu poprzez logike programu dlatego może nie ma konfliktu. Port jeśli jest ustawiany na początku jako Wyjściowy-Output to ma wartość 0 więc zwiera do masy. W zalezności od użytych tranzystorów mogą one zostać wysterowane. By uniknąć włączenia w dwa kierunki naraz trzeba też na początku programu po ustawieniu portów w stan wyjściowy nadać im stany początkowe... bo przy sterowaniu kierunkami silnika, na przykład, doprowadziło by to do włączenia dwóch kierunków na raz i zwarcia.

Miłego dnia.

-

BARTek
Moja strona

Portret użytkownika EDC

Ustawianie do pionu

Proszę, to była przyjemność :)

$regfile = "m8def.dat"
$crystal = 1000000
 
'config D.0=Input, reszta = Output, D.0=Stan wysoki, reszta(diody)=Zgaszone
Config Portd = &B11111110 : Portd = &B00000001
'config B.6 i B.7=Output, reszta = Input, B.6 i B.7(przekazniki)=Wylaczone, reszta wejsc=Stan HI
Config Portb = &B11000000 : Portd = &B00111111
'dwukropek oznacza jakby przejscie do drugiej linii (odziela komendy)
 
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
 
Config Portc.5 = Input
Dim Sample As Word                                          'ADC mierzy do 1024
Dim N As Byte
 
Przycisk Alias Pind.0
 
Led_minus3 Alias Portd.1
Led_minus2 Alias Portd.2
Led_minus1 Alias Portd.3
Led_pion Alias Portd.4
Led_plus1 Alias Portd.5
Led_plus2 Alias Portd.6
Led_plus3 Alias Portd.7
 
Przekaznik1 Alias Portb.7
Przekaznik2 Alias Portb.6
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , Rs = Portb.5 , E = Portb.4
Cursor Off
Cls
Lcd "Dane: "                                                'wyswietl raz
 
 
'*** START ***
Do
 
  Sample = Getadc(5)                                        'pobierz próbke
    Locate 1 , 7 : Lcd Sample ; "   "                       'to w cudzysłowiu czysci po starym dłuższym napisie
'poczatek warunku---------------
If Przycisk = 0 Then                                        'steruj przekaźnikami jesli przycisk wcisniety
 
  Select Case Sample
 
     Case 0 To 63
 
          Set Przekaznik1
        Reset Przekaznik2
 
     Case 64 To 79
 
        Reset Przekaznik1
        Reset Przekaznik2
 
     Case 80 To 1024
 
        Reset Przekaznik1
          Set Przekaznik2
 
  End Select
 
   Else                                                     'jesli nie wcisniety to wylacz przekaźniki
 
        Reset Przekaznik1
        Reset Przekaznik2
 
End If
'koniec warunku------------------
 
'sterowanie LEDami
    For N = 1 To 7
     Reset Portd.n                                          'gaszenie diod wszystkich na wszelki wypadek
    Next
 
 Select Case Sample
 
   Case 0 To 31
     Set Led_minus3
   Case 32 To 47
     Set Led_minus2
   Case 48 To 63
     Set Led_minus1
   Case 64 To 79
     Set Led_pion
   Case 80 To 95
     Set Led_plus1
   Case 96 To 109
     Set Led_plus2
   Case 109 To 1024
     Set Led_plus3
  End Select
 
Wait 1
 
Loop
End

Może będziesz musiał tylko Aliasy dla Diod zmienić albo w zalezności od tego ja sa sterowane zamienić instrukcje Set na Reset w wybranych miejscach.

Miłego dnia

-

BARTek
Moja strona

Portret użytkownika airman

Sprawdzę jak tylko dorwę

Sprawdzę jak tylko dorwę programator, jestem bardzo wdzięczny za to ze ktokolwiek mi pomógł jeśli zakończę projekt a muszę to zrobić to leci większe piwko, i to poważnie, tylko o adres do wysyłki potem będę prosić ;). Dam jutro znać co i jak. Jeszcze raz dziękuję.

Portret użytkownika airman

Chciałbym się odwdzięczyć

Chciałbym się odwdzięczyć jakoś za pomoc, czekam na kontakt :)

Portret użytkownika EDC

Odp. Ustawianie do pionu

Jak Mirlej pozwoli (bo nie pytałem) to dodam kiedyś link do mojej strony w stopce.

-

BARTek
Moja strona

Portret użytkownika mirley

Re: Stopka

Link w stopce możesz sobie dodać, nie mam nic przeciwko..... nawet możesz zareklamować moją stronę na swojej :)

-

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.