Witam
Mam pewien problem, potrzebuje napisać sterownik do 6 serw. Sterowanie serwami rozwiązałem (jeśli ktoś ma lepszy pomysł to chętnie wysłucham), problem tkwi w komunikacji z komputerem, sama komunikacja działa, dane wysyłane są raczej poprawnie. Jeżeli obsługuje RS'a w przerwaniach to serwa zmieniają położenie tak jak należy, ale strasznie przy tym drgają, przyczyna jest wywołanie obsługi przerwania, które wydłuża czas trwania impulsu sterującego serwem. Chcąc to wyeliminować postanowiłem co około 2ms (tyle trwa najdłuższy impuls jednego serwa) sprawdzać czy coś nadeszło do bufora. Ale wtedy gubi część danych i zamiast sterować serwem 1 steruje serwem 2 i tak co chwile innym. Może ktoś z was ma jakiś sprawdzony system komunikacji, który nada sie również w tym przypadku? Dane mogę wysyłać z komputera paczkami np po 6 serw po kolei albo jedno serwo co pętle, albo jeszcze inaczej.
Wszelka pomoc albo wskazówki mile widziane.
Mam pewien problem, potrzebuje napisać sterownik do 6 serw. Sterowanie serwami rozwiązałem (jeśli ktoś ma lepszy pomysł to chętnie wysłucham), problem tkwi w komunikacji z komputerem, sama komunikacja działa, dane wysyłane są raczej poprawnie. Jeżeli obsługuje RS'a w przerwaniach to serwa zmieniają położenie tak jak należy, ale strasznie przy tym drgają, przyczyna jest wywołanie obsługi przerwania, które wydłuża czas trwania impulsu sterującego serwem. Chcąc to wyeliminować postanowiłem co około 2ms (tyle trwa najdłuższy impuls jednego serwa) sprawdzać czy coś nadeszło do bufora. Ale wtedy gubi część danych i zamiast sterować serwem 1 steruje serwem 2 i tak co chwile innym. Może ktoś z was ma jakiś sprawdzony system komunikacji, który nada sie również w tym przypadku? Dane mogę wysyłać z komputera paczkami np po 6 serw po kolei albo jedno serwo co pętle, albo jeszcze inaczej.
$MOD52
$DEBUG(asm.aof)
;********************;
;PROGRAM ;
;********************;
org 00H
LJMP Init
;********************;
;WEKTORY PRZERWAŃ ;
;********************;
org 23H
LJMP intRS232
;********************;
;INIT ;
;USTAWIENIA RS232 ;
;********************;
org 30H
Init:
MOV SCON,#01000000B ;TRYB 1,
ORL TMOD,#00100000B ;T1, 8BIT, AUTOMATYCZNE PRZEŁADOWANIE
ORL PCON,#80H ;SMOD = 1
MOV TH1,#0FAH ;PREDKOŚĆ 9600
SETB TR1 ;START LICZNIKA T1
SETB ES ;START UART'u
SETB EA ;ODBLOKOWANIE GLOBALNYCH PRZERWAŃ
SETB REN ;ODBLOKOWANIE ODBIORNIKA
LJMP WARTOSCI
org 50H
;********************;
;POCZĄTKOWE WARTOŚCI ;
;********************;
WARTOSCI:
MOV R0,#69H
MOV 69H,#154
MOV 68H,#154
MOV 67H,#154
MOV 66H,#154
MOV 65H,#154
MOV 64H,#154
LJMP BUFOR
;********************;
;MAIN PĘTLA GŁÓWNA ;
;********************;
MAIN:
;********************;
;OBSŁUGA SERVA1 ;
;********************;
MOV R2,#3H
SETB P2.0
SERVO1:
DJNZ R2,$
MOV R2,#3H
DJNZ 59H,SERVO1
CLR P2.0
;********************;
;OBSŁUGA SERVA2 ;
;********************;
MOV R2,#3H
SETB P2.1
SERVO2:
DJNZ R2,$
MOV R2,#3H
DJNZ 58H,SERVO2
CLR P2.1
;********************;
;OBSŁUGA SERVA3 ;
;********************;
MOV R2,#3H
SETB P2.2
SERVO3:
DJNZ R2,$
MOV R2,#3H
DJNZ 57H,SERVO3
CLR P2.2
;********************;
;OBSŁUGA SERVA4 ;
;********************;
MOV R2,#3H
SETB P2.3
SERVO4:
DJNZ R2,$
MOV R2,#3H
DJNZ 56H,SERVO4
CLR P2.3
;********************;
;OBSŁUGA SERVA5 ;
;********************;
MOV R2,#3H
SETB P2.4
SERVO5:
DJNZ R2,$
MOV R2,#3H
DJNZ 55H,SERVO5
CLR P2.4
;********************;
;OBSŁUGA SERVA6 ;
;********************;
MOV R2,#3H
SETB P2.5
SERVO6:
DJNZ R2,$
MOV R2,#3H
DJNZ 54H,SERVO6
CLR P2.5
;********************;
;OPUŹNIENIE 8MS ;
;********************;
MOV R2,#229
MOV R3,#16
OPUZNIENIE1:
DJNZ R2,$
MOV R2,#229
DJNZ R3,OPUZNIENIE1
;********************;
;BUFOR PORTU RS232 ;
;********************;
BUFOR:
MOV 59H,69H
MOV 58H,68H
MOV 57H,67H
MOV 56H,66H
MOV 55H,65H
MOV 54H,64H
LJMP MAIN
;********************;
;KONIEC PETLI GŁÓWNEJ;
;********************;
;********************;
;OBSŁUGA RS232 ;
;********************;
intRS232:
clr RI
MOV A,SBUF
MOV @R0,A
MOV A,R0
CLR C
SUBB A,#64H
DEC R0
JNZ PETLA1
MOV R0,#69H
PETLA1:
RETI
END
Wszelka pomoc albo wskazówki mile widziane.