Wednesday, June 24, 2009

Basic programming of A4WD1 rover

Most of the lynxmotions robots uses the software provided by Basic Micro Technologies.

I will give the explanation of this Basic programming.

Basic programming supported by this rover is not exactly same as traditional one. It does not support all the commands and data structure.

// This program is not written by me, author is James Frye
// you will get source file at lynxmotion
'Program name: 4WD1AUTO.BAS 
'Author: My Friend Bharadwaj Srirangam   
'Connections 
'Pin 16 Jumper to battery (VS) 
'Pin 17 Left GP2D12 Sensor (Right facing sensor) 
'Pin 18 Right GP2D12 Sensor (Left facing sensor) 
'Pin 19 Rear GP2D12 Sensor 
'Pin 0 Left Sabertooth channel. 
'Pin 1 Right Sabertooth channel. 
'Pin 12 A Button. 
'Pin 13 B Button. 
'Pin 14 C Button. 
'Pin 9 Speaker.
; Datatype declaration temp  
var byte filter  
var word(10) 
ir_right var word 
ir_left  var word 
ir_rear  var word  
LSpeed  var word 
RSpeed  var word  
minspeed con 1750 
maxspeed con 1250  
LSpeed = 1500 
RSpeed = 1500  
low p0 
low p1  
sound 9, [100\880, 100\988, 100\1046, 100\1175]
; starting main 
main 
gosub sensor_check ;gosub is like function call  
; Numbers lower than 1500 result in forward direction. 
; Numbers higher than 1500 result in reverse direction. 
; min command below select the maximum expression.
; max command below evaluate the minimum expression.
LSpeed = (LSpeed - 10) min maxspeed ;accelerates the motors 
RSpeed = (RSpeed - 10) min maxspeed  
LSpeed = (LSpeed + ir_left) max minspeed ;when something is detected, this decelerates the opposite side 
RSpeed = (RSpeed + ir_right) max minspeed  
if (ir_rear > 15) then 
LSpeed = (LSpeed - ir_rear) min maxspeed ;if something is detected behind the robot, accelerates both sides 
RSpeed = (RSpeed - ir_rear) min maxspeed 
endif  ; 
Send out the servo pulses   
pulsout 0,(LSpeed*2) ; Left Sabertooth channel.  
pulsout 1,(RSpeed*2) ; Right Sabertooth channel.  
pause 20  
goto main   
sensor_check  
for temp = 0 to 9   
adin 17, filter(temp) 
next 
ir_right = 0 
for temp = 0 to 9   
ir_right = ir_right + filter(temp) 
next 
ir_right = ir_right / 85  
for temp = 0 to 9   
adin 18, filter(temp) 
next 
ir_left = 0 
for temp = 0 to 9   
ir_left = ir_left + filter(temp) 
next 
ir_left = ir_left / 85  
for temp = 0 to 9   
adin 19, filter(temp) 
next 
ir_rear = 0 
for temp = 0 to 9   
ir_rear = ir_rear + filter(temp) 
next 
ir_rear = ir_rear / 85  
; serout is like printf statement in c. we need to check this output at terminal 1 at 38.4kbps.  
serout s_out,i38400,["ir_right - ", dec ir_right, " ir_left - ", dec ir_left, " ir_rear - ", dec ir_rear, "LSpeed - ", dec LSpeed, " RSpeed - ", dec RSpeed, 13]  
return


Wednesday, June 10, 2009

Big endian vs Little endian


8 bits is a byte.
4 bytes is a word.




Above figure shows a 32 bit processor register.

Byte order: Byte3 Byte2 Byte1 Byte0

Little Endian: lower order byte of a number is stored in memory at lower address, and the higher order byte is stored at higher address.

Big Endian: lower order byte of a number is stored in memory at higer address, and the higher order byte is stored at lower address.

Example:

1001 / 2 = 1
500 / 2 = 0
250 / 2 = 0
125 / 2 = 1
62 / 2 = 0
31 / 2 = 1
15 / 2 = 1
7 / 2 = 1
3 / 2 = 1
1 / 2 = 1

= 1111101001(binary)