Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM] KIT AVT5217 - numer karty sterującej i inne opcje.

piterek-23 19 Sep 2014 09:43 13740 147
  • #91
    piterek-23
    Level 33  
    atom1477 wrote:

    Ale z nim nie trzeba sobie radzić, On po prostu m działać.
    Jak nie działa to opisz objawy niedziałania bo inaczej jak Ci mamy pomóc?

    Wysylam polecenie, ale echo, zero reakcji na polecenia.
    atom1477 wrote:

    Znów to samo. Za krótka zmienna Rozkaz.

    "rozkaz" mam ustawiony na "8" zapomnialem tu zmienic.
  • Helpful post
    #92
    atom1477
    Level 43  
    A poprawiłeś tą linijkę z błędem o której mówiłem:
    Code: basic4gl
    Log in, to see the code

    ?
    Po jej poprawieniu działa.

    I jeszcze trzeba zainicjalizować zmienną In_pos na 1.
    Bez tego też będzie działało ale zgubi pierwsza ramkę.

    Code: basic4gl
    Log in, to see the code

    A i trzeba się upewnić że indexowanie tablic jest od 1 a nie od 0. Bo w nowszych wersjach BASCOMa chyba już jest (domyślnie) od 0. A w tym kodzie ma być od 1.
  • #93
    piterek-23
    Level 33  
    atom1477 wrote:
    A poprawiłeś tą linijkę z błędem o której mówiłem:
    Code: basic4gl
    Log in, to see the code

    ?
    Po jej poprawieniu działa.

    Zmieniłem tak:
    Code: basic4gl
    Log in, to see the code

    Ramkę próbuję wysyłać takimi sposobami:
    Code: xml
    Log in, to see the code
  • Helpful post
    #94
    atom1477
    Level 43  
    Poprawiłeś dobrze.
    Ale ten sposób wysyłania ramek to trochę nie teges.
    Nie możesz po prostu sprawdzić w opisie programu jak należy formatować dane? Bo domyślam się że to jakiś terminal jest.
    Jak nie to możesz zmienić program żeby akceptował normalne znaki.
    Np:
    Code: basic4gl
    Log in, to see the code

    I wtedy wysyłasz normalny tekst:
    "S1120"
    "S" - znak 83: zastępuje 23
    "1" - znak 49: zastępuje 1
    "2" - znak 50: zastępuje 2
    "3" - znak 51: zastępuje 3
    "0" - znak 48: zastępuje 0
    Ten ostatni znak ("0") jak widzę nie wykorzystujesz. Więc zamiast niego można dać enter:
    "S123"[Enter]
    Przy czym enter jako jeden znak. Jak będzie jako dwa znaki to trzeba wydłużyć ramkę o 1 znak:
    Code: basic4gl
    Log in, to see the code
  • #95
    piterek-23
    Level 33  
    atom1477 wrote:

    Ale ten sposób wysyłania ramek to trochę nie teges.

    A jak poprawnie się wysyła takie ramki i czym?
    atom1477 wrote:

    Nie możesz po prostu sprawdzić w opisie programu jak należy formatować dane? Bo domyślam się że to jakiś terminal jest.

    Na Wikipedi jest opisane tak:
    "Minicom to program do kontroli modemu oraz emulator terminala dla systemów uniksowych"
    atom1477 wrote:

    Jak nie to możesz zmienić program żeby akceptował normalne znaki.
    Np:
    Code: basic4gl
    Log in, to see the code

    I wtedy wysyłasz normalny tekst:
    "S1120"
    "S" - znak 83: zastępuje 23
    "1" - znak 49: zastępuje 1
    "2" - znak 50: zastępuje 2
    "3" - znak 51: zastępuje 3
    "0" - znak 48: zastępuje 0
    Ten ostatni znak ("0") jak widzę nie wykorzystujesz. Więc zamiast niego można dać enter:
    "S123"[Enter]
    Przy czym enter jako jeden znak. Jak będzie jako dwa znaki to trzeba wydłużyć ramkę o 1 znak:
    Code: basic4gl
    Log in, to see the code

    Naprawdę chyba jestem zbyt głupi, żeby to zrozumieć...
    Zmieniłem wszystko tak jak opisujesz, ale zero reakcji z karty I/O :(

    Ale tak teraz patrzę i wysyłając poprzez Bash "S111" tak naprawdę wysyłam "53 31 31 31 0D" czyli HEX? Jak dobrze rozumiem to wysyłam ramkę 5 bitową. Chcę używać adresów 01-32 czyli ramki mają być 5 czy 6 bitowe i z automatu przez Bash zakończone "CR"?

    /jakiś znak początku ramki/adres dwu cyfrowy/urządzenie/stan/automatyczne CR/

    Co to jest "48" tu:
    Code: basic4gl
    Log in, to see the code
  • Helpful post
    #96
    atom1477
    Level 43  
    piterek-23 wrote:
    atom1477 wrote:

    Ale ten sposób wysyłania ramek to trochę nie teges.

    A jak poprawnie się wysyła takie ramki i czym?
    atom1477 wrote:

    Nie możesz po prostu sprawdzić w opisie programu jak należy formatować dane? Bo domyślam się że to jakiś terminal jest.

    Na Wikipedi jest opisane tak:
    "Minicom to program do kontroli modemu oraz emulator terminala dla systemów uniksowych"

    Ciężko Ci pomóc bo nie odrabiasz pracy domowej.
    Ramki można poprawnie wysyłać na wiele sposobów.
    Jak to wysłać poprawnie u Ciebie to tylko Ty możesz dojść. Używasz jakiegoś programu więc zajrzyj do jego manuala i zobacz jak się formatuje dane aby wysłać to co się chce. Bo wpisywanie znaczków w ciemno nic nie da poza wysyłaniem danych w postaci najprędzej textu.

    piterek-23 wrote:

    Naprawdę chyba jestem zbyt głupi, żeby to zrozumieć...
    Zmieniłem wszystko tak jak opisujesz, ale zero reakcji z karty I/O :(

    Ale tak teraz patrzę i wysyłając poprzez Bash "S111" tak naprawdę wysyłam "53 31 31 31 0D" czyli HEX? Jak dobrze rozumiem to wysyłam ramkę 5 bitową. Chcę używać adresów 01-32 czyli ramki mają być 5 czy 6 bitowe i z automatu przez Bash zakończone "CR"?

    /jakiś znak początku ramki/adres dwu cyfrowy/urządzenie/stan/automatyczne CR/

    Trochę źle rozumiesz. Wysyłasz ramkę 5 bajtową.
    Adres może i dwucyfrowy ale wysyłasz bo jako liczba bajtowa. Czyli z zakresu 0...255. Więc wystarczy 1 bajt żeby przesłać adresy 01-32.
    Trzecia rzecz to ten HEX. Ramka nie jest HEX. Ramka po prostu jest. A HEX, DEC Czy BIN to tylko sposób interpretacji. Można powiedzieć że ramka jest jednocześnie w tych wszystkich formatach. A Ty tylko sobie wybierasz (myślowo) w jakim formacie ją odczytasz. S111 to po prostu to samo co 53 31 31 31 0D, tylko inaczej zapisane/zinterpretowane.
    Ramki mogą być oczywiście zakończone za pomocą CR.

    piterek-23 wrote:
    Co to jest "48" tu:
    Code: basic4gl
    Log in, to see the code

    Wcześniej żeby wysłać jakąś liczbę to wysyłałeś ja jako tekst. Czyli np. 15 to było "1" i "5". Czyli dwa znaki (dwa bajty w ramce). Znaki się łatwo wysyła. Ale cos tam Ci nie działało.
    Więc potem wprowadziliśmy wysyłanie bezpośrednie. Liczba = bajt w ramce.
    Czyli 15 to 15. Fajne ale ciężko to wysłać w tym terminalu jak widzę (ne ma do niego manuala albo nie wiem co).
    No to trzecia metoda. Wysyłanie za pomocą znaków.
    Żeby wysłać 0 to wysyłasz znak "0". A to nie to samo. Bo znak "0" ma kod ASCII równy 48 i taki bajt zostanie wysłany jak wyślesz text "0". Więc aby z tego zrobić liczbę 0 to trzeba odjąć od tego bajtu 48.
    Tu się trochę robi problem bo żeby wysłać coś większego niż 9 to trzeba dziwnych znaczków używać.
    Można albo przejść na litery (ale i tak ich nie będzie tyle ile potrzebujesz czyli 32), albo wysyłać po 2 znaczki. W sumie wrócimy tym sposobem do Twojej wersji. Ale może tym razem chociaż zadziała.
    Można by zrobić tak:
    Code: basic4gl
    Log in, to see the code

    Tylko BASCOM pewnie nie łyknie tak zaawansowanych obliczeń :D
    Więc wersja specjalnie pod niepełnosprytnego BASCOMa:
    Code: basic4gl
    Log in, to see the code

    Oczywiście wtedy Urz i Stan musi być na Buffer_in(4) i Buffer_in(5). Czyli cała ramka musi być dłuższa o 1 bajt.
  • #97
    piterek-23
    Level 33  
    Tej nocy praktycznie nie spałem, no i, no i się nie wyspałem...

    Zainstalowałem na Windows program "Realterm" a na Debianie udostępniłem port szeregowy (/dev/ttyACM0) poprzez ser2net i po kawałku analizowałem co się dzieje, a co się nie dzieje z kodem uC itd.
    Moja karta I/O w końcu ruszyła :)

    atom1477 wrote:
    Ciężko Ci pomóc bo nie odrabiasz pracy domowej.

    Staram się jak mogę, ale czasami samemu ciężko wpaść na niektóre rzeczy, czasami tak oczywiste, ze szok. Czasami pewne rzeczy ciężko wchodzą do głowy :(
    Ale tak to jest jak się jest samoukiem...
    @atom1477
    wielki szacun za cierpliwość do takiej marudy jak ja ;)

    Kod wygląda teraz tak:
    Code: basic4gl
    Log in, to see the code

    Kod zajmuje 83%

    Mam jeszcze parę pytań z tym związane:
    1. Czy teraz wszystko jest OK?
    2. Czy da się jeszcze coś poprawić?
    3. O co chodzi w kodzie z "Ramkatimeout = 0"?
    4. Nie jestem też pewny tego odbioru ramki:
    a. "Buffer_in" mam 6
    b. wysyłam:
    /znak"S"/adres/adres/urządzenie/stan/CR/
    5. Czy warto dołożyć CRC?
    6. Jakiej prędkości docelowo używać? Chciałbym zbudować konwerter podany przez@atom1477 w tym temacie, kilka postów wyżej.
  • #98
    atom1477
    Level 43  
    1. Nie bardzo. Buffer_in(2) i Buffer_in(3) u Ciebie są po prostu sumowane. A miały być składane w liczbę dwucyfrową. Czyli gdzieś po drodze musi być mnożenie przez 10.
    2. No to co wyżej na pewno :D
    3. To jakaś pozostałość po moim bardziej rozbudowanym kodzie. Możesz to wywalić.
    4. No mniej więcej tak.
    5. Warto.
    6. Może być dowolna w jakimś zdroworozsądkowym zakresie. Powiedzmy od 9600 do 128000baud.
  • #99
    piterek-23
    Level 33  
    atom1477 wrote:
    1. Nie bardzo. Buffer_in(2) i Buffer_in(3) u Ciebie są po prostu sumowane. A miały być składane w liczbę dwucyfrową. Czyli gdzieś po drodze musi być mnożenie przez 10.

    Już poprawione, tak jak podałeś wcześniej. Błąd kopiuj/wklej :)
    atom1477 wrote:

    4. No mniej więcej tak.

    Dlaczego mniej-wiecej?
    atom1477 wrote:

    5. Warto.

    A możesz powiedzieć jak to zrobić, czy mój poziom (mega początkujący) tego nie ogarnie?
    atom1477 wrote:

    6. Może być dowolna w jakimś zdroworozsądkowym zakresie. Powiedzmy od 9600 do 128000baud.

    Zrobię konwerter to będę testował.
  • #100
    atom1477
    Level 43  
    [quote="piterek-23"]
    atom1477 wrote:
    atom1477 wrote:

    4. No mniej więcej tak.

    Dlaczego mniej-wiecej?

    Bo nie wiadomo jak to konkretnie wydląda. Więc i konkretnie nie można odpowiedzieć.

    piterek-23 wrote:
    atom1477 wrote:

    5. Warto.

    A możesz powiedzieć jak to zrobić, czy mój poziom (mega początkujący) tego nie ogarnie?

    Było w pierwszym kodzie który podałem. Ale pasowało by to zamienić n a sumę kontrolną. Nie mniej jednak ciężko Ci będzie liczyć tą sumę jak to wysyłasz z terminala wpisując dane z palca, więc pewnie lepiej tego nie robić. Twoja decyzja.
  • #101
    piterek-23
    Level 33  
    atom1477 wrote:
    Było w pierwszym kodzie który podałem. Ale pasowało by to zamienić n a sumę kontrolną. Nie mniej jednak ciężko Ci będzie liczyć tą sumę jak to wysyłasz z terminala wpisując dane z palca, więc pewnie lepiej tego nie robić. Twoja decyzja.

    Właśnie bardziej mi chodziło o CRC od strony mastera (PC) Dam sobie po prostu spokój bo to nie na mój poziom wiedzy.

    Ale mam jeszcze dwa pytanka(chyba już ostatnie w tym temacie :))
    1. W jaki sposób i na jakiej podstawie wyliczyć czas przed wysłaniem "on", "off" i po wysłaniu?
    2. Czy przejdzie taki myk, że po naciśnięciu przez dłuższy czas guzika (wiem jak zrobić krótkie i długie naciśniecie guzika-dwie różne rzeczy się wykonają) karta wyśle ramkę danych? Czyli jeden slave wyśle drugiemu slave "rozkaz"/ramkę danych.
  • #103
    piterek-23
    Level 33  
    Po większych testach wychodzi na to, że wszystko działa jak należy :)

    Bardzo, ale to bardzo wszystkim dziękuję za pomoc w tym temacie.
    atom1477 wrote:
    2. Przejdzie.

    Jak najbardziej działa. Jeden salve potrafi sterować drugiego.
  • #104
    piterek-23
    Level 33  
    Witam ponownie,

    Muszę znów prosić o pomoc odnośnie moich kart RS485.
    Do dnia dzisiejszego wszystko działa jak należy-steruje sobie połową chaty (światło, gniazdka, piec itp. itd.) problem się pojawił gdy postanowiłem sterować drugą połową domu, czyli doprowadzić "projekt" do końca.
    Kupiłem sobie Raspberry Pi model B+ i to właśnie za pomocą Raspberry chciałbym sterować tym wszystkim. Problem polega na tym iż mogę włączyć i wyłączyć przekaźniki, ale gdy odpytuje karty o stan przekaźników to odpowiadają tylko raz na jakiś czas :(
    Na Raspberry mam system Raspbian Whezzy. Konwerter USB <-> RS485 jaki posiadam to:
    [BASCOM] KIT AVT5217 - numer karty sterującej i inne opcje.
    PC z systemem Debian Whezzy, konweter z obrazka i prędkość 115200 wszystko działa jak należy.
    Raspberry Pi z systemem Raspbian Whezzy, konweter z obrazka i prędkość 115200 nie chce za każdym razem podawac stanu przekaźników.
    Gdzie szukać problemu? Zmiana prędkości (od 4800 do 115200) nic nie daje :(
  • #105
    piterek-23
    Level 33  
    Wyniki
    Code:
        
    
    #stty -F /dev/ttyUSB0 -a

    wyglądają na takie same.

    PC
    Code:

    speed 115200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

    Raspberry
    Code:

    speed 115200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke


    Ogólnie mówiąc to zmienia się tylko sprzęt PC -> Raspberry. Jeden i drugi system to Debian. Ten sam konwerter USB -> RS485. Te same karty przekaźników.
    Jedno mnie jeszcze zastanawia, czy zasilanie maliny ma tu znaczenie? Zasilam Rpi teraz zasilaczem 5V, 1A. Mam w domu jeszcze zasilacz 5V, 2,5A, ale muszę kupić wtyczkę mikro USB.
    Czy jest możliwe, że malina jest za słaba i nie daje rady tak szybko wysyłać zapytań i odbierać odpowiedzi?
  • #106
    atom1477
    Level 43  
    piterek-23 wrote:
    Czy jest możliwe, że malina jest za słaba i nie daje rady tak szybko wysyłać zapytań i odbierać odpowiedzi?

    Układ może nie. Ale kod może być słaby i nie dawać rady mimo odpalenia go na mocnym procku.
  • #113
    piterek-23
    Level 33  
    aaa... myślałem, że mówisz o kartach przekaźników.
    skrypt.sh
    Code: bash
    Log in, to see the code

    włącz
    Code: bash
    Log in, to see the code

    wyłącz
    Code: bash
    Log in, to see the code

    stan
    Code: bash
    Log in, to see the code


    Wszystko jest dokładnie jest takie samo-sprzęt, skrypty, konwerter, kable itd.
    Zmienia się tylko (i aż) PC Debian Whezzy na Raspberry Raspbian Whezzy
  • #114
    doktor_piotr
    Level 11  
    Na mój gust odstęp czasowy - rs485 potrzebuje ok 15ms na zmiane statusu. Z tego co pamiętam a do tego trzeba doliczyć czas na zebranie danych atmegi (tak z ciekawości np odpytane parunastu czujników może zabrać nawet 1 sek) a to trzeba także doliczyć do czasu tych 15ms
  • #115
    piterek-23
    Level 33  
    Jak dobrze rozumiem to mówisz o czasach w kodzie karty?
    Zapomniałem wspomnieć, że zmieniłem parę rzeczy w kodzie odnośnie RS485
    było:
    Code: basic4gl
    Log in, to see the code

    jest:
    Code: basic4gl
    Log in, to see the code
  • #116
    doktor_piotr
    Level 11  
    Dokładnie wywaliłeś wait. Rs485 działa w trybie half więc jak jeden nadaje to drugi słucha i na odwrót oczywiście z przerwą na zmianę stanu magistrali więc jeżeli nadasz coś i za szybko będziesz chciał odebrać to nie dostaniesz nic bo twój program odwoła się do bufora magistrali w którym nic nie będzie i zakończy działanie a odpowiedz nadejdzie za chwile i bufor może być w tym czasie już zapełniony danymi. Miałem podobny problem w bash na cubieboard (podobne coś jak malina) nadawałem i z odbioru nici dopiero otwarcie osobnego okienka konsoli i tam nadawałem a na drugim słuchałem i okazało się - na oko że odpowiedz przychodzi z lekkim opóźnieniem bo mikrokontroler musi zebrać wiadomości o stanie przekaźników a potem nadać a to trwa chwilkę. Rozwiązałem problem stosując program w C.
    Otwieram port
    nadaję
    zamykam port
    otwieram port
    czekam 1 - 5 sek
    odbieram dane z bufora
    zamykam potrt
    i to działa
    próbowałem dać czasy mniejsze jak 1 s i była kiszka raz dane były raz nie więc sugeruje podobny algorytm.
  • #117
    piterek-23
    Level 33  
    A pomógłbyś mi w przepisaniu mojego programu w Bash na C?
    Bash, Bascom jeszcze jakoś troszkę ogarniam, ale o C to nie bardzo mam pojęcie :(
  • Helpful post
    #118
    doktor_piotr
    Level 11  
    Sam się dopiero uczę. A le co mogę to pomogę.

    Z tego co piszesz w pierwszym poście to twoje przełączniki działają na podobnej zasadzie jak u mnie więc może tobie podejdzie moja wersja programu.

    Włącza się poszczególny przekaźnik komendą złożoną ze znaków - które sa parsowanie przez mikrokontroler u ciebie 0111 a u mnie 101.001.001 w sumie to samo.

    Jeżeli zgadzasz się z tym zrób na początek eksperyment.

    1. Powyłączaj wszystkie programy obsługujące twoje karty (mówimy oczywiście o linuxie)
    2. odpal sobie dwie konsole ssh
    3. ustaw sobie prędkość stty -F /dev/ttyUSB0 19200 raw -icrnl -echo clocal u mnie jest 19200
    4.w jednej konsoli wpisz "cat < /dev/ttyUSB0" to będzie twój nasłuch
    5. w drugiej konsoli wydawaj komendy echo "0111" > /dev/ttyUSB0 czy jak tam jest u ciebie
    6. Na pierwszej konsoli powinieneś mieć odpowiedz z kontrolera
  • #119
    piterek-23
    Level 33  
    Dokładnie mówiąc to poprzez konsole steruje przekaźnikami tak:
    włącz:
    Code: bash
    Log in, to see the code

    wyłącz:
    Code: bash
    Log in, to see the code

    stan:
    Code: bash
    Log in, to see the code

    Gdzie:
    S-znak specjalny rozpoczynający ramkę danych (zawsze taki sam)
    01-pierwsze dwie cyfry to numer karty
    1-trzecia cyfra to numer przekaźnika (na karcie mam 8 przekaźników)
    0,1,2-czwarta cyfra to polecenie co program ma zrobić z przekaźnikiem. 0 wyłącz, 1 włącz, 2 podaj aktualny stan

    EDIT
    Zaraz skoczę do sklepu i kupię kartę SD, postawię nowy system i będę próbował zrobić to wszystko na "gołym" systemie. Tego narazie nie chciał bym za bardzo psuć :)
  • #120
    doktor_piotr
    Level 11  
    Spoko rób jak chcesz w sumie się nic nie zmienia z tego co napisałem tylko w pkt 5
    rób jak masz czyli echo -ne "S0111\r" > /dev/ttyUSB0 to tak rób

    Czyli wydaj sobie po kolei komendy z palca
    echo -ne "S0110\r" > /dev/ttyUSB0

    potem
    echo -ne "S0111\r" > /dev/ttyUSB0
    potem

    echo -ne "S0112\r" > /dev/ttyUSB0

    zobacz co ci się pojawi w 2 okienku po wydaniu komendy i spróbuj oszacować na oko czas odpowiedzi