Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:3cbe4eec57ae, 2011-03-30 (annotated)
- Committer:
- silbo
- Date:
- Wed Mar 30 09:46:55 2011 +0000
- Revision:
- 0:3cbe4eec57ae
- Child:
- 1:6e34363efa95
xc
Who changed what in which revision?
| User | Revision | Line number | New 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 |