[BASCOM][M16]Przesylanie wielu zmiennych WORD via UART.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 23 cze 2009, 21:33

Tak,właśnie... Potrzebowałem trochę czasu do namysłu i po prywatnej konsultacji z kolegą m@rek wybrałem jego metodę.Myślę ze to najbardziej skuteczna i w miarę szybka bo to tylko operacje na bitach.

To może spróbuje jeszcze raz ,prościej opisać jego metodę dla potomnych : P

By wysłać ileś zmiennych bajtowych musimy:

-Podzielić bajt na pól tj MSB i LSB
Np: 01010101 nakładamy maskę na cześć LSB
Procedura w BASCOMie to

Kod: Zaznacz cały

01010101 and 00001111=00000101
i na MSB

Kod: Zaznacz cały

01010101 and 11110000=01010000
-Do pierwszych 4 bitów podzielonego bajta dodajemy identyfikacje na 4 bitach, w ten sposób mieścimy się w buforze transmisji UART'a

-Do następnej części bajta tez dodajemy ten sam kod identyfikacji

-Wysyłamy dwa nasze bajty,czyli już z naszego jednego bajta wyszły dwa ale z identyfikacja do każdej następnej paczki incrementujemy identyfikacje.

W taki sposób możemy wysłać 16 bajtów- co mi wystarcza.

Możliwe ze ktoś to wykorzysta i poda jeszcze lepszy ,prostszy sposób.

Dziękuje wszystkim za dotychczasowe odpowiedzi,na elektrodzie mój temat został pochłonięty przez inne i spadł gdzieś na dol bez słowa odpowiedzi : /

Pozdrawiam Mictronic!

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 23 cze 2009, 21:56

To jest tylko czubek góry lodowej.
i tak to będziesz musiał załadować jakoś do uarta i wysłać a najlepszą metoda(według mnie) na to jest PRINTBIN ale nie print bin na zasadzie jedno pod drugim
czyli
PRINTBIN cos tam
PRINTBIN cos tam +1
PPRINTBIN cos tam +N
tylko właśnie tablica i wysyłana w całości za jednym razem jako ciąg byteów.
To akurat mam sprawdzone działa na 100%
Printbin tablic(1);8


W moim kodzie możesz zobaczyć ze tak naprawdę za całe wysyłanie jest odpowiedzialna tylko jedna linijka kodu

Kod: Zaznacz cały

Select Case Channel

Case 0 :

   If Osy <> Przetwornik Then

          Osy = Przetwornik
          Flag1 = 1
   Serial_tx(1) , 1 = Osy ******* to wpisuje pierwszą daną *********

   End If

Case 1 :

    If Osx <> Przetwornik Then
            Osx = Przetwornik
             Flag2 = 1
    Serial_tx(2) , 1 = Osx  ******** to drugą ***********************

   End If

End Select

Next Channel
Return
'****************************-Send-*********************************************
Send:
   If Flag1 = 1 Or Flag2 = 1 Then
 ***** Printbin Serial_tx(1) ; 6*******to jest t co wysyla wszystkie dane *************
      Flag1 = 0
      Flag2 = 0
   End If

Return
jak narazie do tablicy wpisuje dane tylko do 2 serv a 4 pozostałe miejsca są puste
Flagi i różnice mam dodane tylko poto żeyby nie wysyłało tych danych jak szalone bez sensu tylko w momencie jak wartosc pobrana z przetwornika ADC różni się od poprzedniej


Pozdrawiam i czekam na kod :wink:

Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 11 lip 2009, 18:40

Witam,jednak wykorzystałem pomysł Pikaczu tj printbin inputbin.I działa,ale nie umiem nadal wysłać zmiennych dwu bajtowych -word!

Taki kod:

Nadajnik:

Kod: Zaznacz cały

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Dim A As Word
Dim B(2) As Byte
Do
A = 12345
B(1) = Low(a)
B(2) = High(a)

Printbin B(1) , 2
Waitms 100

Loop
Odbiornik:

Kod: Zaznacz cały

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Dim A As Word
Dim B(2) As Byte
Do

Inputbin B(1) , 2
A = Makeint(b(2) , B(1))
Locate 1 , 1
Lcd A

Loop
Na lcd na przemian latają wartości,niewiadomo co się dzieje,nieraz jak wysyłam 256 to wychodzi 156 i tego typu cyrki,jak to napisać proszę jeszcze o pomoc bo ręce opadają :/

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 12 lip 2009, 10:36

Cześć właśnie wróciłem z urlopu więc bede mógł ci troszkę pomóc.
Daj mi trochę czasu (muszę się rozpakować itp) to wkleję jakiś kod który może po części Ci pomoże.
Od razu mogę dać Ci wskazówki dodaj bufor na wysyłanie i na odbiór, zmniejsz prędkość będzie łatwiej testować.

Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 12 lip 2009, 10:47

A co daje bufor wejściowy?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 12 lip 2009, 11:06

Chodzi o to ze jak twój program będzie sobie latał w kółko coś tam robił i jak ty coś wyślesz a on akurat nie będzie w tym momencie na lini kodu inputbin twoje dane po prostu nie zostaną odczytane. masz tu przykład

Kod: Zaznacz cały

$regfile = "M128def.dat"
$crystal = 16000000                                         'Kwarc
 $baud = 9600                                               'predkosc transmisji


Dim A As String * 1

 'skompiluj z tymi liniami  za remarkowanymi najpierw
'******************************************************************************
'Config Serialin = Buffered , Size = 20

'Enable Interrupts
'******************************************************************************



Print "Start"
Do
If Ischarwaiting() = 1 Then
      A = Waitkey()
      Print A
   End If

   Waitms 100                                              
Loop
End
'odpal symulator jak bedziesz wscikał klawisze szyko czesc znakow poprostu
'sie nie wyswielti


' potem zrób druga kompilacie i usun REM z lini config serial in i enable interrupts


[ Dodano: 2009-07-12, 12:21 ]
a jak dasz bufor wtedy znak będzie odebrany i trafi do bufora

[ Dodano: 2009-07-12, 12:41 ]
przerobiłem twoją część nadawcza

musi działać

Kod: Zaznacz cały

$sim    '----tylko do testu na kompie
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Dim A As Word
Dim B(2) As Byte

Config Serialout = Buffered , Size = 6
Enable Interrupts
Enable Utxc


Do
A = 12345
B(2) = Low(a)
B(1) = High(a)

Printbin B(1) ; 2
'              ^
'              I
'              I
'              I
'              TUTAJ

' Zawsze jak używasz prinbin użyj Tego ";"

' w częsci odbiorczej po inputbin dajesz ","
Wait 1

Loop
' JAK SKOMPILUJESZ TO W SYMULATORZE ODTWÓRZ ZAKŁADKĘ INTERRUPTS I ZACZNIJ KLIKAĆ NA
'UDRE-- będzie podświetlone w tedy w terminalu będziesz widział co wysyłasz
Teraz muszę iść zrobić obiad jak skończę to przerobie część odbiorczą
pozdro

[ Dodano: 2009-07-12, 14:24 ]
Część odbiorcza

Kod: Zaznacz cały

$sim
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200
Dim Flag1 As Byte
Dim A As Word
Dim B(2) As Byte
Config Serialin = Buffered , Size = 20
Enable Interrupts
Enable Urxc
Do
Flag1 = Ischarwaiting()

If Flag1 = 1 Then
   Inputbin B(1) , 2
   Cls
   Lcd "B(1)=" ; B(1)
 Lowerline
   Lcd "b(2)=" ; B(2)
  
 End If

Loop
dorób sobie tylko tą zamaine z world na byte
Ostatnio zmieniony 12 lip 2009, 15:13 przez Pikczu, łącznie zmieniany 2 razy.

Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 12 lip 2009, 13:41

Nalezą się wielkie słowa uznania dla kolegi Pikczu za jego bezinteresowna pomoc.

Pomógł mi w tymczasowym rozwiązaniu problemu transmisji za która bardzo dziękuje.Nie zamykam jeszcze tematu gdyż będę może potrzebował rozwiązać kilka kwestii.Na końcu chętnie pochwale się wynikami pracy!

Pozdrawiam Mictronic!

Ps.Ah rzeczywiście a myślałem ze jednak pokemon :P A ja tez nie microtronic tylko Mictronic ;)
Ostatnio zmieniony 12 lip 2009, 14:30 przez mictronic, łącznie zmieniany 1 raz.

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 12 lip 2009, 13:54

Mictronic niema za co :)
Aha i nie rób ze mnie pokemona tam niema litery A
Polecam się na przyszłość :razz:
ups ja tez przepraszam :oops:
Swoja drogą dodałem jeszcze jeden przykład versi nadawczej lepiej jakoś wszytko widać

Kod: Zaznacz cały

'Ver 2 ****TYLKO DO TESTU  NA KOMPIE *****************************************
 'bez bufora lepiej widac w symulacji programowej

                                                  '----tylko do testu na kompie
 $sim
 $regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200
Config Lcd = 16 * 2
Dim A As Word
Dim B(2) As Byte
'******************************************************************************
'Config Serialout = Buffered , Size = 6
'Enable Interrupts
'Enable Utxc
'*******************************************************************************
A = 1
Do
Incr A
B(2) = Low(a)                                               'lsb
B(1) = High(a)                                              'msb
Cls

Printbin B(1) ; 2

Lcd "B1=" ; B(1)
Lowerline
Lcd "B2=" ; B(2)

Loop


Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 20 lip 2009, 23:57

Witam,niestety hardware mojego sterownika się "skasztanił" przez co nie kontynuuje pisania oprogramowania i przechodzę na C.
Wszystkim zainteresowanym moim tematem serdecznie dziękuje za pomoc oraz mam nadzieje ze kiedyś, komuś się to przyda...
A powyższy kod kolegi jest w stu procentach poprawny.

Pozdrawiam Mictronic!

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 21 lip 2009, 20:16

Czemu tak łatwo się pod dajesz ?

Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 21 lip 2009, 20:25

Juz po wszystkim,sterownik w śmieciach.Problem był w hardwarze widać mam za małe doświadczenie w projektowaniu nawet prostych układów analogowych : / Jakieś cyrki się w ogóle działy przy pomiarze napięcia oraz prądu ,a to polowa funkcjonalności całego układu.Rower elektryczny musi jeździć teraz a nie za miesiąc tak wiec zrobiłem prosty sterownik mierzący tylko napięcie z czujnika halla i generujący na podstawie tego PWM. Wiec nie mam już poco ani pod co pisać :D Przesiadam się do C (temat na głównej) .

ODPOWIEDZ