Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem max32630fthr USBDevice
Fork of FTHR_SD_Demo by
Diff: main.cpp
- Revision:
- 18:d913ec9dd9c2
- Parent:
- 17:401a5bb8d403
- Child:
- 19:7081d6f6288b
--- a/main.cpp Fri Aug 31 19:28:28 2018 +0000
+++ b/main.cpp Fri Aug 31 19:47:40 2018 +0000
@@ -4,46 +4,8 @@
#include "USBSerial.h"
#include <ctype.h>
-
-#define I2C_ADDRESS 0x30 // DS2484 I2C address
-#define DS2484_ADD 0x30 // DS2484 I2C write address
-
-
#define PERIOD 10 // Logging period in seconds
-//DS2484 Status register bits
-#define OWB 0x01 // status reg, One Wire Busy
-#define PPD 0x02 // status reg, Presence Pulse Detected
-#define SD 0x04 // status reg, Short Detected
-#define LL 0x08 // status reg, Logic Level
-#define RST 0x10 // status reg, Device Reset (DS2484 Reset)
-#define SBR 0x20 // status reg, Single Bit Result
-#define TSB 0x40 // status reg, Triplet Second Bit
-#define DIR 0x80 // status reg, Branch Direction Taken
-//DS2484 Command bytes
-#define RESET 0xF0 // DS2484 Reset
-#define SRP 0xE1 // DS2484 Set Read Pointer
-#define WDC 0xD2 // DS2484 Write Device Configuration
-#define ACP 0xC3 // DS2484 Adjust one wire Control Port
-#define OW_RESET 0xB4 // DS2484 One Wire Reset
-#define OW_SB 0x87 // One Wire Single Bit (write or read)
-#define OWWB 0xA5 // One Wire Write Byte
-#define OWRB 0x96 // One Wire Read Byte
-#define OWT 0x78 // One Wire Triplet (read 2 bits, write 1 bit)
-//One Wire Commands
-#define OW_SEARCH 0xF0 // Search Rom
-#define OW_READ 0x33 // Read Rom
-#define OW_MATCH 0x55 // Match Rom
-#define OW_SKIP 0xCC // Skip Rom
-#define OW_OD_MATCH 0x69 // Match Rom
-#define OW_OD_SKIP 0x3C // Skip Rom
-#define OW_ALARM 0xEC // Alarm Search
-// OT07 OW commands
-#define OT07_OW_CONVERT 0x44 //OT07 OW convert temperature command
-#define OT07_OW_WRITE 0xCC // OT07 OW Write Register command
-#define OT07_OW_READ 0x33 // OT07 OW Read Register command
-#define OT07_OW_RESET 0x82 // OT07 OW Soft Reset command
-
//OT07 Registers
#define OT07_STATUS 0x00 // OT07 status regiter
#define OT07_INT_EN 0x01 // OT07 Interrupt Enable
@@ -224,227 +186,6 @@
}
// *****************************************************************************
-// OW_reset()
-// returns 0 no device present, 1 device present
-// *****************************************************************************
-
-int OW_reset(){
- char data[2]; // define as minimun array size so 'data' is a pointer
- data[0] = OW_RESET; // One Wire Reset 0xB4
- i2c.write(DS2484_ADD,data,1,0); // write reset command to DS2484
- wait_ms(1);
- do{ // poll OW-busy
- i2c.read(DS2484_ADD,data,1); // read back status byte from DS2484
- }while(OWB & data[0]);
- if(PPD & data[0])return 1; // Presence Pulse Detected bit true?
- return 0; // else
-} // end OW_reset()
-
-// *****************************************************************************
-// OW_write_byte(char) takes char to send over one wire
-// returns DS2484 status byte
-// *****************************************************************************
-
-char OW_write_byte(char byte){
-
- char data[2];
- data[0] = 0xA5;
- data[1] = byte;
- i2c.write(DS2484_ADD,data,2,1);
- i2c.read(DS2484_ADD,data,1); // read status byte
-
- // db.printf("[%02X]",byte);
- wait_us(700); // assumes normal speed OW write
- return data[0]; // return DS2484 Status byte
-
-}// end OW_write_byte()
-
-
-// *****************************************************************************
-// OW_read_byte(char *, int) char* (save data pointer)
-// int (number of bytes to read)
-// returns 0x00
-//
-// assumes OW_reset, OW_match rom, and OW device register read address already sent.
-//
-// *****************************************************************************
-
-char OW_read_byte(char* a, int n){
-
- char data[2];
- int i;
-
- //read n bytes of data
- i=0;
- do{
- data[0] = OWRB; // send 0x96; DS2484 command, OW read byte
- i2c.write(DS2484_ADD,data,1,0);
- wait_us(600);
- do{
- i2c.read(DS2484_ADD,data,1); // read status byte and test OW-busy?
- }while(data[0]&0x01 == 1); // status bit[0] set --> OW busy
-
- //get byte from DS2484
- data[0] = SRP; // send 0xE1, set read pointer
- data[1] = 0xE1; // set read pointer address 0xE1 read OW data
- i2c.write(DS2484_ADD,data,2,1);
- i2c.read(DS2484_ADD,data,1); // read bytes from OW register
-
- a[i] = data[0];
-
- i++;
- //pc.printf("[%02X] ",data[0]);
- }while(i<n);
- //for(i=0;i<n;i++) db.printf("OW_read_byte - [%2d][%02X]\r\n",i,a[i]);
- return 0x00;
-}// end OW_read_byte()
-
-
-
-// *****************************************************************************
-// OW_match_rom(char *) pointer to device_id byte array
-// returns 0x00
-// assumes OW_reset alread sent
-// *****************************************************************************
-
-char OW_match_rom(char *device_id){
-
- int i;
- //Match rom
- OW_write_byte(OW_MATCH); // send 0x55, match rom command
- //send rom code for device
- for(i=0;i<8;i++){
- OW_write_byte(device_id[i]); //I2C write ow byte
- }
- return 0x00;
-
-}// end OW_macth_rom
-
-
-// *****************************************************************************
-// search_rom(char *) pointer to start of 2D array rom_id_list
-// returns number of devices found
-// *****************************************************************************
-
-
-int search_rom(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all device on OW bus, returns # found
-
- int bit_num;
- int byte_num;
- int last_zero;
- int last_discrep;
- int search_dir;
- int rom_count;
- char byte_mask;
- int last_device;
- int i;
-
- char rom_id[8]; //used in rom search
- char data[8];
- char crc;
-
- //init for first search only
- last_device = 0;
- last_discrep = 0;
- rom_count = 0;
-
- for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
-
- do{ // loop for each rom search (end when last_device = 1)
-
- //init variable for each search
- bit_num = 1;
- byte_num = 0;
- byte_mask = 1;
- last_zero = 0;
-
-
- //OW reset
- if(OW_reset()){ //returns 1 if at least one device present
- //test if last device found
- if(last_device!=1){ // more devices to find
- search_dir = 0;
- OW_write_byte(OW_SEARCH); //send 0xF0 over one wire to init search rom
-
- do{
- //determine search direction
- if(bit_num < last_discrep){ //before last discrepancy
- if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
- search_dir = 1; // last path was 1
- }else{
- search_dir = 0; // last path was 0
- }
- }else{ // at or past last discrepancy
- if(bit_num == last_discrep){ // at last discrepancy
- search_dir = 1; //been here before so use 1
- }else{
- search_dir = 0; //past last discrepancy so use 0
- }
- }
-
- //write direction bit and get reply
- data[0] = 0x78;
- data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
- i2c.write(DS2484_ADD,data,2,1);
-
- wait_us(250);
-
- //read in rom_id bits
- i2c.read(DS2484_ADD,data,1); // read status byte
-
- //(todo) check for no device error here
-
- //get search direction used by triplet command
-
- if(data[0]&0x80){ //true --> DIR bit = 1
- search_dir = 1;
- }else{
- search_dir = 0;
- }
-
- //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
- if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
- if(search_dir == 0)last_zero = bit_num;
- }
- if(search_dir == 1){ // write search dir to rom bit
- rom_id[byte_num] |= byte_mask;
- }else{
- rom_id[byte_num] &= ~byte_mask;
- }
-
- //increment bit_num and byte_num if needed
- bit_num++;
- byte_mask <<= 1; //rotate 1 bit left
- if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
- byte_num++; //also increnent byt num
- byte_mask = 1;
- }
-
-
- }while(bit_num<65); //bit nun started at 1 so end after 64
- last_discrep = last_zero;
- if(last_discrep == 0)last_device = 1;
- //copy rom_id into rom_id_list and calc crc of first 7 bytes
- crc = 0x00; // reset crc8 total to 0
- for(i=7;i>=0;i--){
- rom_id_list[rom_count][i] = rom_id[i];
- }
-
- //clac_crc of rom ID
- for (i=0;i<7;i++){
- crc = calc_crc8(crc, rom_id[i]);
- }
-
- rom_count++;
- }//if(last_device..)
- }else{//if prescent -- if no device present rom count is 0
- return 0;
- }
- }while(last_device == 0);
- return rom_count;
-}// end search_rom()
-
-// *****************************************************************************
// OT07_write_register(char, char, char) writes single byte to OT07
// char I2C address
// char OT07 register address
@@ -577,354 +318,6 @@
return T;
}
-// *****************************************************************************
-// alarm_search(char *) pointer to start of 2D array rom_id_list
-// returns number of devices found with alarm triggered
-// *****************************************************************************
-
-int alarm_search(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all devices with alarm triggered on OW bus, returns # found
-
- int bit_num;
- int byte_num;
- int last_zero;
- int last_discrep;
- int search_dir;
- int rom_count;
- char byte_mask;
- int last_device;
- int i;
-
- char rom_id[8]; //used in rom search
- char data[8];
- char crc;
-
- //init for first search only
- last_device = 0;
- last_discrep = 0;
- rom_count = 0;
-
- for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
-
- do{ // loop for each rom search (end when last_device = 1)
-
- //init variable for each search
- bit_num = 1;
- byte_num = 0;
- byte_mask = 1;
- last_zero = 0;
-
-
- //OW reset
- if(OW_reset()){ //returns 1 if at least one device present
- //test if last device found
- if(last_device!=1){ // more devices to find
- search_dir = 0;
- OW_write_byte(OW_ALARM); //send 0xEC over one wire to init alarm search
-
- do{
- //determine search direction
- if(bit_num < last_discrep){ //before last discrepancy
- if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
- search_dir = 1; // last path was 1
- }else{
- search_dir = 0; // last path was 0
- }
- }else{ // at or past last discrepancy
- if(bit_num == last_discrep){ // at last discrepancy
- search_dir = 1; //been here before so use 1
- }else{
- search_dir = 0; //past last discrepancy so use 0
- }
- }
-
- //write direction bit and get reply
- data[0] = 0x78;
- data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
- i2c.write(DS2484_ADD,data,2,1);
-
- wait_us(250);
-
- //read in rom_id bits
- i2c.read(DS2484_ADD,data,1); // read status byte
-
- //(todo) check for no device error here
-
- //get search direction used by triplet command
-
- if(data[0]&0x80){ //true --> DIR bit = 1
- search_dir = 1;
- }else{
- search_dir = 0;
- }
-
- //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
- if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
- if(search_dir == 0)last_zero = bit_num;
- }
- if(search_dir == 1){ // write search dir to rom bit
- rom_id[byte_num] |= byte_mask;
- }else{
- rom_id[byte_num] &= ~byte_mask;
- }
-
- //increment bit_num and byte_num if needed
- bit_num++;
- byte_mask <<= 1; //rotate 1 bit left
- if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
- byte_num++; //also increnent byt num
- byte_mask = 1;
- }
-
-
- }while(bit_num<65); //bit nun started at 1 so end after 64
- last_discrep = last_zero;
- if(last_discrep == 0)last_device = 1;
- //copy rom_id into rom_id_list and calc crc of first 7 bytes
- crc = 0x00; // reset crc8 total to 0
- for(i=7;i>=0;i--){
- rom_id_list[rom_count][i] = rom_id[i];
- }
-
- //clac_crc of rom ID
- for (i=0;i<7;i++){
- crc = calc_crc8(crc, rom_id[i]);
- }
-
- rom_count++;
- }//if(last_device..)
- }else{//if prescent -- if no device present rom count is 0
- return 0;
- }
- }while(last_device == 0);
-
- //check if rom_id from alarm search is all 1s (this means there was a presence pulse but no alarm is triggered)
- bool bad_rom_id = true;
- for(int i = 0; i < 7; i++)
- {
- if(rom_id_list[0][i] != 0xFF)
- bad_rom_id = false; //found a byte in the rom id that isn't all 1s
- }
- if(bad_rom_id)
- return 0;
-
- return rom_count;
-}// end alarm_search()
-
-
-// ******************** write_OW_register() ********************************
-// write_OW_register(char*, int, int, char*)
-// char* pointer to rom_id
-// int start address
-// int number of bytes to write
-// char* pointer to write data location
-// returns 0 if CRC match data
-// returns -1 if CRC does not match data
-//
-// *****************************************************************************
-
-
-
-int write_OW_register(char *device_ID, int start_add, int n, char *data){
- int i;
- //select device
- OW_reset();
- OW_match_rom(device_ID);
- //set start address
- OW_write_byte(OT07_OW_WRITE); // send 0xCC, OW write register command for OT07
- OW_write_byte(start_add); // send write register start address
- OW_write_byte(n-1); // send length of bytes to write (00-> one byte)
- for(i=0;i<n;i++){ // send n bytes of data
- OW_write_byte(data[i]);
- }
- OW_read_byte(data,2); // read 2 byte CRC
-
- // --- todo ----
- // calculate CRC of
- // Command + length + n bytes sent
- // compare with 2 bytes read
-
- return 0;
-
-}//end write_OW_register
-
-
-
-
-// ******************** read_OW_register() ********************************
-// read_OW_register(char*, int, int, char*)
-// char* pointer to rom_id
-// int start address
-// int number of bytes to read, not including CRC bytes
-// char* pointer to save data location
-// returns 0 if CRC match data
-// returns -1 if CRC does not match data
-//
-// *****************************************************************************
-
-
-
-int read_OW_register(char *device_ID, int start_add, int n, char *data){
-
- //int i;
- //select device
- OW_reset();
- OW_match_rom(device_ID);
- //set start address
- OW_write_byte(OT07_OW_READ); // send 0x33, OW read register command for OT07
- OW_write_byte(start_add); // send read register start address
- OW_write_byte(n-1); // send length of bytes to read (0 -> 1 byte)
- OW_read_byte(data,n+2); // read n bytes plus 2 byte CRC
-
- // --- todo ----
- // calculate CRC of
- // Command + length + n bytes
- // compare with last 2 bytes read
- return 0;
-
-}//end read_OW_register
-
-int set_test_mode(char *device_id){
- char data[4];
-
- // enter test mode
- OW_reset();
- OW_match_rom(device_id); // match ROM
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0xFF); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x54); // first half of test mode pass code
- OW_read_byte(data,2); // read 2 byte CRC
-
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0xFF); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x4D); // second half of test mode pass code
- OW_read_byte(data,2); // read 2 byte CRC
-
- // set ADC_ENABLED
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0x81); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x04); // ADC_ENABLED code
- OW_read_byte(data,2); // read 2 byte CRC
-
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0x98); // device register address
- OW_write_byte(0x05); // number of bytes to write -1
- OW_write_byte(0x40); // add 98 data 40
- OW_write_byte(0xD4); // add 99 data D4
- OW_write_byte(0xE0); // add 9A data E0
- OW_write_byte(0xB3); // add 9B data B3
- OW_write_byte(0x09); // add 9C data 09
- OW_write_byte(0xBA); // add 9D data BA
- OW_read_byte(data,2); // read 2 byte CRC
-
-
- //OTP copy
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0x80); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x82); //
- OW_read_byte(data,2); // read 2 byte CRC
-
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0x80); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x02); //
- OW_read_byte(data,2); // read 2 byte CRC
-
-
- OW_reset();
- OW_match_rom(device_id);
- OW_write_byte(OT07_OW_WRITE); // device write register command
- OW_write_byte(0xFF); // device register address
- OW_write_byte(0x00); // number of bytes to write -1
- OW_write_byte(0x00); // exit Test mode
- OW_read_byte(data,2); // read 2 byte CRC
- return 0;
-}// end set_test_mode()
-
-
-
-// ******************** convert_temperature() ********************************
-// convert_temperature()
-// returns 0
-// dose not block for 0.75 seconds.
-// *****************************************************************************
-
-int convert_temperature(){ // convert sent to all OW devices
-
- char data[8];
- OW_reset();
-
- OW_write_byte(OW_SKIP); // send 0xCC, skip rom command
-
- // activate strong pullup
- data[0] = WDC; // send 0xD2 Write Device Configuration
- data[1] = 0xA5; // 1010 0101 b strong and active pullup on
- i2c.write(DS2484_ADD,data,2,0);
-
- //convert command
- OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
- OW_read_byte(data,2); // read 2 byte CRC
- return 0;
-}
-
-
-// ******************** convert_temperature() ********************************
-// convert_temperature(char *) takes 8 byte rom_id as input
-// returns 0
-// dose not block for 0.75 seconds.
-// *****************************************************************************
-
-int convert_temperature(char *device_id){
-
- char data[8];
- OW_reset();
- OW_match_rom(device_id); // send device id
-
- // activate strong pullup
- data[0] = WDC; // send 0xD2 Write Device Configuration
- data[1] = 0xA5; // 1010 0101 b strong and active pullup on
- i2c.write(DS2484_ADD,data,2,0);
-
- //convert command
- OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
- OW_read_byte(data,2); // read 2 byte CRC
- return 0;
-}
-
-//************************ get_temperature() *********************************
-// get_temperature(char *) takes 8 byte rom_id as input
-// returns double temperature in oC
-//******************************************************************************
-
-double get_temperature(char *device_id){
-
- char t[4];
- double T;
- int count;
- // char data[2];
-
- read_OW_register(device_id,OT07_FIFO_DATA,0x02,t); // Read temperature from FIFO, 2 bytes
- //calculate temperture from data
- count = (int)(t[0]*256 + t[1]);
- if (count >= 32768)count = count - 65536; // 2s comp
- T = (double)count*0.005;
-
- return T;
-}// end get_temperature()
-
void write_settings_file(int interval, bool device_logged[MAX_DEVICES])
{
@@ -1472,27 +865,6 @@
case 'T':
case 't':
- if(n == 2){//get temperatures from selected device
- for(k=0;k<8;k++){
- device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
- }
- convert_temperature(device_id); //send OW convert selected device
- wait(0.02); //wait 20 ms for convert temperature to complete
- T[0] = get_temperature(device_id);
- pc.printf("device[%02X] temperature[%.3f]\r\n",device,T[0]);
- }
- if(n == 3){ // "t 1 5" get temperature for devices 1 thru 5
-
- convert_temperature(); //send OW convert to all devices
- wait(0.02); //wait 750 ms for convert temperature to complete
- for(j=device;j<=arg1;j++){
- for(k=0;k<8;k++){
- device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
- }
- pc.printf("device[%02X] temperature[%.3f]\r\n",j,get_temperature(device_id));
- }
- }
-
if(n == 2){//get temperatures from selected device
@@ -1530,6 +902,7 @@
case 'x':
case 'X': // experimental modes
// ****************** set up ADC enabled in test mode*****************
+ /*
pc.printf("<set ADC_ENABLED in test mode>\r\n");
for(j=0;j<device_count;j++){
@@ -1537,7 +910,7 @@
device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
}
set_test_mode(device_id);
- }
+ } */
break;
@@ -1557,16 +930,23 @@
if(log_flag == true){
if(time_count >= time_to_sample){ //take next sample
time_to_sample += log_interval; // calculate time for next sample
-
+
+ ///////////////////////temp conversion and assignment to T[]//////////////////////////////////////
// start conversion
- convert_temperature();
+ /*convert_temperature();
wait(0.02); //wait 20ms for convert to complete
for(j=0;j<device_count;j++){
for(k=0;k<8;k++){
device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
}
T[j] = get_temperature(device_id);
+ }*/
+ for(j=0;j<device_count;j++){
+ convert_temperature(OT07[j].I2C_address);
+ wait(0.02); //wait 20ms for convert temperature to complete
+ T[j] = get_temperature(OT07[j].I2C_address);
}
+ /////////////////////////////////////////////////////////////////////////////////////////////////
//open file for microSD logging
FILE *fp = fopen(log_file, "a");
