From e9a73bbb3c14af340999f70146747787785f4fee Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Mon, 19 Dec 2011 18:20:33 +0000 Subject: initial commit --- ESS1995test_328p/main.cpp | 254 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 ESS1995test_328p/main.cpp (limited to 'ESS1995test_328p/main.cpp') diff --git a/ESS1995test_328p/main.cpp b/ESS1995test_328p/main.cpp new file mode 100644 index 0000000..66dd792 --- /dev/null +++ b/ESS1995test_328p/main.cpp @@ -0,0 +1,254 @@ + +/* + ESS1995 communications test + + proof of concept + + +*/ + +#include "electic.h" + +extern "C" void __cxa_pure_virtual() +{ + cli(); + for (;;); +} + +int main(){ + + init(); //-- init Arduino library - delay, PWM setup messes with timers, millis(), micros() etc don't work without it + + pinMode(CS,OUTPUT); + digitalWrite(CS,LOW); //turn off DMM, maybe it doesn't like waiting around + + setupBlueTooth(); + + pinMode(DATA_NEW,INPUT); + pinMode(SCLK,OUTPUT); + pinMode(BTC,INPUT); + + pinMode(OUTPUT1, OUTPUT); + pinMode(OUTPUT2, OUTPUT); + + digitalWrite(OUTPUT2,HIGH); + + digitalWrite(CS,HIGH); //select DMM + + + + + + uint16_t delayMillis=250; + + //send 1st write to initiate readings - not necessary - what is default mode? + + + + +/* +writeDMM(); + delay(delayMillis); + startWrite(); + writeStartBit(); + writeByte(WRITE_ID); + writeByte(WB1); + writeByte(WB2); + writeByte(WB3); + writeByte(WB4); + writeStopBit(); //is ACK already the same as stop bit? + */ + + + + + + + + //variables to read + uint8_t DB_STATUS; + /* + uint8_t DB_ASIGN; + uint8_t DB_BSIGN; + uint8_t DB_PMAX; + uint8_t DB_PMIN; + uint8_t DB_BTS; + uint8_t DB_ALARM; + uint8_t DB_HF; + uint8_t DB_LF; + uint8_t DB_LDUTY; + uint8_t DB_STA; + uint8_t DB_F_FIN; + */ + uint32_t DB_D0; + uint16_t DB_D1; + uint32_t DB_D2; + uint32_t DB_D3; + + delay(delayMillis); + writeDMM(); + + while(1) { + if (digitalRead(DATA_NEW)==HIGH){ //DMM is ready to send data + digitalWrite(OUTPUT1,HIGH); + digitalWrite(OUTPUT2,LOW); + startWrite(); + writeStartBit(); + writeByte(READ_ID); + if (digitalRead(DATA_NEW)==LOW){ //ID confirmed + digitalWrite(OUTPUT2,HIGH); + startRead(); + for (int i=0;i<10;i++) { + data[i] = readByte(); + } + //stop bit comes from the MPU? does seem to be necessary. + startWrite(); + writeStopBit(); + + //parse data + DB_STATUS=data[0]; + /* + DB_ASIGN=data[0]>>7; + DB_BSIGN=(data[0]>>6) & 0b01; + DB_PMAX=(data[0]>>5) & 0b01; + DB_PMIN=(data[0]>>4) & 0b01; + DB_BTS=(data[0]>>2) & 0b11; + DB_ALARM=data[0]& 0b01; + DB_HF=data[1]>>7; + DB_LF=(data[1]>>6) & 0b01; + DB_LDUTY=(data[1]>>5) & 0b01; + DB_STA=((data[1]>>3) & 0b10)|((data[0]>>1) & 0b01); + DB_F_FIN=(data[1]>>3) & 0b01; + */ + DB_D0=(((uint32_t)( data[1] & 0b111))<<16)|(((uint32_t)data[2])<<8)|data[3]; + DB_D1=(((uint16_t)data[4])<<2)|((data[5] & 0b11000000)>>6); + DB_D2=(((uint32_t)( data[5] & 0b111111))<<13)|(((uint32_t) data[6] )<<5)|(((uint32_t)( data[7] & 0b11111000))>>3); + DB_D3=(((uint32_t)( data[7] & 0b111))<<16)|(((uint32_t) data[8])<<8)|data[9]; + + + while (Serial.available() > 0) { + // get incoming byte: + uint8_t sampleCode = Serial.read(); + switch (sampleCode) { + case 1: + delayMillis=1000; + break; + case 2: + delayMillis=250; + break; + case 3: + delayMillis=50; + break; + } + } + + + if (digitalRead(BTC)){ + if (!connected) connected=true; + // data packet : + // ID (2 byte) + // no of bytes (max 255) + // data bytes + Serial.write((uint8_t*)&ELECTIC_ID,2); + Serial.write((uint8_t*)&packetSize,1); + Serial.write((uint8_t*)&DB_STATUS,1); + Serial.write((uint8_t*)&DB_D0,4); + Serial.write((uint8_t*)&DB_D1,2); + } + else { + if (connected) { + advertise(); + connected=false; + } + } + } + } + + delay(delayMillis); + digitalWrite(OUTPUT1,LOW); + digitalWrite(OUTPUT2,LOW); + //delay(delayMillis); + } +} +void startWrite() { + pinMode(SDATA,OUTPUT); + digitalWrite(SCLK, HIGH); +} +void startRead() { + pinMode(SDATA,INPUT); + digitalWrite(SCLK, HIGH); +} +void SCLKcycle_W() { + //insert a high clock cycle, normally LOW + delayMicroseconds(START_DELAY); + digitalWrite(SCLK, HIGH); + delayMicroseconds(CLOCK_DELAY); + digitalWrite(SCLK, LOW); + delayMicroseconds(START_DELAY); +} +void SCLKcycle_R() { + //insert a low clock cycle, normally HIGH + delayMicroseconds(START_DELAY); + digitalWrite(SCLK, LOW); + delayMicroseconds(CLOCK_DELAY); + digitalWrite(SCLK, HIGH); + delayMicroseconds(START_DELAY); +} +void writeByte(uint8_t data){ + + for (uint8_t i=0,bit=7;i<8;i++,bit--) { + digitalWrite(SDATA,(data>>bit)&0b01); + SCLKcycle_W(); + } + digitalWrite(SDATA,HIGH); //ACK/ stopbit should be HIGH? + SCLKcycle_W(); //ACK INTERVAL +} +void writeStopBit(){ + digitalWrite(SDATA,LOW); //prepare SDATA + delayMicroseconds(START_DELAY); + digitalWrite(SCLK,HIGH); + delayMicroseconds(START_DELAY); + digitalWrite(SDATA,HIGH); //stop bit +} +void writeStartBit(){ + digitalWrite(SDATA, HIGH); //should be anyway + digitalWrite(SCLK, HIGH); + delayMicroseconds(START_DELAY); + digitalWrite(SDATA,LOW); //start bit + delayMicroseconds(START_DELAY); + digitalWrite(SCLK, LOW); + delayMicroseconds(START_DELAY); +} +uint8_t readByte(){ + uint8_t data=0; + uint8_t thisdata; + //delayMicroseconds(START_DELAY); + //digitalWrite(SCLK, HIGH); //load first bit + delayMicroseconds(START_DELAY); + for (uint8_t i=0,bit=7;i<8;i++,bit--) { + thisdata=digitalRead(SDATA); + data = data | (thisdata<