Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6109/Pd_firmware
Modified Files: Pd_firmware.pde Log Message: got PWM control working from Pd
Index: Pd_firmware.pde =================================================================== RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Pd_firmware.pde 19 May 2006 12:54:11 -0000 1.2 --- Pd_firmware.pde 20 May 2006 10:18:14 -0000 1.3 *************** *** 15,19 **** * Pduino protocol * =============== ! * data: 0-127 control: 128-255 * * Pd->Arduino commands --- 15,20 ---- * Pduino protocol * =============== ! * data: 0-127 ! * control: 128-255 * * Pd->Arduino commands *************** *** 24,34 **** * 231 - next byte sets PWM1 value * 232 - next byte sets PWM2 value - * * * Pd->Arduino byte cycle * ---------------------- ! * 0 cycle marker (255/11111111) ! * 1 digitalOut 0-6 bitmask ! * 2 digitalOut 7-13 bitmask * * Arduino->Pd byte cycle --- 25,34 ---- * 231 - next byte sets PWM1 value * 232 - next byte sets PWM2 value * * Pd->Arduino byte cycle * ---------------------- ! * 0 digitalOut 0-6 bitmask ! * 1 digitalOut 7-13 bitmask ! * 2 cycle marker (255/11111111) * * Arduino->Pd byte cycle *************** *** 64,71 **** #define TOTAL_DIGITAL_PINS 14
! byte i;
! // this flag says that the next serial input will be data, not control ! boolean waitForData = 0;
/* this int serves as an array of bits to store pin status --- 64,75 ---- #define TOTAL_DIGITAL_PINS 14
! // for comparing along with INPUT and OUTPUT ! #define PWM 2
! // this flag says the next serial input will be data, not control ! boolean waitForData = false; ! ! // this flag says the first data byte for the digital outs is next ! boolean firstInputByte = false;
/* this int serves as an array of bits to store pin status *************** *** 74,88 **** int digitalPinStatus;
byte analogPin; int analogData;
// ------------------------------------------------------------------------- ! void outputDigital(byte startPin) { byte digitalPin; byte digitalPinBit; ! byte digitalOutputByte; byte digitalData; ! for(i=0;i<7;++i) ! { digitalPin = i+startPin; digitalPinBit = OUTPUT << digitalPin; --- 78,99 ---- int digitalPinStatus;
+ /* this byte stores the status off whether PWM is on or not + * bit 9 = PWM0, bit 10 = PWM1, bit 11 = PWM2 + * the rest of the bits are unused and should remain 0 + */ + int pwmStatus; + byte analogPin; int analogData;
// ------------------------------------------------------------------------- ! void transmitDigitalInput(byte startPin) { ! byte i; byte digitalPin; byte digitalPinBit; ! byte transmitByte; byte digitalData; ! ! for(i=0;i<7;++i) { digitalPin = i+startPin; digitalPinBit = OUTPUT << digitalPin; *************** *** 91,110 **** digitalData = 0; // pin set to OUTPUT, don't read } else { ! digitalData = digitalRead(digitalPin); } ! digitalOutputByte = digitalOutputByte + (2^(i+1-startPin)*digitalData); } ! printByte(digitalOutputByte); }
// ------------------------------------------------------------------------- void setPinMode(int pin, int mode) { - pinMode(pin,mode); if(mode == INPUT) { ! digitalPinStatus = digitalPinStatus &~ (1 << pin); } ! if(mode == OUTPUT) { ! digitalPinStatus = digitalPinStatus | (1 << pin); } } --- 102,135 ---- digitalData = 0; // pin set to OUTPUT, don't read } + else if( (digitalPin >= 9) && (pwmStatus & (1 << digitalPin)) ) { + digitalData = 0; // pin set to PWM, don't read + } else { ! // digitalData = digitalRead(digitalPin); ! digitalData = pwmStatus; } ! transmitByte = transmitByte + (2^(i+1-startPin)*digitalData); } ! printByte(transmitByte); }
// ------------------------------------------------------------------------- + /* this function sets the pin mode to the correct state and sets the relevant + * bits in the two bit-arrays that track Digital I/O and PWM status + */ void setPinMode(int pin, int mode) { if(mode == INPUT) { ! digitalPinStatus = digitalPinStatus &~ (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! pinMode(pin,INPUT); } ! else if(mode == OUTPUT) { ! digitalPinStatus = digitalPinStatus | (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! pinMode(pin,OUTPUT); ! } ! else if( (mode == PWM) && (pin >= 9) && (pin <= 11) ) { ! digitalPinStatus = digitalPinStatus &~ (1 << pin); ! pwmStatus = pwmStatus | (1 << pin); } } *************** *** 121,183 **** // ------------------------------------------------------------------------- void processInput(int inputData) { if (waitForData > 0) { ! // the PWM commands (230-232) have a byte of data following the command analogWrite(waitForData,inputData); waitForData = 0; } else { switch (inputData) { ! case 200: ! case 201: ! case 202: ! case 203: ! case 204: ! case 205: ! case 206: ! case 207: ! case 208: ! case 209: ! case 210: ! case 211: ! case 212: ! case 213: ! setPinMode(inputData-200,OUTPUT); ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! break; ! case 214: ! case 215: ! case 216: ! case 217: ! case 218: ! case 219: ! case 220: ! case 221: ! case 222: ! case 223: ! case 224: ! case 225: ! case 226: ! case 227: ! setPinMode(inputData-214,INPUT); ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! break; ! case 230: ! case 231: ! case 232: ! // set waitForData to the PWM pin number ! waitForData = inputData - 221; ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! printByte(inputData); ! break; ! case 255: ! break; } } --- 146,207 ---- // ------------------------------------------------------------------------- void processInput(int inputData) { + // the PWM commands (230-232) have a byte of data following the command if (waitForData > 0) { ! printByte(150); ! printByte(inputData); analogWrite(waitForData,inputData); waitForData = 0; } + else if(inputData < 128) { + printByte(151); + printByte(inputData); + // TODO: this section is for digital out... + } else { + printByte(153); switch (inputData) { ! case 200: ! case 201: ! case 202: ! case 203: ! case 204: ! case 205: ! case 206: ! case 207: ! case 208: ! case 209: ! case 210: ! case 211: ! case 212: ! case 213: ! printByte(inputData); ! setPinMode(inputData-200,OUTPUT); ! break; ! case 214: ! case 215: ! case 216: ! case 217: ! case 218: ! case 219: ! case 220: ! case 221: ! case 222: ! case 223: ! case 224: ! case 225: ! case 226: ! case 227: ! printByte(inputData); ! setPinMode(inputData-214,INPUT); ! break; ! case 230: ! case 231: ! case 232: ! printByte(inputData); ! waitForData = inputData - 221; // set waitForData to the PWM pin number ! setPinMode(waitForData, PWM); ! break; ! case 255: ! break; } } *************** *** 188,194 **** // ------------------------------------------------------------------------- void setup() { beginSerial(9600); for(i=0; i<TOTAL_DIGITAL_PINS; ++i) { ! setPinMode(i,INPUT); } } --- 212,220 ---- // ------------------------------------------------------------------------- void setup() { + byte i; + beginSerial(9600); for(i=0; i<TOTAL_DIGITAL_PINS; ++i) { ! setPinMode(i,INPUT); } } *************** *** 197,216 **** void loop() { // read all digital pins ! outputDigital(0); ! outputDigital(7); /* * get analog in */ ! /* ! for(analogPin=0; analogPin<5; ++analogPin) ! { ! analogData = analogRead(analogPin); ! // these two bytes get converted back into the whole number in Pd ! printByte(analogData >> 7); // bitshift the big stuff into the output byte ! printByte(analogData % 128); // mod by 32 for the small byte ! } ! */ ! // ++analogPin; ! // if (analogPin > 5) analogPin = 0; /* end with the cycle marker */ // bitshift the big stuff into the output byte --- 223,242 ---- void loop() { // read all digital pins ! transmitDigitalInput(0); ! transmitDigitalInput(7); /* * get analog in */ ! /* ! for(analogPin=0; analogPin<5; ++analogPin) ! { ! analogData = analogRead(analogPin); ! // these two bytes get converted back into the whole number in Pd ! printByte(analogData >> 7); // bitshift the big stuff into the output byte ! printByte(analogData % 128); // mod by 32 for the small byte ! } ! */ ! // ++analogPin; ! // if (analogPin > 5) analogPin = 0; /* end with the cycle marker */ // bitshift the big stuff into the output byte *************** *** 220,224 ****
checkForInput(); ! printByte(255); } --- 246,250 ----
checkForInput(); ! printByte(255); }