Pytania, kody i porady dotyczące nie tylko Bascom.
-
kulamario
- Posty: 207
- Rejestracja: 17 sie 2015, 20:05
- Lokalizacja: Greystones
-
Kontakt:
Post
autor: kulamario » 11 lis 2017, 14:07
Witam
Mam mały problem z napisaniem kodu do obsługi pilotem potencjometru z silniczkiem o ile sterowanie przyciskami działa to jeśli chce sterować pilotem to już nie chce chodzić dobrze
dodaje kod który napisałem ze by sterować przyciskami i ten kod działa 100%
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 28
$swstack = 28
$framesize = 28
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Pind.0 = Input
Config Pind.1 = Input
Config Pinc.7 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Portd.2 = 0
Portd.3 = 0
Up Alias Pind.0
Down Alias Pind.1
Set Portd.0
Set Portd.1
Declare Sub Up1
Declare Sub Down1
'Config Rc5 =
Do
If Up = 0 Then Gosub Up1
'Portd.2 = 1
If Down = 0 Then Gosub Down1 'Portd.3 = 1
Loop
Sub Up1:
Portd.2 = 1
Portc.7 = 0
Waitms 50
Portd.2 = 0
Portc.7 = 0
End Sub
Sub Down1:
Portd.2 = 0
Portc.7 = 1
Waitms 50
Portd.2 = 0
Portc.7 = 0
End Sub
A tu kod z juz dodana obsluga RC5 ale niestety nie chodzi
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 28
$swstack = 28
$framesize = 28
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Dim Address As Byte , Command As Byte
Declare Sub Up1
Declare Sub Down1
Config Pinc.7 = Output
Config Pind.2 = Output
Config Rc5 = Pinc.2 , Timer = 2
Plus Alias Portd.2
Minus Alias Pinc.7
'-------------------------------------------------------------------------------
Enable Interrupts
Do
Getrc5(address , Command)
Command = Command And &B01111111
If Address = 0 And Command = 16 Then Gosub Up1
'End If
If Address = 0 And Command = 17 Then Gosub Down1
'End If
Loop
Sub Up1:
Plus = 1 'Portd.2 = 1
Minus = 0 'Portc.7 = 0
'Waitms 100
'Plus = 0 'Portd.2 = 0
'Minus = 0 'Portc.7 = 0
End Sub
Sub Down1:
Plus = 0 'Portd.2 = 0
Minus = 1 'Portc.7 = 1
'Waitms 100
'Portd.2 = 0
'Portc.7 = 0
End Sub
Czy może mi ktoś pomoc z tym bardzo proszę
-
niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 11 lis 2017, 19:58
Powinieneś od razu pomyśleć jak tu wyłączyć potem taki silnik.
Zerknij na kod z mojej strony. Powstał daawno temu jeszcze na Forum Mirleya.
Pilot przy przytrzymaniu przycisku nie nadaje stale tylko z przerwami ponawia komendę. Sterowany w ten sposób silnik by szarpał a dioda lub żarówka by migała. Poniższy kod utrzymuje pin portu w jednym stanie do momentu puszczenia przycisku pilota. Później wyjścia są zerowane.
Kod jest stary, ale możemy go łatwo przepisać pod dowolny układ. Led_r i Led_l to odpowiednio wyjścia dla przekaźników/wejść sterujących silnikiem.
'Odbiornik RC5
'Wyjścia w stanie niskim tak długo jak trzyma się przycisk
$regfile = "attiny13a.dat" '44% Flash
$crystal = 9600000
$hwstack = 24
$swstack = 18
$framesize = 16
$lib "mcsbyte.lbx" 'wykorzystamy bibliotekę która ogranicza się do
'uzywania tylko bajtów celem zmniejszenia kodu
Config PORTB.3 = Output
Config PORTB.4 = Output 'tu diody ale mogą to być wyjścia
Led_r Alias PORTB.3
Led_l Alias PORTB.4
Set Led_r 'żeby nie włączyć dwóch kierunków na raz
Set Led_l
Config Rc5 = PINB.0
Dim Address As Byte 'typ urządzenia np.0-telewizor, 8-sat
Dim Command As Byte 'np 17 ciszej,16 głośniej
Dim Odczekaj As Byte
Const Deelay = 20
Enable Interrupts ' zezwolenie na przerwania
'*** START ***
Do
Getrc5(address , Command) 'sprawdź czy pilot nadaje
If Address <> 255 Then 'jeśli Wpisać "If Address=0 Then"
Command = Command And &B01111111 'to zawęzimy tylko do telewizorów
Select Case Command
Case 16 'przycisk pilota +
Reset Led_l
Odczekaj = Deelay
Case 17 'przycisk pilota -
Reset Led_r
Odczekaj = Deelay
End Select
End If
If Odczekaj <> 0 Then Decr Odczekaj
If Odczekaj = 0 Then
Set Led_l
Set Led_r
End If
Loop
End
'*** KONIEC ***
-
marekszy
- Posty: 115
- Rejestracja: 20 lis 2016, 20:21
Post
autor: marekszy » 11 lis 2017, 22:43
Witam,tak przy okazji, masz może program do obsługi pilotów NEC oraz do odczytu co nadaje dany przycisk.
-
pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Post
autor: pimowo » 11 lis 2017, 23:04
marekszy pisze: ↑11 lis 2017, 22:43
Witam,tak przy okazji, masz może program do obsługi pilotów NEC oraz do odczytu co nadaje dany przycisk.
KLIK
-
kulamario
- Posty: 207
- Rejestracja: 17 sie 2015, 20:05
- Lokalizacja: Greystones
-
Kontakt:
Post
autor: kulamario » 12 lis 2017, 3:56
Niveasoft
Kod niby działa ale nie wiem co jest nie halo bo jeśli case 17 czyli dół działa to case 16 juz nie tz działa ale na ułamek sekundy co nie jest wystarczające do poruszenia motoru w potku
czy może mi ktoś pomóc z tym
-
niveasoft
- Posty: 1313
- Rejestracja: 17 sie 2015, 12:13
-
Kontakt:
Post
autor: niveasoft » 12 lis 2017, 8:49
Najpierw spróbuj zwiększyć Const Deelay = 20
Taka mała wartość miała na celu to by silnik od razu stanął po puszczeniu przycisku.
-
kulamario
- Posty: 207
- Rejestracja: 17 sie 2015, 20:05
- Lokalizacja: Greystones
-
Kontakt:
Post
autor: kulamario » 12 lis 2017, 13:26
ten delay to daje tyle ze silnik troszkę dłużej się zatrzymuje a motor u tak nie chodzi w ta stronę tak jak powinien
-
pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Post
autor: pimowo » 12 lis 2017, 23:27
Widzę, że Kolega @kulamario pisał o tym samym na innym forum, tam też z nim rozmawiałem...
Zamieszczę tutaj swoje pomysły bo jestem ciekawy co na to @niveasoft
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 28
$swstack = 28
$framesize = 28
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Const Krok_pot = 2 'czas w setkach milisekund
Config Timer1 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear Timer = 1
Enable Compare1a : On Compare1a Int_10ms Nosave : Compare1a = 155 '10ms @16MHz
Dim 10ms As Byte , 100ms As Byte
Dim Address As Byte , Kod As Byte , Odebrany_kod As Bit
Dim Licz1 As Byte , Licz2 As Byte
Dim Glosniej_krok As Byte , Ciszej_krok As Byte
Config Pind.0 = Input : Portd.0 = 1 : Sw1 Alias Pind.0
Config Pind.1 = Input : Portd.1 = 1 : Sw2 Alias Pind.1
Config Portd.2 = Output : Portd.2 = 0 : Glosniej Alias Portd.2
Config Portc.7 = Output : Portc.7 = 0 : Ciszej Alias Portc.7
Config Rc5 = Pind.2 , Wait = 2000
On Int0 Rc5
Config Int0 = Falling
Enable Int0
Enable Interrupts
Do
If 10ms = 1 Then
10ms = 0
Gosub Przyciski
Incr 100ms
End If
If 100ms = 10 Then
100ms = 0
If Glosniej_krok > 0 Then
Ciszej_krok = 0
Decr Glosniej_krok
If Glosniej_krok = 0 Then Reset Glosniej
End If
If Ciszej_krok > 0 Then
Glosniej_krok = 0
Decr Ciszej_krok
If Ciszej_krok = 0 Then Reset Ciszej
End If
End If
If Odebrany_kod = 1 Then
If Address <> 255 Then
Select Case Kod
Case 16 : Set Glosniej
Glosniej_krok = Krok_pot
Case 17 : Set Ciszej
Ciszej_krok = Krok_pot
End Select
End If
Odebrany_kod = 0
End If
Loop
End
Rc5:
Disable Int0
Gifr.intf0 = 1
Enable Interrupts
Getrc5(address , Kod)
Kod = Kod And &B01111111
Odebrany_kod = 1
Disable Interrupts
Enable Int0
Gifr.intf0 = 1
Return
Int_10ms:
$asm
PUSH R24
!in R24, sreg
PUSH R24
$end Asm
10ms = 1
$asm
POP R24
!out sreg, r24
POP R24
$end Asm
Return
Przyciski:
If Sw1 = 0 Then
If Licz1 < 255 Then Incr Licz1
If Licz1 = 75 Then
'dlugie nacisniecie przycisku
'zrob cos
End If
Else
If Licz1 > 1 Then
If Licz1 < 75 Then
Set Glosniej
Glosniej_krok = Krok_pot
End If
End If
Licz1 = 0
End If
If Sw2 = 0 Then
If Licz2 < 255 Then Incr Licz2
If Licz2 = 75 Then
'dlugie nacisniecie przycisku
'zrob cos
End If
Else
If Licz2 > 1 Then
If Licz2 < 75 Then
Set Ciszej
Ciszej_krok = Krok_pot
End If
End If
Licz2 = 0
End If
Return
-
kulamario
- Posty: 207
- Rejestracja: 17 sie 2015, 20:05
- Lokalizacja: Greystones
-
Kontakt:
Post
autor: kulamario » 13 lis 2017, 0:57
wywaliłem obsługę przycisków ale kod nie działa
tz działa tak ze jak wciśniesz up to jedzie cały czas up jak wciśniesz down to jedzie cały czas down ale tylko raz możesz uruchomić motor jak chcesz drugi raz ruszyć motorem to już trzeba reset procka zrobić
-
pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Post
autor: pimowo » 13 lis 2017, 10:45
Zamiast wywalać to sprawdź czy przyciski działają...