Pages: [1]   Go Down
Author Topic: Displaying temperature on a MAX6951  (Read 426 times)
0 Members and 1 Guest are viewing this topic.
Nova Scotia
Offline Offline
Full Member
***
Karma: 4
Posts: 186
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I found code for driving the MAX6951 on this site that displays digits from the serial terminal. I've modified the code and attached a 1-wire temperature ic but the digits are pushed to the far left of the display with what was zeros to the right.  0x03 in the SCANLIMIT_ADDRESS will knock off the trailing zeros but I was wondering if the temperature can easily be pushed to the right. I believe that having SCANLIMIT_ADDRESS to 0x0F and putting blank digits in the first two spots will work but I have no idea how to do this.


Code:

/*
Using SPI for interfacing to MAX6951

- pin 13      SCK      SPI clock  ,DISPLAY CLK, PIN#2    
- pin 12      MISO     SPI master in, slave out  ,NOT USED
- pin 11      MOSI     SPI master out, slave in ,DISPLAY DIN, PIN#4
- pin 10      SS       SPI slave select, DISPLAY CS, PIN#3

The default SPI configuation is as follows:

- SPI Master enabled
- MSB of the data byte transmitted first
- SPI mode 0 (CPOL = 0, CPHA = 0)
- SPI clock frequency = system clock / 4

*/
#include <studio.h>
#include <OneWire.h>  //for DS18S20 temp sensor
#include <SPI.h>  // bring in SPI Library
// SPI uses hardware Chip Select vs having device address
#define DECODE_ADDRESS 0x01// 0x07, all 8 on
#define INTENSITY_ADDRESS 0x02 // 0x07 to start, half intensity 02
#define SCANLIMIT_ADDRESS 0x03 // 0x07, all 8 on  
#define CONFIG_ADDRESS 0x04
// 0000 0001 => 0 shutdown, 1 = normal mode, no fooling with blink modes & stuff
// 0000 0010 = not used
// 0000 0100 => 0  slow blink, 1 = fast blink
// 0000 1000 => 0 = global blink disabled (Plane 1 data ignored), 1  global blink enabled Plane 1 data used)
// 0001 0000 => 0 = blink unaffected during I2C acknowledge
// 0010 0000 => 0 = data unaffected during I2C ack, 1 = data cleared
// 0100 0000 => not used
// 1000 0000 => blank phase - blink status is read back

// for this use: 0000 0101 => normal operation, fast blink
#define DISPLAYTEST_ADDRESS 0x07 // 0x01, on, 0x00 off 07
#define DIGIT0_ADDRESS 0x20 // write Plane 0 20
#define DIGIT1_ADDRESS 0x21 // write Plane 0 21
#define DIGIT2_ADDRESS 0x22 // write Plane 0
#define DIGIT3_ADDRESS 0x23 // write Plane 0
#define DIGIT4_ADDRESS 0x24 // write Plane 0
#define DIGIT5_ADDRESS 0x25 // write Plane 0
#define DIGIT6_ADDRESS 0x26 // write Plane 0
#define DIGIT7_ADDRESS 0x27 // write Plane 0

int DS18S20_Pin = 0; //DS18S20 Signal pin on digital 0
int ColonLED=3;
const int slaveSelectPin = 10;

int led = 3;
//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

void setup()
{
 Serial.begin(9600); //monitor Temp
 // define pins used - 13,12,11,10 defined by SPI
 pinMode(ColonLED, OUTPUT);
 //pinMode(SS, OUTPUT);
 pinMode (slaveSelectPin, OUTPUT);
 
 pinMode(led, OUTPUT);

 // start up SPI
 SPI.begin(); // nothing in () because we are the master

 //  write config register  
 digitalWrite(slaveSelectPin,LOW);
 SPI.transfer(CONFIG_ADDRESS);  // select the Address,
 SPI.transfer(0x05);      // select the data 5
 digitalWrite(slaveSelectPin,HIGH); // take the SS pin high to de-select the chip:
 

 //  write intensity register
 digitalWrite(slaveSelectPin,LOW);
 SPI.transfer(INTENSITY_ADDRESS);  // select the Address,
 SPI.transfer(0x00);  //DIM Display  ,0x0E is full brightness
 
 
 digitalWrite(slaveSelectPin,HIGH); // take the SS pin high to de-select the chip:
 //Serial.println("intensity register");

 // write scanlimit register
 digitalWrite(slaveSelectPin,LOW); // take the SS pin low to select the chip:
 SPI.transfer(SCANLIMIT_ADDRESS);  // select the Address,
 SPI.transfer(0x0F);      // select the data //Was 0F
 digitalWrite(slaveSelectPin,HIGH); // take the SS pin high to de-select the chip:
 
 // write decode register
 digitalWrite(slaveSelectPin,LOW); // take the SS pin low to select the chip:
 SPI.transfer(DECODE_ADDRESS);  // select the Address,
 SPI.transfer(0xFF);      // select the data, FF
 //digitalWrite(SS,HIGH);   // take the SS pin high to de-select the chip:
 digitalWrite(slaveSelectPin,HIGH);
 //Serial.println("decode register");

 //display test  
 digitalWrite(slaveSelectPin,LOW); // take the SS pin low to select the chip:
 SPI.transfer(DISPLAYTEST_ADDRESS);  // select the Address,
 SPI.transfer(0x00);      // select the data,01
 digitalWrite(slaveSelectPin,HIGH); // take the SS pin high to de-select the chip:
 delay (1000);
}


void loop()
{  
  float temperature = getTemp();
  int t = temperature*100;  //get rid of decimel point

  int ones = t%10;
  int tens = (t/10)%10;
  int hundreds = (t/100)%10;
  int thousands = (t/1000)%10;
  write_digits(0x00,0x00,ones,tens,hundreds+0x80,thousands); //0x80 is the decimal
}

static void write_digits(int u, int v,int w,int x, int y, int z)
{
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT5_ADDRESS);
   SPI.transfer(u);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT4_ADDRESS);
   SPI.transfer(v);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT3_ADDRESS);
   SPI.transfer(w);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT2_ADDRESS);  // select the Address,
   SPI.transfer(x);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT1_ADDRESS);  // select the Address,
   SPI.transfer(y);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
  
   digitalWrite(slaveSelectPin,LOW);
   SPI.transfer(DIGIT0_ADDRESS);  // select the Address,
   SPI.transfer(z);      // select the data
   digitalWrite(slaveSelectPin,HIGH);
}

float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
  
  ds.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  float test = ((MSB << 8) | LSB);
  return TemperatureSum;
}


« Last Edit: December 18, 2012, 07:19:16 am by 0miker0 » Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45935
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

At 77 posts, you REALLY should know how to post code properly. Modify your post, and do it right. The # icon is there for a reason. Use it!
Logged

Nova Scotia
Offline Offline
Full Member
***
Karma: 4
Posts: 186
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I have corrected post by posting code the proper way. Thanks PaulS.

Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 547
Posts: 45935
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
with what was zeros to the right.
What are they now?

Quote
I believe that having SCANLIMIT_ADDRESS to 0x0F and putting blank digits in the first two spots will work but I have no idea how to do this.
So, experiment. Just set SCANLIMIT_ADDRESS to 0x0F and make no other changes. What happens?

A link to the device in question would be useful.
Logged

Pages: [1]   Go Up
Jump to: