logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Komunikacja szeregowa - '51 - assembler - potrzebna pomoc

Lukis 02 Mar 2008 22:32 1136 5
REKLAMA
  • #1 4867456
    Lukis
    Poziom 11  
    Posty: 48
    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.

    
    $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.
  • REKLAMA
  • #2 4868040
    VanThor
    Poziom 19  
    Posty: 224
    Pomógł: 34
    Ocena: 5
    Lukis napisał:
    Sterowanie serwami rozwiązałem (jeśli ktoś ma lepszy pomysł to chętnie wysłucham), problem tkwi w komunikacji z komputerem...


    Moja propozycja to wykorzystanie timera z przerwaniem. W przerwaniu timera byłyby zmieniane stany wyprowadzeń sterujących serwami. Ponieważ standardowo przerwanie od portu szeregowego ma mniejszy priorytet to nie mogłoby ono wpływać na czas sterowania serwami. Z kolei podprogram obsługi przerwania timera byłby na tyle krótki, że żaden znak przesłany interfejsem szeregowym nie powinien być zgubiony.
  • REKLAMA
  • REKLAMA
  • #4 4870077
    Tuxlab
    Poziom 13  
    Posty: 54
    Pomógł: 3
    Ocena: 2
    Witam!

    Kolega VT ma rację, trzeba zmienić konstrukcję progamu tak, aby przy obsłudze przerwania nie dochodziło do zachwiania. Należy wykorzystać przerwanie z timera tak, aby było to główne przerwanie w systemie wumuszające zachowanie się innych układów. W obsłudze tego głównego przerwania powinna być prcedura obsługi serv oraz obsługa RSa. Przerwanie główne można odpaląć np. 50 razy na sekundę lub z mniejszą prędkością w zależności odz dzielnika. Na początek radzę spróbować z mniejszą prękością RSa np. 2400 lub 1200, układ powinien być wtedy stabilniejszy.

    pozdrowienia T
  • REKLAMA
  • #5 4873409
    Lukis
    Poziom 11  
    Posty: 48
    Dziękuje wszystkim za pomoc, przed przeczytaniem waszych postów skonsultowałem sie jeszcze z innym nauczycielem ze szkoły i powiedział mi to samo. Posłuchałem was :) i udało się, nie gubi danych serwo już nie drga w każdą stronę podczas ruchu i porusza sie prawie płynnym ruchem. Jak skończę projekt to przedstawię go na tym forum. Jeszcze raz dzięki za pomoc.
  • #6 4884406
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Można inaczej, priorytety zostawiasz tak jak miałeś na poczatku, ednak sygnalizujesz PCtowi odbiór każdego bajtu- w tedy nic sie nie pogubi
REKLAMA