QBasic: Skicka flera värden från PIC till QBasic (RS232) ?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

QBasic: Skicka flera värden från PIC till QBasic (RS232) ?

Inlägg av JimmyAndersson »

Till mitt kameraprojekt behöver jag skicka koordinaterna för x och y till QBasic.
X och Y kan (var för sig) ha ett värde mellan 110 - 143.

Hur gör man?

Först tänkte jag göra såhär i MikroBasic:
TXREG = 1 ' Berättar att X-värdet kommer
TXREG = position_x
TXREG = 2 ' Berättar att Y-värdet kommer
TXREG = position_y



Hittils läser jag av serieporten i QBasic med:
varde$ = INPUT$ (1, #1)
v = ASC (varde$) <--- Gör om till ett decimalt tal.
och sedan t.ex PRINT v för att visa värdet.

Men det resulterar ju i:
1
[position för x]
2
[position för y]
1
..osv

Hur gör jag så att positionen för x och y hamnar i varsin variabel?


Alla tips mottages tacksamt!
PS: Ja, jag måste köra med Basic... :wink:

Om jag skrivit för luddigt eller glömt något så är det bara att säga till. :)

edit: Det visade sig vara 110 - 143. :oops:
Senast redigerad av JimmyAndersson 27 juli 2006, 15:00:43, redigerad totalt 3 gånger.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Går det inte bra att shifta ihop de två värdena till en variabel och skicka över den?
Det är ju bara elva värden på resp kordinat så de klarar sig ju på 4 bitar var.
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Bra idé. Tyvärr visade det sig att jag skrev fel. :oops: Koordinaterna ligger mellan 110 - 143, dvs 33 olika värden. 4 bitar kan ju max innehålla talet 15.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Ja, då blev det lite svårare förståss.
Vet iofs inte vad det är du vill åstakomma, få ner antalet bytes som skickas eller enkare kod hos sändare/mottagare, men är det det första (mindre data) så skulle du kunna skicka de i varsitt bytes och låta en bit i resp. byte beskriva om det är x- eller y-kordinat

Ex.:
10001001 => x-axel, värde: 00001001
00001001 => y-axel, värde: 00001001
(dvs den vänstra biten berättar om datat hör till X- resp Y-axel.)
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Huvudsyftet med att QBasic-prylen är för tillfället för att se lite värden på skärmen när jag utvecklar PIC-koden. Men sedan ska jag istället använda QBasic för att kunna styra kameran från internet. Det är lite orginellt att använda QBasic mot internet, men det går. (Mer om det i projekt-tråden senare.)

Intressant idé att använda en byte för att se vilken axel som datat hör till. Det borde garanterat fungera. Ska testa lite och återkommer med resultatet. :)

Tack för tipset! :tumupp:
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> varde$ = INPUT$ (1, #1)
> v = ASC (varde$) <--- Gör om till ett decimalt tal.

Får du *alla* fyra värderna på en gång med dessa två rader ??

Annars är det väl bara att göra :

varde$ = INPUT$ (1, #1)
varde$ = INPUT$ (1, #1)
x = ASC (varde$)
varde$ = INPUT$ (1, #1)
varde$ = INPUT$ (1, #1)
y = ASC (varde$)

Så har du x och y i två variabler.
Varför skickar du "1" och "2" om du ändå inte testat på dom ?


<--- Gör om till ett decimalt tal.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En annan sak....

> Först tänkte jag göra såhär i MikroBasic:
> TXREG = 1 ' Berättar att X-värdet kommer
> TXREG = position_x
> TXREG = 2 ' Berättar att Y-värdet kommer
> TXREG = position_y

Mellan dessa kollar du väl att TXREG är "ledigt" ??
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

> Mellan dessa kollar du väl att TXREG är "ledigt" ??

Jodå. Först gjorde jag inte det, men det blev inte så bra.. :)

Ska läsa på lite i QBasic-manualen och se hur man gör för att kolla *om* det kommer in något på serieporten. Nu är det ganska slarvigt gjort eftersom QBasic-programmet läser av serieporten oavsett om det skickas något eller inte. :oops:


>> varde$ = INPUT$ (1, #1)
>> v = ASC (varde$) <--- Gör om till ett decimalt tal.

> Får du *alla* fyra värderna på en gång med dessa två rader ??

Nop. Det var bl.a därför jag kasserade den idén.

> Varför skickar du "1" och "2" om du ändå inte testat på dom ?

Koden var bara ett exempel, så ni kunde se vilka banor jag tänkte i, och kanske då tipsa om bättre sätt.


Ditt kodexempel var en bra idé. Provade aldrig den varianten, men jag ska göra det.
Xyzzy gav mig en annan idé ...som visade sig fungera utmärkt så länge som man inte behöver skicka större tal än 127, så i detta fallet är det inga problem.

Jag kör nu med lite marginal så att X kan vara 15 - 48. Y kan vara mellan 143 - 176. Intressant tanke att skicka olika data samtidigt i en byte. Egentligen är det ju enkelt, men man tänker inte alltid på det när man stirrar sig blind på decimala tal. Inte jag iallafall. :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> > Får du *alla* fyra värderna på en gång med dessa två rader ??
>
> Nop. Det var bl.a därför jag kasserade den idén.

Varföt det ? Det är väl bara att läsa 4 gånger !!??

Xyzzy sätt att "packa" data är nog bra *om* man har väldigt bråttom,
men annars blir det ju bara mer komplicerat i båda ändar att
packa och packa upp värderna.

Och du måste ju fortfarande läsa (minst) två gånger, så på den
punkten blir deet ingen större skillnad.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Jag skulle ha använt Xyzzys senaste förslag, att använda MSB till för att välja axel (x,y). På så vis behöver du aldrig vara rädd att hamna "ur sync" och du har dessutom möjlighet till utbyggnad.. Du kan t.ex. skicka x,y,z,w med de två högsta bitarna och skicka ett värde mellan 0 och (2^6)-1
"Kodningen" är ju inte speciellt avancerat, vid sändningen OR:ar du värdet med 0x80 eller 0x00 (om det känns nödvändigt). Vid mottagning AND:ar du med 0x3F för att få värdet och med 0xC0 för att få "adressen".
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

>>> Får du *alla* fyra värderna på en gång med dessa två rader ??

>> Nop. Det var bl.a därför jag kasserade den idén.

> Varföt det ? Det är väl bara att läsa 4 gånger !!??

Jag måste prova igen, för när jag testade (med två värden) så hamnade samma värde i båda variablerna. Men du brukar ha rätt, så det felet berodde nog på något annat. Ska kolla igen, för det låter som en bra lösning när man behöver skicka mer data som inte kan samsas i en byte.
Användarvisningsbild
Xyzzy
Inlägg: 1260
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

JimmyAndersson skrev:Intressant idé att använda en byte för att se vilken axel som datat hör till. Det borde garanterat fungera. Ska testa lite och återkommer med resultatet. :)

Tack för tipset! :tumupp:
Var så lite så, alltid kul att iaf kunna ge en liten vink *hur* man *kan* göra (om det inte är användbart denna gång, kanske det passar bra i ett framtida projekt :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26548
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Exakt. :)


sodjan:
Det fungerade utmärkt att göra som du skrev. Dvs såhär:

varde$ = INPUT$ (1, #1)
varde$ = INPUT$ (1, #1)
x = ASC (varde$)
varde$ = INPUT$ (1, #1)
varde$ = INPUT$ (1, #1)
y = ASC (varde$)

När jag provade först så blev det bara fel (minns inte hur det såg ut), men nu testade jag igen och då fungerar det perfekt.
Skriv svar