View Full Version : Delay Problem,Byte,Word
Pesticida
- 30th December 2006, 16:26
Hi,
I have a little problem:
Delay1 var word
DataIn var byte [12]
...........
Delay1 = Datain[3]
................
pause Delay1
Pause just work wenn Delay1 > 255 Why.
I want for Example to have a Delay sometimes 1 or 10 or 50 Milliseconds and sometime over a Second.
Its just work when Delay1 > as Byte.
How can I transform this Datain to Word.
I try with this:
Delay1.byte0 = Datain[3]
Delay1.byte1 = Datain[4]
Pause delay1
But this dont' Work.
I need Please a Help.
Thank You very mouch !!!
Ciao.
HenrikOlsson
- 30th December 2006, 18:23
Hi,
As you figured out it won't work because DataIn[3] is a byte sized variable, it can only hold values between 0 and 255. To do what you want something like this may work:
Delay1 = DataIn[3] * 256 + DataIn[4]
OR
Delay1.HighByte = DataIn[3]
Delay1.LowByte = DataIn[4]
In both examples DataIn[3] is the most is the upper 8 bits, DataIn[4] is the lower 8 bits of the word sized Delay1.
/Henrik Olsson.
sayzer
- 30th December 2006, 18:47
Why not DataIn VAR WORD[12] ?
Do I need more coffee again?
Or am I missing something here again?
-------------------
Pesticida
- 31st December 2006, 01:53
Why I must to multiple this with 256 I don't understand.
What I can do to have for example 1 Millisecond or 5 Millisecond with Pause.
Thanks.
Ciao.
mister_e
- 31st December 2006, 02:00
What is the range of your values? if all of them are <255, i guess you just need to use..
Delay1=0
Delay1.LowByte=DataIn[3]
Pause Delay1
in case the range is greater than 255, Sayzer's suggestion have to work... or i miss something myself too ;)
HenrikOlsson
- 31st December 2006, 11:25
Hi,
(I may be missing something here too, but here comes the long winded answer....)
Since you have an array of 12 bytes each byte can only hold a value between 0 and 255. If you want a delay longer than 255mS you need to, either use an array of words OR use two bytes in the byte-array to 'make' a word.
The multiply by 256 "shifts" the 8 bits in DataIn[3] to the upper 8 bits in Delay1.
Say you want a 1000mS delay. Since 1000 wont fit in a byte you'll use two bytes. 1000 in binary is 00000011 11101000 so DataIn[3] = 3 and DataIn[4] = 232.
Then when you parse it you get Delay1 = DataIn[3] * 256 + DataIn[4] which is the same as 3 * 256 + 232 = 1000.
Or the easier way:
Delay1.HighByte = DataIn[3]
Delay1.LowByte = DataIn[4]
/Henrik Olsson.
Pesticida
- 31st December 2006, 12:28
Hi,
Thanks a lot.
But When Delay1 < 256 dont' work.
This is my Code:
INCLUDE "modedefs.bas"
DEFINE OSC 4
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 12 ' 19200 Bauds
DEFINE HSER_CLROERR 1
DataIn var byte [12]
Adresse var byte
AdresseIn var byte
N var byte
Delay1 var word
Loop var word
Kanal var byte [5]
KanalCount var byte
SOUND PORTB.1,[124,100]
MainStart:
Adresse = $1
low PORTB.0 '''''''''''''''''''''''''''''''''''''''''''''RS485 Input Data Enable'''''''''''''''''''''''''''''''''''''''''''' ''''''''''''
Main:
hserin 10000,MainStart,[WAIT("!"),STR Datain\13]
CheckAdr:
AdresseIn = Datain[0]
if Adresse = AdresseIn then RcvData
GoTo MainStart
RcvData:
IF Datain[11] = 13 Then CheckEnd
Goto MainStart
CheckEnd:
IF Datain[12] = 10 Then Discard
Goto MainStart
Discard:
Delay1 = 256
Delay1 = (DataIn[3] * 256) + DataIn[4]
Loop = (Datain[2] * 10)
Kanal[0] = Datain[5]
Kanal[1] = Datain[6]
Kanal[2] = Datain[7]
Kanal[3] = Datain[8]
Kanal[4] = Datain[9]
Kanal[5] = Datain[10]
KanalCount = 0
'SOUND PORTB.1,[124,30]
''''''''''''''''''''''''''''''''''''''''''''Progra m 1''''''''''''''''''''''''''''''''''''''''''''''''' ''
IF Datain[1] = 0 then
for N = 0 to Loop
High PortC.0
High PortC.1
low PortC.2
low PortC.3
Pause Delay1
low PortC.0
High PortC.1
high PortC.2
low PortC.3
Pause Delay1
low PortC.0
low PortC.1
high PortC.2
high PortC.3
Pause Delay1
high PortC.0
low PortC.1
low PortC.2
high PortC.3
Pause Delay1
Next N
endif
GoTo MainStart
My Code Work just fine wehn the Delay Value > Byte is.
But I need for Example : Pause Delay1 = 1
I Wrote a visual Basic Software where I can send this Delays values,but this work just wehn this Word Variable > 255.
Thanks.
mister_e
- 31st December 2006, 12:30
I'm curious to see the VB program too.
Pesticida
- 31st December 2006, 12:32
Hi,
Yes I understand what you mean,but my problem ist that i want to have sometimes values that < as 255 is,for Example 1 Millisecond for My Stepping Motor.
The Visual Basic Software Work very good,all what I send I receive with my Pic,My only Problem ist that wehn I send this Chr(1) to my Word variable Delay ,dont' Work,wehn I send Chr(1) And I use the Pic Code: Delay1 = (DataIn[3] * 256) + DataIn[4] this work but I need 1 Millisecond for my Stepping Motor.
Thanks.
mister_e
- 31st December 2006, 12:38
OK, so do a simple test, skip the HSERIN stuff and load the value in the array manually at the top of your code, then redo your tests.
Also... there's a little mistake here
hserin 10000,MainStart,[WAIT("!"),STR Datain\13]
Should be
hserin 10000,MainStart,[WAIT("!"),STR Datain\12]
I think it's on the VB side... just drop the Mscomm1.Output line
Pesticida
- 31st December 2006, 12:54
Hi,
This is my Visual Basic Communication Code:
MSComm1.Output = "!" & Chr(Val(CmbAdresse.Text)) & Chr(0) & Chr(Val(TxtLoop.Text)) & Chr(Val(TxtDelayOn1.Text)) _
& Chr(Val(TxtDelayOn2.Text)) & Chr(Val(TxtKanal1.Text)) & Chr(Val(TxtKanal2.Text)) & Chr(Val(TxtKanal3.Text)) _
& Chr(Val(TxtKanal4.Text)) & Chr(Val(TxtKanal5.Text)) & Chr(Val(TxtKanal6.Text)) & Chr(13) & Chr(10)
Sleep 30
I need for the moment just Byte CmbAdresse.Text,Byte TxtLoop.Text,Byte TxtDelayOn1.Text,Byte TxtDelayOn2.Text.
I have 13 Bytes !
Pesticida
- 31st December 2006, 13:15
Ok I did what You told me,now I wrote direct too Delay1 = 1.
But dont work,maybe I can not use a Word variable with Pause when this Values less then 256 is.
I can not find the Answer.
mister_e
- 31st December 2006, 13:23
EDIT: forgive me i was wrong... i'll be back!!!
Pesticida
- 31st December 2006, 13:29
Ok,
but what I dont understand is why when I write Direct in Picbasic Pro:
Delay1 = 1
.......
High PortC.0
High PortC.1
low PortC.2
low PortC.3
Pause Delay1
this dont work,but when i write Pause 1 or when :
Delay1 var byte
Delay1 = 1
.......
High PortC.0
High PortC.1
low PortC.2
low PortC.3
Pause Delay1
This work.
mister_e
- 31st December 2006, 13:40
It's certainely strange dude...
Wich PIC #
Wich PBP version?
Pesticida
- 31st December 2006, 13:46
Hi,
Pic 16F870 and PBP 2.46.
Maybe is this a Compiler Bug for the Pause Command.
mister_e
- 31st December 2006, 14:04
mmm, i think i may have spotted few problems...
When you declare an array like this...
Array var BYTE[3]
it will hold 3 different value. And they will be...
Array[0]
Array[1]
Array[2]
Not MUCH, if you Write to Array[3], the compiler won't complaint... but it will cause you some problem one day or another because you WILL overwrite x variable...
so just modify your code and it should work better. In VB it work.. but it's a little bit different in PBP.
Just for testing, try...
DelayArray var byte[4]
delayarray[0]=1
delayarray[1]=10
delayarray[2]=100
delayarray[3]=200
Delay var word
CounterA var byte
Start:
for countera=0 to 3
high PORTB.0
delay=delayarray[countera]
pause delay
low PORTB.0
pause delay
next
goto start
at least it's working here
Pesticida
- 31st December 2006, 14:20
Mister thank a lot I will try now your code,
I try this too:
Delay1 var Word
Delay2 var Byte
Delay1 = Datain[3] * Datain[4]
if Delay1 < 256 then
Delay2 = Delay1
Delay1 = 0
else
Delay2 = 0
endif
Loop = (Datain[2] * 10)
''''''''''''''''''''''''''''''''''''''''''''Progra m 1''''''''''''''''''''''''''''''''''''''''''''''''' ''
IF Datain[1] = 0 then
for N = 0 to Widerholung
High PortC.0
High PortC.1
low PortC.2
low PortC.3
Pause Delay1
Pause Delay2
low PortC.0
High PortC.1
high PortC.2
low PortC.3
Pause Delay1
Pause Delay2
low PortC.0
low PortC.1
high PortC.2
high PortC.3
Pause Delay1
Pause Delay2
high PortC.0
low PortC.1
low PortC.2
high PortC.3
Pause Delay1
Pause Delay2
Next N
endif
This Work ! :-)
mister_e
- 31st December 2006, 14:35
Just to mix some brains ;)
Say you want a 1000mS delay. Since 1000 wont fit in a byte you'll use two bytes. 1000 in binary is 00000011 11101000 so DataIn[3] = 3 and DataIn[4] = 232.
Or the cryptic way...
@ MOVE?CW 1000, _DataIn+3
But, in this case DataIn[3]=232 AND DataIn[4]=3, no big deal...
Or the easier way:
Delay1.HighByte = DataIn[3]
Delay1.LowByte = DataIn[4]
With my example, you'll use...
@ MOVE?WW _DataIn+3, _Delay1
TADA!
Pesticida
- 31st December 2006, 15:03
This mean thet when I want to have One Millisecond i need to put in my DataIn[3] = 0 and DataIn[4] = 1 or I make again a Mistake ?! :-)
Pesticida
- 31st December 2006, 15:14
Thanks,
Your Code work very well but just when my values > 255 is.
Powered by vBulletin® Version 4.1.7 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.