From 84407fe580156dc12f4792c08ee42d70df6c4427 Mon Sep 17 00:00:00 2001 From: Blaise Thompson Date: Tue, 19 Jan 2021 10:53:07 -0600 Subject: restructure repository --- .../Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 digital-driver/firmware/Test Sketchs/Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino (limited to 'digital-driver/firmware/Test Sketchs/Slave_Random_LED_I2C') diff --git a/digital-driver/firmware/Test Sketchs/Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino b/digital-driver/firmware/Test Sketchs/Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino new file mode 100644 index 0000000..ef9df86 --- /dev/null +++ b/digital-driver/firmware/Test Sketchs/Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino @@ -0,0 +1,122 @@ +//////////////////////////////////////////////////////////////////////////////////// +// I2C test program for Digital Photoreactor Controller using TinyWireS library // +// Run this slave program on the AtTiny85. // +//////////////////////////////////////////////////////////////////////////////////// +// This test program is adapted from the TinyWireS stress test program // +// developed by Scott Hartog: https://github.com/rambo/TinyWire // +// // +// The slave program receives via I2C N bytes of random data in a single // +// receiveEvent() callback and stores that data in a global buffer. // +// It then responds the first requestEvent() callback with the same data. // +// The requestEvent() callback overwrites the data buffer with zeros after // +// responding so it will only respond correctly to the first requestEvent() // +// callback after each receiveEvent() callback. Subsequent requestEvent() // +// will respond with 0xff for all data bytes. // +// // +// // +// SETUP: // +// AtTiny85 Pin 2 = PB3 = Blink LED // +// Attiny85 Pin 3 (PB4) = LED PWM // +// AtTiny85 Pin 5 (PB0/SDA) = I2C SDA // +// connect to SDA on master with external pull-up (~4.7K) // +// AtTinyPin 6 (PB1) = Fan PWM // +// AtTiny Pin 7 (PB0/SCL) = I2C SCL // +// connect to SCL on master with external pull-up (~4.7K) // +// AtTiny Pin 1 (PB5/!RST) // +// connect to reset on master (or just pull-up) // +// // +//////////////////////////////////////////////////////////////////////////////////// + +#include "TinyWireS.h" // wrapper class for I2C slave routines + +#define I2C_SLAVE_ADDR 0x26 // I2C slave address (38, 0x26), + +uint8_t master_data[16]; // global buffer to store data sent from the master. +uint8_t master_bytes; // global variable to number of bytes sent from the master. + +const int LEDPin = 4; //Arduino pin 4, pin 3 on AtTiny85 pinout +const int FanPin = 1; //Arduino pin 1, pin 6 on AtTiny85 pinout +const int BlinkPin = 3; //Arduino pin 3, pin 2 on AtTiny85 pinout + +// Gets called when the ATtiny85 receives an I2C write slave request +void receiveEvent(uint8_t num_bytes) +{ + uint8_t i; + + // save the number of bytes sent from the master + master_bytes = num_bytes; + + // store the data from the master into the data buffer + for (i = 0; i < master_bytes; i++) + master_data[i] = TinyWireS.receive(); + + // set LED and Fan PWM duty to random byte values recieved from the master + analogWrite(FanPin, master_data[0]); + analogWrite(LEDPin, master_data[1]); + + // blink LED whenever data is successfuly recieved + digitalWrite(BlinkPin, HIGH); + delay(10); + digitalWrite(BlinkPin, LOW); + delay(10); + +} + +// Gets called when the ATtiny receives an i2c read slave request +void requestEvent() +{ + uint8_t i; + + // send the data buffer back to the master + for (i = 0; i < master_bytes; i++) + TinyWireS.send(master_data[i]); + + // corrupt the byte values in the data buffer + // so that subsequent call won't match + for (i = 0; i < master_bytes; i++) + master_data[i] += 0x5a; + + // corrupt length of the request, but dont' make it zero + + // if the usiTwiSlave.c is working fine, then this number is completely irrelevant + // because the requestEvent() callback will not be called again until + // after the next receiveEvent() callback, so the master_data and + // master_bytes variables will be set by that call. + + // If the usiTwiSlave.c has the issue of calling the requestFrom() callback + // for each byte sent, the buffer will accumulate by this amount *for each byte + // in the original request*. + // + // Making it zero will obscure the 1-byte send issue in the usiTwiSlave.c + // that is being tested. + // Making it small will allow a few requests to succeed before the tx buffer + // overflows and the usiTwiSlave.c hangs on the "while ( tmphead == txTail );" + // line + master_bytes = 2; +} + +void setup() +{ + // initialize the TinyWireS and usiTwiSlave libraries + TinyWireS.begin(I2C_SLAVE_ADDR); // init I2C Slave mode + + // register the onReceive() callback function + TinyWireS.onReceive(receiveEvent); + + // register the onRequest() callback function + TinyWireS.onRequest(requestEvent); + + pinMode(LEDPin, OUTPUT); // set pin for LED PWM + pinMode(FanPin, OUTPUT); // set pin for Fan PWM + pinMode(BlinkPin, OUTPUT); // set pin to blink LED + + TCCR0B = TCCR0B & 0b11111000 | 0b001; // sets internal timer of AtTiny85 to 31250 Hz for fast PWM for controlling fan speed +} + +void loop() +{ + // this needs to be here + /////////////Does this really need to be here????? + //TinyWireS_stop_check(); + // otherwise empty loop +} -- cgit v1.2.3