Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom avr - Usart wysyłanie i odbieranie ramek.

nouki 28 Mar 2014 17:28 2577 10
  • #1 28 Mar 2014 17:28
    nouki
    Poziom 25  

    Witam.

    Niestety potrzebuje znów pomocy - porady.

    Zakupiłem wyświetlacz prezentowany już na forum....
    O ile jeden z Kolegów pokusił się o napisanie bibliotek na c ( które działają) o tyle ja muszę niestety zrobić to na bascomie.

    Potrzebuje wysyłać dane w formacie 50 05 05 82 01 10 00 64.
    50 05 - nagłówek ramki
    05 - ile danych
    82 01 10 00 64 - dane

    wysyłam je

    Code:

    Print Chr(&H50);
    Print Chr(&H05);
    Print Chr(&H04);
    Print Chr(&H80);
    Print Chr(&H03);
    Print Chr(&H00);
    Print Chr(&H1a);

     


    Polecenie działa ale jest niewygodne zwłaszcza jeśli ostatnia wartość (64) ma się zmieniać od 0 do 64
    Czy Koledzy znają jakąś bardziej przystępną formę?

    Pytanie 2 jak najlepiej odebrać dane w takiej samej formie co wysyłam.
    wartość danych do odebrania nie zawsze jest taka sama( długość) i decyduje o tym wartość podana po nagłówek ramki.

    Pozdrawiam.

    P.s pełen opis transmisji znajduje się na stronie http://www.whiteelectronics.pl/demo_uart.php

    0 10
  • #2 28 Mar 2014 17:37
    Mateusz@
    Poziom 17  

    Printbin

    Do odbieranie zastosuj przerwanie od uarta.

    0
  • #3 28 Mar 2014 17:59
    nouki
    Poziom 25  

    Działanie polecenia zbytnio się nie różni od przedstawionego .
    Daje możliwość wysyłania tablicy - ale tablica nie zawsze ma tyle samo elementów co moim zdaniem stanowi problem.
    Nie znam aż tak bascoma więc pytam.

    Proszę o przykłady.

    Dziękuję.

    0
  • #4 29 Mar 2014 12:44
    Mateusz@
    Poziom 17  

    Piszesz dwie instrukcje printbin i w zależności jaką ramkę chcesz wysłać wysyłasz albo jedną albo drugą.

    0
  • #5 31 Mar 2014 00:12
    nouki
    Poziom 25  

    Witam.

    Nie wiem czy Kolega zaglądał do linka obsługi wyświetlacza?
    Jeśli miał bym robić jak Kolega radzi to samych ramek, jakie obecnie będę używał jest ok 100 więc... Połowa z nich to dane np. z czujnika gdzie dane(w jednym tylko adresie) zmienić się mają, co sekundę na wyświetlaczu od 0 do 100.


    Podaj przykłady ( krótkie instrukcję kodu) do wysyłania i odbierania, bo to, co piszesz można doczytać w pomocy.



    Interesuje mnie też obierane ".. od przerwania jak piszesz"
    Ale jak ustalić jaka ramka przyszła i co w niej istotne np.

    50 05 05 82 01 10 00 64.
    Jak ustalić że po nagłówku ramki 50 05 będzie 5 danych z których interesuje mnie 01 10 i wartość dla tego adresu 00 64, innym razem będą tylko 3 bądź 2 dane.


    Pozdrawiam.

    Nie jest to takie proste zobacz jak sprawa ma się w języku c
    https://www.elektroda.pl/rtvforum/viewtopic.ph...ght=dgus&sid=0bbff52f50fe2ea27af6c050178363da

    0
  • #6 31 Mar 2014 23:56
    tehaceole

    Poziom 28  

    nouki właśnie chciałem zaproponować Ci lekturę mojej biblioteki do której link podałeś. Wbrew pozorom biblioteka jest baaardzo prosta. Przeanalizuj sobie jak jest zbudowana. Wydaje mi się, że większość mechanizmów da się z powodzeniem zastosować w bliźniaczej formie w Bascomie.

    Dodano po 4 [minuty]:

    nouki napisał:
    50 05 05 82 01 10 00 64.
    Jak ustalić że po nagłówku ramki 50 05 będzie 5 danych z których interesuje mnie 01 10 i wartość dla tego adresu 00 64, innym razem będą tylko 3 bądź 2 dane.

    W mojej libce działa to tak:
    - w przerwaniu rozpoznaję początek ramki
    - gdy rozpoznm początek ramki to następny bajt jaki nadejdzie oznacza ilość bajtów jakie zostaną przysłane (zapamiętuję tę wartość jako tmp)
    - po tym po prostu pakuję nadchodzące bajty do bufora tymczasowego dekrementując zapamiętany licznik danych
    - gdy licznik się wyzeruje ustawiam flagę odebrania kompletnej ramki

    - flaga badana jest w pętli głównej
    - gdy flaga jest ustawiona to wystarczy tylko wyłuskać dane z bufora tymczasowego i przepisać do zmiennych

    Ja uprościłem sobie obsługę pomijając możliwość wymiany zmiennych 32 bitowych. Opisałem to zresztą w artykule.

    0
  • #7 01 Kwi 2014 13:21
    nouki
    Poziom 25  

    Witam.

    Poczytałem i napisałem takie coś.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $crystal = 8000000
    $regfile = "m1284def.dat"

    $baud = 19200

    Dim A As Byte
    Dim B As Byte
    Dim C As Byte

    Dim Flaga As Byte

    Config Serialin = Buffered , Size = 20 ,
    Enable Interrupts

    Wait 1
    Print " test "

    Do
    If Flaga = 1 Then
    Print "flaga"
    Flaga = 0
    End If

    If _rs_bufcountr0 >= 6 Then

    Inputhex A , B , C
    Print "a: " ; A ; " ,b: " ; B ; " c: " ; C ;
    Clear Serialin
    End If
    Waitms 50
    Loop

    End

    Serial0bytereceived:
    Flaga = 1
    Return

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Niestety nic się nie dzieje - terminal wyświetla napis test i na tym koniec.
    Pewnie coś źle zrozumiałem bądź doczytałem.

    Pozdrawiam

    0
  • #8 01 Kwi 2014 20:49
    zumek
    Poziom 39  

    nouki napisał:
    ...Niestety nic się nie dzieje - terminal wyświetla napis test i na tym koniec...

    A co spodziewałeś się zobaczyć w terminalu, bo chyba nie słowa "flaga" :?:

    0
  • #9 01 Kwi 2014 22:09
    nouki
    Poziom 25  

    Witam.
    Program sklecony jest z porad znalezionych na forum.

    Bardziej spodziewałem się zobaczyć "Print "a: " ; A ; " ,b: " ; B ; " c: " ; C ; "

    Przeglądałem wiele postów w wielu miejscach, helpa nie znalazłem odpowiedzi więc pytam ( może źle szukałem).
    Więc proszę o poradę.
    Chce odebrać ramkę do 8 znaków i wpisać do a,b,c,d,e,f,g,h.

    nouki

    0
  • #10 07 Kwi 2014 14:11
    nouki
    Poziom 25  

    Witam.

    Z małymi pomocami mam taki kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    $crystal = 8000000
    $regfile = "m1284def.dat"


    $baud = 19200



    Dim W As Byte

    Config Timer2 = Timer , Prescale = 256

    Config Portb.3 = Output
    Reset Portb.3

    Config Portb.4 = Output
    Reset Portb.4


    Dim Buffer_in(32) As Byte
    Dim In_pos As Byte

    Dim Dana As Byte
    Dim Poldana As Long
    Dim Polowa As Byte
    Dim Wywal_bajt As Byte

    Dim Ramkatimeout As Word

    Dim I As Byte
    Dim J As Byte
    Dim Danaa(32) As Byte



    Enable Interrupts
    On Urxc Przerwanie_od_rxd
    Enable Urxc
    On Timer2 Przerw
    Enable Timer2


    Wait 1
    Print "gfhg"



    Do

    Loop


    Przerwanie_od_rxd:
    Inputhex Poldana


    If In_pos > 7 Then
    Set Portb.4
    In_pos = 1
    End If

    If Polowa = 0 Then
    Dana = Poldana - 48
    Dana = Dana * 16

    Polowa = 1
    Else
    Poldana = Poldana - 48
    Dana = Dana + Poldana

    Buffer_in(in_pos) = Dana

    Incr In_pos

    Polowa = 0
    End If

    Wywal_bajt = 0

    If In_pos >= 4 Then 'Jeśli są co najmniej 4 bajty (dwa startowe, długość ramki i jakaś dana)
    If Buffer_in(1) = &H05 Then 'Jeżeli pierwszy bajt startowy jest dobry
    If Buffer_in(2) = &H50 Then 'Jeżeli drugi bajt startowy jest dobry
    If In_pos >= Buffer_in(3) Then 'Jeżeli mamy już odpowiednią ilość bajtów


    Danaa(1) = Buffer_in(1)
    Danaa(2) = Buffer_in(2)
    Danaa(3) = Buffer_in(3)
    Danaa(4) = Buffer_in(4)
    Danaa(5) = Buffer_in(5)
    Danaa(6) = Buffer_in(6)
    Danaa(7) = Buffer_in(7)

    Print ; Danaa(1) ; ; Danaa(2) ; ; Danaa(3) ; ; Danaa(4) ; ; Danaa(5) ; ; Danaa(6) ; ; Danaa(7) ; " "
    Poldana = 0

    End If 'Jeszcze za mało bajtów. Wychodzimy i czekamy na więcej
    Else 'Zły początek ramki. Wywalamy 1 bajt z ramki
    Wywal_bajt = 1
    End If
    Else 'Zły początek ramki. Wywalamy 1 bajt z ramki
    Wywal_bajt = 1
    End If
    End If

    If Wywal_bajt = 1 Then
    In_pos = In_pos - 1 'Zmniejszamy wskaźnik bufora o 1

    For I = 1 To In_pos 'Przesuwamy bufor o 1 bajt
    J = I
    Incr J

    Buffer_in(i) = Buffer_in(j)
    Next
    End If

    Ramkatimeout = 0
    Return

    Przerw:
    Ramkatimeout = Ramkatimeout + 1

    If Ramkatimeout >= 70 Then
    Ramkatimeout = 70
    Polowa = 0
    End If
    Return
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Niestety też nie działa proszę o pomoc w znalezieniu błędu.
    Odbiera jedną ramkę i wysyła do terminala a następnej już nie wysyła (czyli nie odbiera)

    Pozdrawiam

    0
  • #11 28 Cze 2014 13:36
    nouki
    Poziom 25  

    Witam.

    Jeśli ktoś pokusi się o zakup panela operatorskiego DGUS_SDK i poszukuje komunikacji pod Bascoma proszę pisać.

    Pozdrawiam.

    0