From 3053c05fc4af51481c7f2782b5c515d5e6ca4453 Mon Sep 17 00:00:00 2001 From: James Devine Date: Sun, 21 Jul 2019 21:18:36 +0000 Subject: [PATCH] --- CosmicPi16CalibrationUtil | 350 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 CosmicPi16CalibrationUtil diff --git a/CosmicPi16CalibrationUtil b/CosmicPi16CalibrationUtil new file mode 100644 index 0000000..8f3a0a3 --- /dev/null +++ b/CosmicPi16CalibrationUtil @@ -0,0 +1,350 @@ +/* +Cosmic Pi V1.6 Calibration script +Run this to set the EEPROM values in your Cosmic Pi, before flashing the operational software + +Notes to user: If you set the thresholds/HV wrong and it goes crazy with interrupts, just re-flash and the values will +be reset before the interrupt is attached. Problem solved. +We write the values in the EEPROM at two places, one will be used for user manipulation, the other will remain there +for a 'hard reset' + +Features: + Working: + Set HVs + Set Thresholds + Print out events with integer + Store values in EEPROM. + +To be added: +Instant rate meter to be used for getting a better idea of the rate. +A way to rate limit/lower thresholds if you crash it. + + Licensed under GPL V3 or later + + +*/ + +//drive the dac channels +//set values into eeprom +#include + +/* EEProm mapping table + *EEPROM Status - byte 00 + *main values + *channel 0 high byte - 01 + *channel 0 low byte - 02 + *channel 1 high byte - 03 + *channel 1 low byte - 04 + *HV bias ch 0 value - 05 + *HV bias ch 1 value - 06 + * + *reserve values + *channel 0 high byte - 01 + *channel 0 low byte - 02 + *channel 1 high byte - 03 + *channel 1 low byte - 04 + *HV bias ch 0 value - 05 + *HV bias ch 1 value - 06 + */ + +//init variables +int Status = 0; //status for eeprom reads +int Data = 0; //data in/out of eeprom +// the setup function runs once when you press reset or power the board +byte smallpart1; //lsb for DAC settings +byte bigpart1; //msb for DAC settings +byte smallpart2; //lsb for DAC settings +byte bigpart2; //msb for DAC settings +int HVVal1 = 0xFE; //hv transmission value +int HVVal2 = 0xFE; //hv transmission value + + +//run i2c devices +#include + + +unsigned long event_count = 0; + + +void printTimeAndPin(){ + // print when and which pin was interrupted + event_count++; + //Serial.print(name); + Serial.print("count="); + Serial.println(event_count); + //Serial.print(";time="); + //timemeasure=millis(); + //Serial.println(timemeasure-timeoffset); +} + + +void setup() { + + pinMode(PA6, OUTPUT); + pinMode(PA4, OUTPUT); + pinMode(PA5, OUTPUT); + Serial.begin(9600); + + +//config SPI pins + pinMode(PC7, OUTPUT); + pinMode(PC8, OUTPUT); + pinMode(PC3, OUTPUT); + pinMode(PB13, OUTPUT); + + //set input pins + pinMode(PC12, INPUT); + pinMode(PC11, INPUT); + pinMode(PB10, INPUT); + +//set HV channel 1 + digitalWrite(PC7, LOW); + setHV(0xAC); + digitalWrite(PC7, HIGH); +//set HV channel 2 + digitalWrite(PC8, LOW); + setHV(0xAC); + digitalWrite(PC8, HIGH); + +//set DACS + Wire.setSDA(PB7); + Wire.setSCL(PB8); + Wire.begin(); +//initial DAC settings (both channels) +smallpart1 = 0x2F; //the lsb part +bigpart1 = 0x02; // the msb part of the dac value +smallpart2 = 0x2F; //the lsb part +bigpart2 = 0x02; // the msb part of the dac value + + int address = 0x60; + Wire.beginTransmission(address); + Wire.write(B00001000); // sends five bytes + Wire.write(bigpart1); // sends one byte + Wire.write(smallpart1); + Wire.endTransmission(); + + Wire.beginTransmission(address); + Wire.write(B00000000); // sends five bytes + Wire.write(bigpart2); // sends one byte + Wire.write(smallpart2); + Wire.endTransmission(); + + attachInterrupt(digitalPinToInterrupt(PB10), printTimeAndPin, RISING); + + +} + +void loop() { + Serial.println("Input a command!"); + Serial.println("[1= set both thresholds; 2= set Ch1 threshold, 3= set Ch2 threshold, 4= set both HV thresholds, 5= set Ch1 HV threshold, 6= set Ch2 HV threshold, 7= set values in EEPROM]"); + int cmd = readIntFromSerial(); + switch(cmd){ + case 1: + { + Serial.println("Set a threshold value [1,1024]: "); + int value = readIntFromSerial(); + smallpart1 = byte(value); + bigpart1 = byte(value>>8); + smallpart2 = byte(value); + bigpart2 = byte(value>>8); + + int address = 0x60; + //channel 1 + Wire.beginTransmission(address); + Wire.write(B00001000); // sends five bytes + Wire.write(bigpart1); // sends one byte + Wire.write(smallpart1); + Wire.endTransmission(); + //channel 2 + Wire.beginTransmission(address); + Wire.write(B00000000); // sends five bytes + Wire.write(bigpart2); // sends one byte + Wire.write(smallpart2); + Wire.endTransmission(); + break; + } + case 2: + { + Serial.println("Set a threshold value [1,1024]: "); + int value = readIntFromSerial(); + smallpart1 = byte(value); + bigpart1 = byte(value>>8); + + int address = 0x60; + //channel 1 + Wire.beginTransmission(address); + Wire.write(B00001000); // sends five bytes + Wire.write(bigpart1); // sends one byte + Wire.write(smallpart1); + Wire.endTransmission(); + break; + } + case 3: + { + Serial.println("Set a threshold value [1,1024]: "); + int value = readIntFromSerial(); + smallpart2 = byte(value); + bigpart2 = byte(value>>8); + + int address = 0x60; + //channel 2 + Wire.beginTransmission(address); + Wire.write(B00000000); // sends five bytes + Wire.write(bigpart2); // sends one byte + Wire.write(smallpart2); + Wire.endTransmission(); + break; + } + case 4: + { + Serial.println("Set an HV value [0,255]: "); + HVVal1 = readIntFromSerial(); + HVVal2 = HVVal1; +//set HV channel 1 + digitalWrite(PC7, LOW); + setHV(byte(HVVal1)); + digitalWrite(PC7, HIGH); +//set HV channel 2 + digitalWrite(PC8, LOW); + setHV(byte(HVVal2)); + digitalWrite(PC8, HIGH); + break; + } + case 5: + { + Serial.println("Set an HV value [0,255]: "); + HVVal1 = readIntFromSerial(); +//set HV channel 1 + digitalWrite(PC7, LOW); + setHV(byte(HVVal1)); + digitalWrite(PC7, HIGH); + break; + } + case 6: + { + Serial.println("Set an HV value [0,255]: "); + HVVal2 = readIntFromSerial(); +//set HV channel 2 + digitalWrite(PC8, LOW); + setHV(byte(HVVal2)); + digitalWrite(PC8, HIGH); + break; + } + + case 7: + { + //eeprom write + EEPROM.write(0x01, bigpart1); + Serial.print("EEPROM.write"); + Serial.print(0x01, HEX); + Serial.print(" "); + Serial.println(bigpart1, HEX); + EEPROM.write(0x02, smallpart1); + Serial.print("EEPROM.write"); + Serial.print(0x02, HEX); + Serial.print(" "); + Serial.println(smallpart1, HEX); + EEPROM.write(0x03, bigpart2); + Serial.print("EEPROM.write"); + Serial.print(0x03, HEX); + Serial.print(" "); + Serial.println(bigpart2, HEX); + EEPROM.write(0x04, smallpart2); + Serial.print("EEPROM.write"); + Serial.print(0x04, HEX); + Serial.print(" "); + Serial.println(smallpart2, HEX); + EEPROM.write(0x05, byte(HVVal1)); + Serial.print("EEPROM.write"); + Serial.print(0x05, HEX); + Serial.print(" "); + Serial.println(HVVal1, HEX); + EEPROM.write(0x06, byte(HVVal2)); + Serial.print("EEPROM.write"); + Serial.print(0x06, HEX); + Serial.print(" "); + Serial.println(HVVal2, HEX); + EEPROM.write(0x00, 0x01); //set the status bit, have 1 set of stored values + Serial.print("EEPROM.write"); + Serial.print(0x00, HEX); + Serial.print(" "); + Serial.println(0x01, HEX); + + //eeprom backup location + + EEPROM.write(0x21, bigpart1); + Serial.print("EEPROM.write"); + Serial.print(0x21, HEX); + Serial.print(" "); + Serial.println(bigpart1, HEX); + EEPROM.write(0x22, smallpart1); + Serial.print("EEPROM.write"); + Serial.print(0x22, HEX); + Serial.print(" "); + Serial.println(smallpart1, HEX); + EEPROM.write(0x23, bigpart2); + Serial.print("EEPROM.write"); + Serial.print(0x23, HEX); + Serial.print(" "); + Serial.println(bigpart2, HEX); + EEPROM.write(0x24, smallpart2); + Serial.print("EEPROM.write"); + Serial.print(0x24, HEX); + Serial.print(" "); + Serial.println(smallpart2, HEX); + EEPROM.write(0x25, HVVal1); + Serial.print("EEPROM.write"); + Serial.print(0x25, HEX); + Serial.print(" "); + Serial.println(HVVal1, HEX); + EEPROM.write(0x26, HVVal2); + Serial.print("EEPROM.write"); + Serial.print(0x26, HEX); + Serial.print(" "); + Serial.println(HVVal2, HEX); + EEPROM.write(0x00, 0x02); //set the status to show that backup positions have been written + Serial.print("EEPROM.write"); + Serial.print(0x00, HEX); + Serial.print(" "); + Serial.println(0x02, HEX); + + } + } + + +} + + + + + + +// this function sets the thresholds for the MAX5387 +// 1 is the first channel, 2 the second and 3 sets both at the same time + +byte setHV(byte _send) // This function is what bitbangs the data +{ + if (_send > 0x6F){ + for(int i=0; i<8; i++) // There are 8 bits in a byte + { + digitalWrite(PC3, bitRead(_send, 7-i)); // Set MOSI + //delay(1); + digitalWrite(PB13, HIGH); // SCK high + //bitWrite(_receive, i, digitalRead(MISO_pin)); // Capture MISO + digitalWrite(PB13, LOW); // SCK low + //digitalWrite(MOSI_pin, LOW); // Set MOSI + + } + //digitalWrite(SS_pin[j], HIGH); // SS high again + } + } + //return _receive; // Return the received data + + +int readIntFromSerial(){ + int val = Serial.parseInt(); + while (val == 0){ + delay(100); + val = Serial.parseInt(); + } + return val; +} \ No newline at end of file