Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

jeszcze raz rs232 i avr

adzio
-
-
Posty:3
Rejestracja:17 paź 2003, o 18:32
jeszcze raz rs232 i avr

Postautor: adzio » 17 paź 2003, o 20:18

Witam
Program ma wyodrebnic 3 zmienne wysyłane z PC.
Przy pierwszym nadaniu danych jest ok (prog poprawnie je rozdziela i wykonuje obliczenia) ale juz przy drugim prog sie sypie.
Wygląda to tak jakby gubił pierwszy bajt danych
Dane po PD moga przyjac wartosc od -30000 do 30000 po spacji od
-45000 do 45000.
Dane w formacie "PD12345 6789;"
'-------------------------------------------------

Dim Y As String * 1
Dim X As String * 30
Dim Px As String * 2
Dim Temp As Integer
Dim Szer_str As String * 10
Dim Dlug_str As String * 10
Dim Szer_in As Long
Dim Dlug_in As Long

Poczatek:

Px = ""
Temp = 0
Szer_str = ""
Dlug_str = ""
Szer_in = 0
Dlug_in = 0
X = ""
Y = ""
'odbierz wszystkie dane do znaku ";" i wsadz do X

While Y <> ";"
Inputbin Y
X = X + Y
Wend

'jezeli 2 pierwsze bajty <> od "PD" to skok do poczatku
Px = Left(x , 2)
If Px <> "PD" Then Goto Poczatek

' wszystkie znaki po "PD" do spacji wsadz do Szer_str
Temp = 3
Szer_str = " "
While Y <> " "
Y = Mid(x , Temp , 1)
If Y = " " Then Exit While
Szer_str = Szer_str + Y
Incr Temp
Wend

' wszystkie znaki po spacji do ";" wsadz do Dlug_str
While Y <> ";"
Y = Mid(x , Temp , 1)
If Y = ";" Then Exit While
Dlug_str = Dlug_str + Y
Incr Temp
Wend

Print Szer_str
Print Dlug_str

Szer_in = Val(szer_str)
Dlug_in = Val(dlug_str)
Print Szer_in
Print Dlug_in

Szer_in = Szer_in + 30000
Dlug_in = Dlug_in + 45000

Print Px
Print Szer_in
Print Dlug_in

Goto Poczatek

End
W symulatorze wszystko jest ok dopiero po zaprogramowaniu wychodza błędy w terminalu.
Gdzie ew. szukac przyczyny ?

euromatic
-
-
Posty:77
Rejestracja:27 lip 2003, o 21:38
Lokalizacja:00000

witam,

Postautor: euromatic » 18 paź 2003, o 22:07

mam pytanie, czy ty sam napisałeś też na PCta?
bo jeżeli tak to powinieneś zrezygnować z takiego formatu danych i przejść na HEX
to ci ułatwi życie, nie będziesz się martwił czy wartość jest dodatnia czy ujemna i że zmienna jest jej długość. twój soft jest także zbyt skomplikowany i zawodny. Opisz mi co chcesz osiągnąc a ja ci napiszę procedurkę odbioru. podaj też na jaki procek
pozdrawiam
euromatic@go2.pl

adzio
-
-
Posty:3
Rejestracja:17 paź 2003, o 18:32

Postautor: adzio » 19 paź 2003, o 09:24

Już mówie o co mi chodzi.
Chciałem zrobić sterownik plotera.
2 silniki krokowe (x,y)
PC ma wysłać plik *.plt (to plik wyeksportowany z Corela jest w załączniku).
W pliku sa różne dane , jednak mnie interesuja tylko te z początkiem "PU" i "PD".
Są to współrzędne linii (od - do) .
avr ma wyliczyć ile kroków i w któą strone ma wykonać silnik x i y żeby narysować daną linię.
Wykożystałem 90S8515 taktowany 11Mhz i komunikację 115000 bps.
W tej chwili do testowania wykorzystuje hyperteminal.
Do rozdzielania danych uzylem znaku ";" poniewaz rozny jest format pliku.
Czasami jest to jeden ciąg.
Program dla pc będzie miał za zadanie tylko wysylanie kolejnych danych z pliku a avr po kazdej wykonanej instr odpowie "OK".
Jeżeli ktoś ma lepszy pomysł to prosze o rade :)
Adam

euromatic
-
-
Posty:77
Rejestracja:27 lip 2003, o 21:38
Lokalizacja:00000

witam,

Postautor: euromatic » 23 paź 2003, o 21:18

opisz więcej swój problem, wtedy zobaczymy co da się zrobić.
szczególnie opisz czym będziesz wysyłał dane do procka (docelowy program) z avr nie powinno być problemu.
pozdrawiam
euromatic@tlen.pl

adzio
-
-
Posty:3
Rejestracja:17 paź 2003, o 18:32

Postautor: adzio » 27 paź 2003, o 11:03

Witam
Program dla PC napisze w VisualBasic.
To bedzie prosciutki prog ktory bedzie tylko pobieral kolejne linie z pliku i wysylal do portu.
Po wyslaniu 1 lini prog czeka na "OK" i wysyla nastepna.
Co do avr to rozwiazalem problem z odbiorem.
Avr odbiera dane , a nastepnie wylicza kolejne wspolrzedne punktow linii.
Musze jeszcze tylko dopisac cos co przeksztalci te wspolrzedne na rozkazy dla silnikow(prawo, lewo, gora, dol).
Podaje zrodlo programu:

Dim Initialx As Long
Dim Initialy As Long
Dim Finalx As Long
Dim Finaly As Long
Dim Steep As Byte
Dim Deltax As Long , Deltay As Long , Delta As Long
Dim Stepx As Long , Stepy As Long
Dim Coord As Long
Dim Temp As Long
Dim Y As String * 1
Dim X As String * 20
Dim Px As String * 2
Dim Szer_str As String * 7
Dim Dlug_str As String * 7
Dim Szer_in As Long
Dim Dlug_in As Long
Dim Start_szer As Long
Dim Start_dlug As Long
Dim Timeout As Byte

Start_szer = 0
Start_dlug = 0

Poczatek:

Px = ""
Temp = 0
Szer_str = ""
Dlug_str = ""
Szer_in = 0
Dlug_in = 0
X = ""
Y = ""




'odbierz wszystkie dane do znaku ";" i wsadz do X
'Jezeli "P" to dalej
While Y <> "P"
Inputbin Y
X = Y
Wend

'Jezeli ";" to koniec odbierania
While Y <> ";"
Inputbin Y
X = X + Y
Wend

'jezeli 2 pierwsze bajty <> od "PD" to skok do poczatku
Px = Left(x , 2)
If Px <> "PD" And Px <> "PU" Then Goto Poczatek

' wszystkie znaki po "PD" do spacji wsadz do Szer_str
Temp = 3
Timeout = 0
Szer_str = " "


While Y <> " "
Y = Mid(x , Temp , 1)
If Y = " " Then Exit While
Szer_str = Szer_str + Y
Incr Temp
Incr Timeout
If Timeout > 30 Then Goto Poczatek
Wend


' wszystkie znaki po spacji do ";" wsadz do Dlug_str
Timeout = 0
While Y <> ";"
Y = Mid(x , Temp , 1)
If Y = ";" Then Exit While
Dlug_str = Dlug_str + Y
Incr Temp
Incr Timeout
If Timeout > 30 Then Goto Poczatek
Wend





Szer_in = Val(szer_str)
Dlug_in = Val(dlug_str)


'Szer_in = Szer_in + 30000
'Dlug_in = Dlug_in + 45000


Print "Instrukcja =" ; Px




'******************************************




'****************************************************************
'RYSOWANIE LINII
'*****************************************************************

Initialx = Start_szer
Initialy = Start_dlug
Finalx = Szer_in
Finaly = Dlug_in

Steep = 0

Temp = Finalx - Initialx
Deltax = Abs(temp)

If Temp > 0 Then
Stepx = 1
Else
Stepx = -1
End If

Temp = Finaly - Initialy
Deltay = Abs(temp)

If Temp > 0 Then
Stepy = 1
Else
Stepy = -1
End If

If Deltay > Deltax Then
Steep = 1
Initialx = Initialx Xor Initialy
Initialy = Initialy Xor Initialx
Initialx = Initialx Xor Initialy

Deltax = Deltax Xor Deltay
Deltay = Deltay Xor Deltax
Deltax = Deltax Xor Deltay

Stepx = Stepx Xor Stepy
Stepy = Stepy Xor Stepx
Stepx = Stepx Xor Stepy
End If

Temp = Deltay * 2
Delta = Temp - Deltax
For Coord = 0 To Deltax
Delay
If Steep = 1 Then
Print Initialy ; " " ; Initialx
Else
Print Initialx ; " " ; Initialy
End If
While Delta >= 0
Initialy = Initialy + Stepy
Temp = Deltax * 2
Delta = Delta - Temp
Wend
Initialx = Initialx + Stepx
Temp = Deltay * 2
Delta = Delta + Temp
Next Coord
Print Finalx ; " " ; Finaly



Start_szer = Szer_in
Start_dlug = Dlug_in

Print "OK"

Goto Poczatek

End

Jezeli ktos ma jakies doswiadczenie w sterowaniu silnikami krokowymi to prosze o pomoc.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 51 gości