Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21760/Pd_firmware
Modified Files: Pd_firmware.pde Log Message:
- got digital inputs working reading by port, sends only on change - ignore Rx/Tx pins (0 and 1) since they are used for serial/USB - removed a fair amount of cruft
Index: Pd_firmware.pde =================================================================== RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** Pd_firmware.pde 5 Mar 2007 17:08:51 -0000 1.27 --- Pd_firmware.pde 6 Mar 2007 06:59:43 -0000 1.28 *************** *** 184,187 **** --- 184,192 ---- #define PWM 2
+ // for selecting digital inputs + #define PB 2 // digital input, pins 8-13 + #define PC 3 // analog input port + #define PD 4 // digital input, pins 0-7 + #define MAX_DATA_BYTES 2 // max number of data bytes in non-SysEx messages /* message command bytes */ *************** *** 204,217 **** /* input message handling */ byte waitForData = 0; // this flag says the next serial input will be data ! byte executeMultiByteCommand = 0; // command to execute after getting multi-byte data byte multiByteChannel = 0; // channel data for multiByteCommands byte storedInputData[MAX_DATA_BYTES] = {0,0}; // multi-byte data /* digital pins */ boolean digitalInputsEnabled = false; // output digital inputs or not ! byte digitalInputHighByte = 0; ! byte digitalInputLowByte = 0; ! byte previousDigitalInputHighByte = 0; // previous output to test for change ! byte previousDigitalInputLowByte = 0; // previous output to test for change ! int digitalPinStatus = 0; // bitwise array to store pin status 0=INPUT,1=OUTPUT /* PWM/analog outputs */ int pwmStatus = 0; // bitwise array to store PWM status --- 209,220 ---- /* input message handling */ byte waitForData = 0; // this flag says the next serial input will be data ! byte executeMultiByteCommand = 0; // execute this after getting multi-byte data byte multiByteChannel = 0; // channel data for multiByteCommands byte storedInputData[MAX_DATA_BYTES] = {0,0}; // multi-byte data /* digital pins */ boolean digitalInputsEnabled = false; // output digital inputs or not ! int digitalInputs; ! int previousDigitalInputs; // previous output to test for change ! int digitalPinStatus = 3; // bitwise array to store pin status, ignore RxTx pins /* PWM/analog outputs */ int pwmStatus = 0; // bitwise array to store PWM status *************** *** 244,248 **** // this should be converted to use PORTs twoBytesForPorts = pin0_6 + (pin7_13 << 7); ! for(i=0; i<14; ++i) { mask = 1 << i; if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) { --- 247,251 ---- // this should be converted to use PORTs twoBytesForPorts = pin0_6 + (pin7_13 << 7); ! for(i=2; i<TOTAL_DIGITAL_PINS; ++i) { // ignore Rx,Tx pins (0 and 1) mask = 1 << i; if( (digitalPinStatus & mask) && !(pwmStatus & mask) ) { *************** *** 257,261 **** void checkDigitalInputs(void) { if(digitalInputsEnabled) { ! // this should use _SFR_IO8() } } --- 260,273 ---- void checkDigitalInputs(void) { if(digitalInputsEnabled) { ! previousDigitalInputs = digitalInputs; ! digitalInputs = _SFR_IO8(port_to_input[PB]) << 8; // get pins 8-13 ! digitalInputs += _SFR_IO8(port_to_input[PD]); // get pins 0-7 ! digitalInputs = digitalInputs &~ digitalPinStatus; // ignore pins set OUTPUT ! if(digitalInputs != previousDigitalInputs) { ! // TODO: implement more ports as channels for more than 16 digital pins ! Serial.print(DIGITAL_MESSAGE,BYTE); ! Serial.print(digitalInputs % 128, BYTE); // Tx pins 0-6 ! Serial.print(digitalInputs >> 7, BYTE); // Tx pins 7-13 ! } } } *************** *** 266,286 **** */ void setPinMode(byte pin, byte mode) { ! if(mode == INPUT) { ! digitalPinStatus = digitalPinStatus &~ (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! digitalWrite(pin,LOW); // turn off pin before switching to INPUT ! pinMode(pin,INPUT); ! } ! else if(mode == OUTPUT) { ! digitalPinStatus = digitalPinStatus | (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! pinMode(pin,OUTPUT); ! } ! else if( mode == PWM ) { ! digitalPinStatus = digitalPinStatus | (1 << pin); ! pwmStatus = pwmStatus | (1 << pin); ! pinMode(pin,OUTPUT); ! } // TODO: save status to EEPROM here, if changed }
--- 278,300 ---- */ void setPinMode(byte pin, byte mode) { ! if(pin > 1) { // ignore RxTx pins (0,1) ! if(mode == INPUT) { ! digitalPinStatus = digitalPinStatus &~ (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! digitalWrite(pin,LOW); // turn off pin before switching to INPUT ! pinMode(pin,INPUT); ! } ! else if(mode == OUTPUT) { ! digitalPinStatus = digitalPinStatus | (1 << pin); ! pwmStatus = pwmStatus &~ (1 << pin); ! pinMode(pin,OUTPUT); ! } ! else if( mode == PWM ) { ! digitalPinStatus = digitalPinStatus | (1 << pin); ! pwmStatus = pwmStatus | (1 << pin); ! pinMode(pin,OUTPUT); ! } // TODO: save status to EEPROM here, if changed + } }
*************** *** 425,434 **** *============================================================================*/ void loop() { - ///analogWrite(11, tmp);++tmp;delay(2); /* DIGITALREAD - as fast as possible, check for changes and output them to the * FTDI buffer using Serial.print() */ checkDigitalInputs(); if(timer0_overflow_count > nextExecuteTime) { ! nextExecuteTime = timer0_overflow_count + 4; // run this every 4ms /* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle * all serialReads at once, i.e. empty the buffer */ --- 439,447 ---- *============================================================================*/ void loop() { /* DIGITALREAD - as fast as possible, check for changes and output them to the * FTDI buffer using Serial.print() */ checkDigitalInputs(); if(timer0_overflow_count > nextExecuteTime) { ! nextExecuteTime = timer0_overflow_count + 19; // run this every 20ms /* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle * all serialReads at once, i.e. empty the buffer */