Witam serdecznie, Witam ponownie zmagam się z prostym lecz dla mnie jednak trudnym zadaniem i liczę na waszą jakąkolwiek pomoc. 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ć
|
|||
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:
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
Ustawianie do pionu
Proszę, to była przyjemność :)
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
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ę.
Chciałbym się odwdzięczyć
Chciałbym się odwdzięczyć jakoś za pomoc, czekam na kontakt :)
Odp. Ustawianie do pionu
Jak Mirlej pozwoli (bo nie pytałem) to dodam kiedyś link do mojej strony w stopce.
BARTek
Moja strona
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.