Skocz do zawartości

[bascom] [c] i szeregowe połączenie z prockiem (obsługa dwóch klawiszy klwiatury na raz)


STOPER17

Pomocna odpowiedź

Witam,
jestem w trakcie wykonywania modelu pojazdu, zachowując podstawowe wyposażenie typu światła, kierunki itp przez sygnał PWM zmianę prędkości (czyli imitacja skrzyni 2biegowej) ( zabawka dla syna 😃 )

Z połączeniami i wykonaniem oraz obsługą procka przez UART nie ma żadnego problemu , leże tylko na samym pisaniu programów. Potrafię obsłużyć 1 klawisz z klawiatury przy pomocy komendy INKEY, co daje mi możliwość skręć w lewo/prawo/ przód/tył/ ale z skarby świata nie potrawie zmusić procka by po naciśnięciu np "W" i "A" jechał do przodu i skręcał jednocześnie. Oczywiście gdy klawisze będą puszczone wszystko się zatrzymuje. Starałem się z komendą Waitkey() ale rezultat niezadowalający.

Z językiem C nie miałem do czynienia (w ramach wyjaśnień)

Proszę o pomoc lub naprowadzenie. Każda rada jest cenna

__________

Komentarz dodany przez: Sabre

Temat przywróciłem na prośbę autora.

Link do komentarza
Share on other sites

Też ostatnio się zastanawiałem jak w bascomie można zrobić sterowanie czymkolwiek dwoma przyciskami klawiatury, ale nie miałem zbytnio czasu, żeby się za to porządnie wziąć. Może do weekendu znajdę trochę czasu i pobawię się tym problemem.

Jak coś wymyślę to dam znać :-]

Link do komentarza
Share on other sites

super 🙂

Podaje to co ja uzyskałem, może pomoże:

Dim W As Byte
Dim A As Byte
Dim D As Byte

Do
W = Waitkey()
A = Waitkey()
D = Waitkey()
If Chr(w) = "w" And Chr(a) = "a" Then
Portc = &B00010100
Print "WA"
End If

If Chr(w) = "w" And Chr(d) = "d" Then
Portc = &B00000101
Print "WD"
End If

If W = 0 And A = 0 And D = 0 Then
Waitms 2
Portc = &B00000000
Print "stop"
End If


loop
End

I powiedzmy że coś już działa. Ale bardzo się muli, i nie mogę zmusić go by resetował port zaraz po zwolnieniu przycisków;/

I jak na razie to wszystko z mojej strony. Może coś to pomoże 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Nie idzie w Bascomie zrobić odczytu z klawiatury dwu wciśniętych przycisków. Niestety.

Mój program działa zdecydowanie szybciej od Twojego, bo mam użytą tylko jedną komendę Waitkey()

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.2 = Output
Config Portd.3 = Output

Lewy2 Alias Portd.2
Lewy1 Alias Portd.3
Prawy1 Alias Portd.4
Prawy2 Alias Portd.5

Dim Znak As String * 1
Dim Ruch As Byte
Dim Kierunek As Byte

Prawy1 = 0
Prawy2 = 0
Lewy1 = 0
Lewy2 = 0
Pwm1a = 255
Pwm1b = 255

Do
  Znak = Waitkey()

  If Znak = "w" Or Znak = "s" Then
     Ruch = Znak
     Znak = "m"
     Kierunek = Znak
  Else
     If Znak = "a" Or Znak = "d" Then
        Kierunek = Znak
     Else
        Znak = "m"
        Ruch = Znak
        Kierunek = Znak
     End If
  End If

'--------------------------------Jazda do przodu--------------------------------

  If Chr(ruch) = "w" And Chr(kierunek) <> "a" And Chr(kierunek) <> "d" Then
     Pwm1a = 255
     Prawy1 = 1
     Prawy2 = 0
     Pwm1b = 255
     Lewy1 = 1
     Lewy2 = 0
     Print "W"
  End If

  If Chr(ruch) = "w" And Chr(kierunek) = "a" Then
     Pwm1a = 255
     Prawy1 = 1
     Prawy2 = 0
     Pwm1b = 200
     Lewy1 = 1
     Lewy2 = 0
     Print "WA"
  End If

  If Chr(ruch) = "w" And Chr(kierunek) = "d" Then
     Pwm1a = 200
     Prawy1 = 1
     Prawy2 = 0
     Pwm1b = 255
     Lewy1 = 1
     Lewy2 = 0
     Print "WD"
  End If

'---------------------------------Jazda do tyłu---------------------------------

  If Chr(ruch) = "s" And Chr(kierunek) <> "a" And Chr(kierunek) <> "d" Then
     Pwm1a = 255
     Prawy1 = 0
     Prawy2 = 1
     Pwm1b = 255
     Lewy1 = 0
     Lewy2 = 1
     Print "s"
  End If

  If Chr(ruch) = "s" And Chr(kierunek) = "a" Then
     Pwm1a = 255
     Prawy1 = 0
     Prawy2 = 1
     Pwm1b = 200
     Lewy1 = 0
     Lewy2 = 1
     Print "SA"
  End If

  If Chr(ruch) = "s" And Chr(kierunek) = "d" Then
     Pwm1a = 200
     Prawy1 = 0
     Prawy2 = 1
     Pwm1b = 255
     Lewy1 = 0
     Lewy2 = 1
     Print "SD"
  End If

'-------------------------------------STOP--------------------------------------

  If Chr(ruch) <> "w" And Chr(ruch) <> "s" And Chr(kierunek) <> "a" And Chr(kierunek) <> "d" Then
     Prawy1 = 0
     Prawy2 = 0
     Lewy1 = 0
     Lewy2 = 0
     Print "Stop"
  End If
loop
End

W - jazda do przodu

S - jazda do tyłu

A - skręt w lewo

D - skręt w prawo

Link do komentarza
Share on other sites

ProeXtreme, oczywiście, że idzie 🙂 i jest to banalnie proste, dziwi mnie dlaczego nikt tego nie zrobił do tej pory.

Wystarczy sprawdzić 1 przycisk później sprawdzić po kilku ms czy jest wciśnięty 2 czy nie. Jeśli jest to wykonać jazdę do przodu i skręt, jeśli nie jest to samą jazdę do przodu. Cały trik polega na tym aby sprawdzać przyciski cyklicznie co ileś ms, a na podstawie informacji z przycisków wysterowywać odpowiednio PWM.

Struktura wyglądałaby tak

if wciśnięty 1 then

waitms X

if wciśnięty 2 then

jedź do przodu i skręć

else

jedź do przodu

end if

end if

Oczywiście trzeba sprawdzać każdą kombinację czyli wciśnięcie najpierw przycisku 1 potem 2 i wciśnięcie najpierw 2 potem 1.

Link do komentarza
Share on other sites

Sabre, rzecz w tym, że jak wciśniesz i będziesz trzymał "W", po czym wciśniesz "A" i puścisz "A" to uC nie będzie już wiedział, że "W" jest nadal wciśnięte. Będzie tak nawet jak zastosujesz kilka zmiennych do odczytu stanów przycisków.

Komenda Waitkey() reaguje na wciśnięcie przycisku. Dlatego.

Link do komentarza
Share on other sites

ProeXtreme, mylisz się. Będzie wiedział, że przycisk W jest nadal wciśnięty ponieważ tak jak wyżej napisałem sprawdzanie przycisków musi się odbywać cyklicznie co ściśle ustalony czas. Ja robiąc obsługę przycisków w kilku projektach zrobiłem to właśnie w ten sposób i zawsze działało to prawidłowo.

Zamknięta pętla, która sprawdza przyciski co 200-300ms, a jak wykryje że coś jest wciśnięte to wyskakuje z tej pętli i wykonuje odpowiednią procedurkę.

Link do komentarza
Share on other sites

Nie jest tak jak mówisz.

Chyba o coś takiego Ci chodziło:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8

Dim Znak As String * 1
Dim Znak2 As String * 1
Dim Numer As Word

Numer = 0

Do
  Znak = Waitkey()
  If Znak = "w" Then
     Waitms 500
     Znak2 = Waitkey()
     If Znak2 = "d" Then
        Incr Numer
        Print Numer ; "wd"
     Else
        Incr Numer
        Print Numer ; "w" ; Znak2
     End If
  Else
     Incr Numer
     Print Numer ; Znak
  End If
Loop
End

A oto LOG z terminala.

1ww <-tutaj zacząłem trzymać W

2ww

3ww

4ww

5ww

6ww

7ww

8wd <-tutaj wcisnąłem D, W nadal wciśnięte

9d

10d

11d

12d

13d

14d

15d

16d

17d

18d

19d

20d

21d

22d

23d

24d

25a <- tutaj wcisnąłem A, W nadal wciśnięte

26a

27a

28a

29a

30a

31a

32a

33a

34a

35a

36a

37a

38a

39a

40a

41a

42a

Jeśli coś źle robię to pokaż mi gdzie.

Link do komentarza
Share on other sites

Szczerze nie wiem jak działa polecenie Waitkey, ja sprawdzam przyciski przez sprawdzanie stanu na pinie i tak jak wyżej pisałem u mnie to działa. Twój kod jest trochę inny niż to o co mi chodzi. W weekend napiszę własny kod i pokażę ci, że to działa bez problemu.

Poza tym wyżej pisałem, że każdą kombinację trzeba rozpisać, ty nie sprawdzasz każdej kombinacji tylko jedną z elsem w środku, więc nie wiem czego się spodziewasz więcej po tym kodzie.

Link do komentarza
Share on other sites

Wydaje mi się, że mówimy o różnych sprawach.
ja sprawdzam przyciski przez sprawdzanie stanu na pinie

Wnioskuję, że mówisz klawiaturze z microswitch-y podłączonej do mikrokontrolera. Mam rację?

Mea culpa, dopiero się zorientowałem, że chodzi o klawiaturę komputera, co w tym przypadku jest już dla mnie prawie niezrozumiałe. Zwracam honor, wybaczcie mi, czasami też się mylę.

Link do komentarza
Share on other sites

Sabre, spoko. Obsługa klawiatury z microswitch-y jest banalnie prosta. 😉

Wracając do tematu to nic lepszego niż program z mojego drugiego postu raczej się nie zrobi.

EDIT

STOPER17, w C na pewno sobie z tym poradzisz.

Link do komentarza
Share on other sites

Teraz jak do mnie dotarło o co chodzi, to jest jeszcze bardzo proste rozwiązanie tego problemu. Może trochę go obchodzące, ale zawsze to problem z głowy.

Otóż wystarczy przypisać inny klawisz do skrętu i jazdy na wprost jednocześnie 😃.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.