Cheers, I never know where to put anything in the forum.
First I'll add my libary which I have adapted from the Liquid Crystall Libary
MAX6955.h
//max6955.h
#ifndef Maxim
#define Maxim
#include "arduino.h"
#include <inttypes.h>
#include "Print.h"
class Maxim6955 : public Print {
public:
Maxim6955(uint8_t address); //constructor
void begin(uint8_t test);
void clear();
virtual size_t write(uint8_t);
using Print::write;
private:
void send(uint8_t);
//void writeI2C();
uint8_t _address;
uint8_t _off;
uint8_t _holder;
uint8_t _string;
uint8_t _d0;
uint8_t _d1;
uint8_t _d2;
uint8_t _d3;
uint8_t _d4;
uint8_t _d5;
uint8_t _d6;
uint8_t _d7;
};
#endif
MAX6955.cpp
//max6955.cpp
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <Wire.h>
#include "Arduino.h"
#include "max6955.h"
Maxim6955::Maxim6955(uint8_t address) {
_address = address;
_off = 0x00;
}
void Maxim6955::begin(uint8_t testMode) {
//start configuring the display
Wire.beginTransmission(_address);
Wire.write(0x01); // Write to the decode resgister;
Wire.write(0b11111111); //decode all digits 1 is decode 0 gives direct access
Wire.write(0x01); //Intensity default, guess I should take this from a pin to see where the dash lights are at...
Wire.write(0x07); // hex easiest way of seeing which digits to scan (all 8 is 0x07)
Wire.write(0x01); // Control Reg 0x01 is shutdown off
Wire.endTransmission();
//device setup to accept charectures now, are we doing a display test?
if(testMode == 1) {
//test is wanted, this lightsup all segments for 1.5 seconds then turns off
Wire.beginTransmission(_address);
Wire.write(0x07); //TestRegister
Wire.write(0x01); //Turn it on
Wire.endTransmission();
delay(1500); //delay 1.5 seconds
Wire.beginTransmission(_address);
Wire.write(0x07); //TestRegister
Wire.write(_off); //Turn it off
Wire.endTransmission();
}
else {
Wire.beginTransmission(_address);
Wire.write(0x07); //TestRegister
Wire.write(_off); //Turn it off
Wire.endTransmission();
} //end test;
} //END BEGIN
/******************* High Level commands */
void Maxim6955::clear() {
//manual function to clear display
_d0 = 32; //space char
_d1 = 32; //space char
_d2 = 32; //space char
_d3 = 32; //space char
_d4 = 32; //space char
_d5 = 32; //space char
_d6 = 32; //space char
_d7 = 32; //space char
Wire.beginTransmission(_address);
Wire.write(0x20); //TestRegister
Wire.write(_d0); //"space" Char
Wire.write(_d1); //"space" Char
Wire.write(_d2); //"space" Char
Wire.write(_d3); //"space" Char
Wire.write(_d4); //"space" Char
Wire.write(_d5); //"space" Char
Wire.write(_d6); //"space" Char
Wire.write(_d7); //"space" Char
Wire.endTransmission();
}
inline size_t Maxim6955::write(uint8_t value) {
send(value);
return 1; // assume sucesss
}
// Send to a string
void Maxim6955::send(uint8_t value) {
_d0 = _d1;
_d1 = _d2;
_d2 = _d3;
_d3 = _d4;
_d4 = _d5;
_d5 = _d6;
_d6 = _d7;
_d7 = value;
//_holder = value;
Wire.beginTransmission(_address);
Wire.write(0x20);
Wire.write(_d0);
Wire.write(_d1);
Wire.write(_d2);
Wire.write(_d3);
Wire.write(_d4);
Wire.write(_d5);
Wire.write(_d6);
Wire.write(_d7);
Wire.endTransmission();
}
now the sketch
//max6955.ino
#include <Wire.h>
#include <max6955.h>
Maxim6955 max1(0x60);
int x = 0;
void setup() {
max1.begin(1);
}
void loop() {
max1.clear();
//delay(500);
max1.print(x);
x++;
delay(1000);
//Serial.println(x);
}
The same also happens if I do not use my libary and insted just send the I2C data by using the following
//////////////////////////////////////////////////////////////////
// The inner workings of the golem...
// brightness pin 2 on arduino
// TMP36 on Pin A0
/////////////////////////////////////////////////////////////////
#include <Wire.h>;
int x = 0; // count the loops to see if we get a hang
int mode = 0; // Default mode theat the system boots up in
int testOff = 0; // for some reason will not let me reite 0x00 tot he system so define it here
int digit0 = 32; // "space char as default - blank digit on boot"
int digit1 = 32; // "space char as default - blank digit on boot"
int digit2 = 32; // "space char as default - blank digit on boot"
int digit3 = 32; // "space char as default - blank digit on boot"
int digit4 = 32; // "space char as default - blank digit on boot"
int digit5 = 32; // "space char as default - blank digit on boot"
int digit6 = 32; // "space char as default - blank digit on boot"
int digit7 = 32; // "space char as default - blank digit on boot"
byte numbers[10]; //array to hold the numbers in , not sure It i will need
int max1 = 0x60; //address of first max6955 chip
int brightness = 0x0D; //original brightness level
int tempPin = A0;
//////////////////////////////////////////////////////////////////
// MAX6955 REGISTERS
//////////////////////////////////////////////////////////////////
int regDecode = 0x01;
int regIntens = 0x02;
int regScan = 0x03;
int regConfig = 0x04;
int regTest = 0x07;
//////////////////////////////////////////////////////////////////
// END REGISTER SETUP
//////////////////////////////////////////////////////////////////
void setup() {
pinMode(2, INPUT);
//pinMode(tempPin, INPUT);
Serial.begin(9600);
Wire.begin(0x00);
wireSetup();
show(); //sends initial chars to the display
//setup nuumbers
numbers[0] = 48;
numbers[1] = 49;
numbers[2] = 50;
numbers[3] = 51;
numbers[4] = 52;
numbers[5] = 53;
numbers[6] = 54;
numbers[7] = 55;
numbers[8] = 56;
numbers[9] = 57;
numbers[0] = 48;
Serial.println("End Setup"); //for debug, lets me know when its free.
}
void loop() {
/////////////// count demo////////////////////
for(int x=0; x<10000; x++){
if(x<10) {
digit0 = numbers[0];
digit1 = numbers[0];
digit2 = numbers[0];
digit3 = numbers[x];
}
else if(x<100) {
digit0 = numbers[0];
digit1 = numbers[0];
digit2 = numbers[x / 10];
digit3 = numbers[x % 10];
}
else if(x<1000) {
digit0 = numbers[0];
digit1 = numbers[x / 100];
digit2 = numbers[(x % 100)/10];
digit3 = numbers[x % 10];
}
else if(x<10000) {
digit0 = numbers[x / 1000];
digit1 = numbers[(x % 1000)/100];
digit2 = numbers[(x % 100)/10];
digit3 = numbers[x % 10];
}
show();
delay(50);
}
//////END COUNT DEMO ????????????????????
} //end loop
void show() {
Wire.beginTransmission(max1);
Wire.write(0x02);
Wire.write(brightness);
Wire.endTransmission();
Wire.beginTransmission(max1);
Wire.write(0x20);
Wire.write(digit0);
Wire.write(digit1);
Wire.write(digit2);
Wire.write(digit3);
Wire.write(digit4);
Wire.write(digit5);
Wire.write(digit6);
Wire.write(digit7);
Wire.endTransmission();
////////////////////////
// serial debug //
////////////////////////
Serial.print(char(digit0));
Serial.print(char(digit1));
Serial.print(char(digit2));
Serial.print(char(digit3));
Serial.print(char(digit4));
Serial.print(char(digit5));
Serial.print(char(digit6));
Serial.println(char(digit7));
/////////////////////////
// end serial debug //
/////////////////////////
}
void wireSetup() {
Wire.beginTransmission(max1);
Wire.write(regTest);
Wire.write(0x01);
Wire.endTransmission();
delay(1500);
Wire.beginTransmission(max1);
Wire.write(regTest);
Wire.write(testOff);
Wire.endTransmission();
Wire.beginTransmission(max1);
Wire.write(regDecode);
Wire.write(0b11111111); //decode all digits 1 is decode 0 gives direct access
Wire.write(0x01); //Intensity default, guess I should take this from a pin to see where the dash lights are at...
Wire.write(0x07); // hex easiest way of seeing which digits to scan (all 8 is 0x07)
Wire.write(0x01); // Control Reg 0x01 is shutdown off
Wire.endTransmission();
}
Any help would be greatly apprechiated.
I have narrowed it down to the arduino, and the fact that it hangs / stops says to me its running out of ram, if I reset the arduino (withouth disturbing the power supply), it will start from the beggining, so it appears not to be the display chip.
Finally, if I enable the serial output, it stops sending serial data when it hangs also.
Many thanks
Jimmy