Witam.
Zbudowałem i zaprogramowałem układ do sterowania silnikiem krokowym przez RC5. Prosiłbym jeśli to możliwe o optymalizacje mojego kodu. Chciałbym zauważyć, że program działa poprawnie już załadowany do Atmegi, chodzi mi tylko o samą optymalizacje, żeby działał tak samo, jeśli się da to szybciej itd.
Układ jest wyposażony w ULN2003, wyjścia z Atmegi do ULNa są oznaczone jako Aliasy C1 - C4 (Cewki), Układ posiada dwa przyciski na płytce S1 i S2 umożliwiające sterowanie silnikiem bez pilota, posiada dwa wejścia na krańcówki X1 i X2. Diody, zieloną Ledz i czerwoną Ledc i wyjście na sterowanie silnikiem prądu stałego Dc1 i Dc2.
Idea działania:
Można sterować sterownikiem z przycisków na płytce. Po przyciśnięciu przycisku i przytrzymaniu przez 3s program wykonuje podprogram silnik_up, po ponownym wciśnięciu przycisku kończy działanie podprogramu. Po wciśnięciu drugiego przycisku program wykonuje podprogram Silnik_down. I tak samo. Po przytrzymaniu obu przycisków przez 5s, program wykonuje podprogram kalibracja_up odpowiedzialny za zapamiętanie komendy z pilota RC5 odpowiadającej za ruch silnika do góry. Najpierw miga zielona dioda LED i program czeka na wciśnięcie przycisku na pilocie, Potem odbywa się skok do podprogramu Kalibracja_down, i miga czerwona dioda i program czeka na wciśnięcie przycisku na pilocie odpowiedzialnego za ruch silnika w dół. Jeśli ten sam przycisk został wciśnięty jako silnik w górę i w dół to znopwu następuje przeskok do podprogramu kalibracja_up. Jeśli są różne przyciski to program wraca do programu głównego i po wciśnięciu odpowiedniego przycisku na pilocie załącza podprogram Silnik_up lub Silnik_down.
Mam nadzieje, że wszystko jasne. poniżej przedstawiam program:
Pozdrawiam i z góry dzięki za wszelką pomoc i rady
Przeniesiono z Programowanie Ogólne. - arnoldziq
Zbudowałem i zaprogramowałem układ do sterowania silnikiem krokowym przez RC5. Prosiłbym jeśli to możliwe o optymalizacje mojego kodu. Chciałbym zauważyć, że program działa poprawnie już załadowany do Atmegi, chodzi mi tylko o samą optymalizacje, żeby działał tak samo, jeśli się da to szybciej itd.
Układ jest wyposażony w ULN2003, wyjścia z Atmegi do ULNa są oznaczone jako Aliasy C1 - C4 (Cewki), Układ posiada dwa przyciski na płytce S1 i S2 umożliwiające sterowanie silnikiem bez pilota, posiada dwa wejścia na krańcówki X1 i X2. Diody, zieloną Ledz i czerwoną Ledc i wyjście na sterowanie silnikiem prądu stałego Dc1 i Dc2.
Idea działania:
Można sterować sterownikiem z przycisków na płytce. Po przyciśnięciu przycisku i przytrzymaniu przez 3s program wykonuje podprogram silnik_up, po ponownym wciśnięciu przycisku kończy działanie podprogramu. Po wciśnięciu drugiego przycisku program wykonuje podprogram Silnik_down. I tak samo. Po przytrzymaniu obu przycisków przez 5s, program wykonuje podprogram kalibracja_up odpowiedzialny za zapamiętanie komendy z pilota RC5 odpowiadającej za ruch silnika do góry. Najpierw miga zielona dioda LED i program czeka na wciśnięcie przycisku na pilocie, Potem odbywa się skok do podprogramu Kalibracja_down, i miga czerwona dioda i program czeka na wciśnięcie przycisku na pilocie odpowiedzialnego za ruch silnika w dół. Jeśli ten sam przycisk został wciśnięty jako silnik w górę i w dół to znopwu następuje przeskok do podprogramu kalibracja_up. Jeśli są różne przyciski to program wraca do programu głównego i po wciśnięciu odpowiedniego przycisku na pilocie załącza podprogram Silnik_up lub Silnik_down.
Mam nadzieje, że wszystko jasne. poniżej przedstawiam program:
$regfile = "m8def.dat"
$crystal = 8000000
Config Rc5 = Pind.2
Dim Adres As Byte
Dim Komenda As Byte
Dim Togglebit As Bit
Dim A As Byte , B As Byte
Dim C As Byte , D As Byte
Dim K As Byte , P As Byte
Ddrc = 255
Ddrb = 255
Portc = 0
Portb = 0
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.5 = Output
Config Pind.6 = Output
Ledz Alias Portd.5
Ledc Alias Portd.6
S1 Alias Pind.0
S2 Alias Pind.1
X1 Alias Portc.0
X2 Alias Portc.1
Dc1 Alias Portb.3
Dc2 Alias Portb.4
C1 Alias Portc.5
C2 Alias Portc.4
C3 Alias Portc.3
C4 Alias Portc.2
Set Portd.0
Set Portd.1
Enable Interrupts
Do
Begin:
P = 1
K = 1
If S1 = 0 And S2 = 0 Then
Wait 5
If S1 = 0 And S2 = 0 Then
Gosub Kalibracja_up
Waitms 500
End If
End If
Getrc5(adres , Komenda)
Togglebit = Komenda.7
Komenda = Komenda And &B01111111
If Adres <> 255 Then
If Komenda = C And Adres = A Then
Waitms 500
Gosub Silnik_up
Wait 1
End If
If Komenda = D And Adres = B Then
Waitms 500
Gosub Silnik_down
Wait 1
End If
End If
If S1 = 0 And S2 = 1 Then
Wait 3
If S1 = 0 And S2 = 1 Then
Waitms 200
Set Ledz
Waitms 300
Reset Ledz
Waitms 500
Gosub Silnik_up
End If
End If
If S1 = 1 And S2 = 0 Then
Wait 3
If S1 = 1 And S2 = 0 Then
Waitms 200
Set Ledc
Waitms 300
Reset Ledc
Waitms 500
Gosub Silnik_down
End If
End If
Loop
End
'*******************************************************************************
Kalibracja_up:
For K = 1 To 200
Set Ledz
Waitms 500
Reset Ledz
Waitms 500
Getrc5(adres , Komenda)
Togglebit = Komenda.7
Komenda = Komenda And &B01111111
If Adres <> 255 Then
A = Adres
C = Komenda
P = 1
Waitms 500
Set Ledz
Wait 2
Reset Ledz
Waitms 100
Gosub Kalibracja_down
End If
Next K
If K = 200 Then K = 1
'*******************************************************************************
Kalibracja_down:
For P = 1 To 200
Set Ledc
Waitms 500
Reset Ledc
Waitms 500
Getrc5(adres , Komenda)
Togglebit = Komenda.7
Komenda = Komenda And &B01111111
If Adres <> 255 Then
B = Adres
D = Komenda
Waitms 500
Set Ledc
Wait 2
Reset Ledc
Waitms 100
If C = D Then
Gosub Kalibracja_up
End If
Goto Begin
End If
Next P
If P = 200 Then P = 1
'*******************************************************************************
Silnik_up:
If X1 = 1 Then
Set Ledz
Waitms 500
Reset Ledz
Return
End If
Reset Ledc
Set Ledz
Set Dc1
Do
Getrc5(adres , Komenda)
Togglebit = Komenda.7
Komenda = Komenda And &B01111111
If Adres <> 255 Then
If Komenda = C And Adres = A Then
Reset Dc1
Reset Ledz
Return
End If
End If
Reset C1
Reset C2
Reset C3
Reset C4
Set C1
Waitus 100
Reset C1
Set C2
Waitus 100
Reset C2
Set C3
Waitus 100
Reset C3
Set C4
If S1 = 0 And S2 = 1 Then
Waitms 50
If S1 = 0 And S2 = 1 Then
Reset Dc1
Reset Ledz
Return
End If
End If
Loop Until X1 = 1
Reset Ledz
Reset Dc1
Return
'*******************************************************************************
Silnik_down:
If X2 = 1 Then
Set Ledc
Waitms 500
Reset Ledc
Return
End If
Reset Ledz
Set Ledc
Set Dc2
Do
Getrc5(adres , Komenda)
Togglebit = Komenda.7
Komenda = Komenda And &B01111111
If Adres <> 255 Then
If Komenda = D And Adres = B Then
Reset Dc2
Reset Ledc
Return
End If
End If
Reset C1
Reset C2
Reset C3
Reset C4
Set C4
Waitus 100
Reset C4
Set C3
Waitus 100
Reset C3
Set C2
Waitus 100
Reset C2
Set C1
If S1 = 1 And S2 = 0 Then
Waitms 50
If S1 = 1 And S2 = 0 Then
Reset Dc2
Reset Ledc
Return
End If
End If
Loop Until X2 = 1
Reset Ledc
Reset Dc2
ReturnPozdrawiam i z góry dzięki za wszelką pomoc i rady
Przeniesiono z Programowanie Ogólne. - arnoldziq