silver kuusik / Mbed 2 deprecated Protocol

Dependencies:   mbed

Committer:
silbo
Date:
Wed Mar 30 09:46:55 2011 +0000
Revision:
0:3cbe4eec57ae
Child:
1:6e34363efa95
xc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
silbo 0:3cbe4eec57ae 1 #include "mbed.h"
silbo 0:3cbe4eec57ae 2
silbo 0:3cbe4eec57ae 3 DigitalOut motor1A(p9);
silbo 0:3cbe4eec57ae 4 DigitalOut motor1B(p10);
silbo 0:3cbe4eec57ae 5 DigitalOut motor2A(p11);
silbo 0:3cbe4eec57ae 6 DigitalOut motor2B(p12);
silbo 0:3cbe4eec57ae 7 DigitalOut motor3A(p13);
silbo 0:3cbe4eec57ae 8 DigitalOut motor3B(p14);
silbo 0:3cbe4eec57ae 9 DigitalOut motor4A(p15);
silbo 0:3cbe4eec57ae 10 DigitalOut motor4B(p16);
silbo 0:3cbe4eec57ae 11
silbo 0:3cbe4eec57ae 12 DigitalOut digital1(p17);
silbo 0:3cbe4eec57ae 13 DigitalOut digital2(p18);
silbo 0:3cbe4eec57ae 14 DigitalOut digital3(p19);
silbo 0:3cbe4eec57ae 15 DigitalOut digital4(p20);
silbo 0:3cbe4eec57ae 16
silbo 0:3cbe4eec57ae 17 SPI spi(p5, p6, p7); // mosi(out), miso(in), sclk(clock)
silbo 0:3cbe4eec57ae 18 DigitalOut cs(p8); // cs(select)
silbo 0:3cbe4eec57ae 19
silbo 0:3cbe4eec57ae 20 PwmOut motor1(p21);
silbo 0:3cbe4eec57ae 21 PwmOut motor2(p22);
silbo 0:3cbe4eec57ae 22 PwmOut motor3(p23);
silbo 0:3cbe4eec57ae 23 PwmOut motor4(p24);
silbo 0:3cbe4eec57ae 24
silbo 0:3cbe4eec57ae 25 DigitalOut led(LED4);
silbo 0:3cbe4eec57ae 26
silbo 0:3cbe4eec57ae 27 Serial pc(USBTX, USBRX);
silbo 0:3cbe4eec57ae 28
silbo 0:3cbe4eec57ae 29 uint8_t* values;
silbo 0:3cbe4eec57ae 30 uint8_t* location;
silbo 0:3cbe4eec57ae 31
silbo 0:3cbe4eec57ae 32 char buffer[3];
silbo 0:3cbe4eec57ae 33 int i, inValue, bufferIndex;
silbo 0:3cbe4eec57ae 34
silbo 0:3cbe4eec57ae 35 // maps the value x to a new given range
silbo 0:3cbe4eec57ae 36 double map( double x, double in_min, double in_max, double out_min, double out_max ) {
silbo 0:3cbe4eec57ae 37 return ( x - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min;
silbo 0:3cbe4eec57ae 38 }
silbo 0:3cbe4eec57ae 39
silbo 0:3cbe4eec57ae 40 // shifts 2 8 bit integers into one integer
silbo 0:3cbe4eec57ae 41 int getIntValue( uint8_t high, uint8_t low ) {
silbo 0:3cbe4eec57ae 42 return ( high << 8 ) | low;
silbo 0:3cbe4eec57ae 43 }
silbo 0:3cbe4eec57ae 44
silbo 0:3cbe4eec57ae 45 // sets the given pwm value
silbo 0:3cbe4eec57ae 46 void setPWM( int value, PwmOut pwm, DigitalOut a, DigitalOut b ) {
silbo 0:3cbe4eec57ae 47 // block the motors
silbo 0:3cbe4eec57ae 48 if ( value > 511 ) {
silbo 0:3cbe4eec57ae 49 a = 0;
silbo 0:3cbe4eec57ae 50 b = 0;
silbo 0:3cbe4eec57ae 51 pwm = 1;
silbo 0:3cbe4eec57ae 52 } else {
silbo 0:3cbe4eec57ae 53 // clockwise run
silbo 0:3cbe4eec57ae 54 if ( value > 255 ) {
silbo 0:3cbe4eec57ae 55 value = value - 256;
silbo 0:3cbe4eec57ae 56 a = 0;
silbo 0:3cbe4eec57ae 57 b = 1;
silbo 0:3cbe4eec57ae 58 } else {
silbo 0:3cbe4eec57ae 59 a = 1;
silbo 0:3cbe4eec57ae 60 b = 0;
silbo 0:3cbe4eec57ae 61 }
silbo 0:3cbe4eec57ae 62 // map the 0-255 value to 0-1
silbo 0:3cbe4eec57ae 63 pwm = map( value, 0, 255, 0, 1 );
silbo 0:3cbe4eec57ae 64 }
silbo 0:3cbe4eec57ae 65 }
silbo 0:3cbe4eec57ae 66
silbo 0:3cbe4eec57ae 67 // specifies the action for the user input
silbo 0:3cbe4eec57ae 68 void specifyAction( char action, int value ) {
silbo 0:3cbe4eec57ae 69 // specify the action
silbo 0:3cbe4eec57ae 70 switch ( action ) {
silbo 0:3cbe4eec57ae 71 case 44:
silbo 0:3cbe4eec57ae 72 // print the analogs and digitals
silbo 0:3cbe4eec57ae 73 values = location;
silbo 0:3cbe4eec57ae 74 for ( int i=0; i<16; i++ ) {
silbo 0:3cbe4eec57ae 75 pc.putc( *( values++ ) );
silbo 0:3cbe4eec57ae 76 }
silbo 0:3cbe4eec57ae 77
silbo 0:3cbe4eec57ae 78 pc.putc( '\0' );
silbo 0:3cbe4eec57ae 79 pc.putc( 13 );
silbo 0:3cbe4eec57ae 80 break;
silbo 0:3cbe4eec57ae 81 case 162:
silbo 0:3cbe4eec57ae 82 // set the first PWMs value
silbo 0:3cbe4eec57ae 83 setPWM( value, motor1, motor1A, motor1B );
silbo 0:3cbe4eec57ae 84 break;
silbo 0:3cbe4eec57ae 85 case 163:
silbo 0:3cbe4eec57ae 86 // set the second PWMs value
silbo 0:3cbe4eec57ae 87 setPWM( value, motor2, motor2A, motor2B );
silbo 0:3cbe4eec57ae 88 break;
silbo 0:3cbe4eec57ae 89 case 164:
silbo 0:3cbe4eec57ae 90 // set the third PWMs value
silbo 0:3cbe4eec57ae 91 setPWM( value, motor3, motor3A, motor3B );
silbo 0:3cbe4eec57ae 92 break;
silbo 0:3cbe4eec57ae 93 case 165:
silbo 0:3cbe4eec57ae 94 // set the fourth PWMs value
silbo 0:3cbe4eec57ae 95 setPWM( value, motor4, motor4A, motor4B );
silbo 0:3cbe4eec57ae 96 break;
silbo 0:3cbe4eec57ae 97 case 230:
silbo 0:3cbe4eec57ae 98 // Goto _reset ?
silbo 0:3cbe4eec57ae 99 break;
silbo 0:3cbe4eec57ae 100 case 231:
silbo 0:3cbe4eec57ae 101 // enable or disable servos
silbo 0:3cbe4eec57ae 102 if ( value == 1 ) {
silbo 0:3cbe4eec57ae 103 // enable servo ?
silbo 0:3cbe4eec57ae 104 } else if ( value == 2 ) {
silbo 0:3cbe4eec57ae 105 // disable servo ?
silbo 0:3cbe4eec57ae 106 }
silbo 0:3cbe4eec57ae 107 break;
silbo 0:3cbe4eec57ae 108 case 233:
silbo 0:3cbe4eec57ae 109 // set digitals values
silbo 0:3cbe4eec57ae 110 digital1 = ( value & 1 );
silbo 0:3cbe4eec57ae 111 digital2 = ( ( value >> 1 ) & 1 );
silbo 0:3cbe4eec57ae 112 digital3 = ( ( value >> 2 ) & 1 );
silbo 0:3cbe4eec57ae 113 digital4 = ( ( value >> 3 ) & 1 );
silbo 0:3cbe4eec57ae 114 break;
silbo 0:3cbe4eec57ae 115 default:
silbo 0:3cbe4eec57ae 116 //pc.printf( "default\n" );
silbo 0:3cbe4eec57ae 117 }
silbo 0:3cbe4eec57ae 118 }
silbo 0:3cbe4eec57ae 119
silbo 0:3cbe4eec57ae 120 int readADC( int channel, DigitalOut select ) {
silbo 0:3cbe4eec57ae 121 // select the device
silbo 0:3cbe4eec57ae 122 select = 0;
silbo 0:3cbe4eec57ae 123
silbo 0:3cbe4eec57ae 124 // sending the 5 bits + 2 bits to ignore the null bits
silbo 0:3cbe4eec57ae 125 // coming from the device, so the data that is sent is 11000101
silbo 0:3cbe4eec57ae 126 uint8_t commandbits = 0xC0;
silbo 0:3cbe4eec57ae 127 commandbits |= ( channel << 2 );
silbo 0:3cbe4eec57ae 128 spi.write( commandbits );
silbo 0:3cbe4eec57ae 129
silbo 0:3cbe4eec57ae 130 // now the device sends back the readings 12 bits, 7 bits at a time
silbo 0:3cbe4eec57ae 131 uint8_t high = spi.write(0x0);
silbo 0:3cbe4eec57ae 132 uint8_t low = spi.write(0x0);
silbo 0:3cbe4eec57ae 133 low = low >> 2;
silbo 0:3cbe4eec57ae 134
silbo 0:3cbe4eec57ae 135 // shift to get the high and low byte
silbo 0:3cbe4eec57ae 136 high = ( high >> 3 );
silbo 0:3cbe4eec57ae 137 low = ( high << 5 ) | low;
silbo 0:3cbe4eec57ae 138
silbo 0:3cbe4eec57ae 139 // deselect the device
silbo 0:3cbe4eec57ae 140 select = 1;
silbo 0:3cbe4eec57ae 141
silbo 0:3cbe4eec57ae 142 // save the values
silbo 0:3cbe4eec57ae 143 *(values++) = high;
silbo 0:3cbe4eec57ae 144 *(values++) = low;
silbo 0:3cbe4eec57ae 145
silbo 0:3cbe4eec57ae 146 return 0;
silbo 0:3cbe4eec57ae 147 }
silbo 0:3cbe4eec57ae 148
silbo 0:3cbe4eec57ae 149 void serialEvent() {
silbo 0:3cbe4eec57ae 150 char c = pc.getc();
silbo 0:3cbe4eec57ae 151 // if we received enter
silbo 0:3cbe4eec57ae 152 if( c == 13 ) {
silbo 0:3cbe4eec57ae 153 //pc.printf( "char=[%c] value=[%u]", buffer[0],getIntValue(buffer[1],buffer[2]) );
silbo 0:3cbe4eec57ae 154 specifyAction( buffer[ 0 ], getIntValue( buffer[ 1 ], buffer[ 2 ] ) );
silbo 0:3cbe4eec57ae 155 buffer[ 0 ] = '\0';
silbo 0:3cbe4eec57ae 156 bufferIndex = 0;
silbo 0:3cbe4eec57ae 157 }
silbo 0:3cbe4eec57ae 158 else {
silbo 0:3cbe4eec57ae 159 buffer[ bufferIndex++ ] = c;
silbo 0:3cbe4eec57ae 160 }
silbo 0:3cbe4eec57ae 161 }
silbo 0:3cbe4eec57ae 162
silbo 0:3cbe4eec57ae 163 // the main method
silbo 0:3cbe4eec57ae 164 int main() {
silbo 0:3cbe4eec57ae 165 // Setup the spi for 7 bit data, high steady state clock,
silbo 0:3cbe4eec57ae 166 // second edge capture, with a 1MHz clock rate
silbo 0:3cbe4eec57ae 167 spi.format(7,0);
silbo 0:3cbe4eec57ae 168 spi.frequency(1000000);
silbo 0:3cbe4eec57ae 169
silbo 0:3cbe4eec57ae 170 // specify the usb baud rate, supported are :
silbo 0:3cbe4eec57ae 171 // 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600
silbo 0:3cbe4eec57ae 172 pc.baud( 921600 );
silbo 0:3cbe4eec57ae 173
silbo 0:3cbe4eec57ae 174 // allocate 16 bytes of space for the adc values
silbo 0:3cbe4eec57ae 175 values = (uint8_t*) malloc(16);
silbo 0:3cbe4eec57ae 176 // remember the first values aadress
silbo 0:3cbe4eec57ae 177 location = values;
silbo 0:3cbe4eec57ae 178
silbo 0:3cbe4eec57ae 179 // attach a serial interrupt
silbo 0:3cbe4eec57ae 180 pc.attach( &serialEvent );
silbo 0:3cbe4eec57ae 181
silbo 0:3cbe4eec57ae 182 // to indicate programm is running
silbo 0:3cbe4eec57ae 183 led = 1;
silbo 0:3cbe4eec57ae 184
silbo 0:3cbe4eec57ae 185 // endless loop
silbo 0:3cbe4eec57ae 186 while ( true ) {
silbo 0:3cbe4eec57ae 187 // start from the beginning
silbo 0:3cbe4eec57ae 188 values = location;
silbo 0:3cbe4eec57ae 189 // read the ADC values
silbo 0:3cbe4eec57ae 190 for ( i = 0; i < 8; i++ ) {
silbo 0:3cbe4eec57ae 191 readADC( i, cs );
silbo 0:3cbe4eec57ae 192 }
silbo 0:3cbe4eec57ae 193 }
silbo 0:3cbe4eec57ae 194 }
silbo 0:3cbe4eec57ae 195