it seems to be a BAUD rate issue?: sending 8 bits took 28us for the Pro-Mini and 37us for the Teency. added 300us delay between writes and stabilized the display, but its not a good solution
#include <SPI.h>
//const int cs=5; //chip select
#include "Wire.h"
int analogPin = 0;
#define SPICLOCK 13 //sck
#define DATAIN 12 //MISO
#define DATAOUT 11 //MOSI
#define led 13
#define BlueLED 0
#define BlueBtn 1
#define OrngBtn 2
#define OrngLED 3
#define ASecnd 8
boolean i = true;//false
boolean j = true;//false
#define RTC 9 // Real time clock
#define ClockSelect 10 //ss10 clock display
int pin = 2;
int val = 0;
int Tempr=0;
#define I2C_ADDRESS 0x77
int AnaVal=10;
int digit3=1; //this is the display digits
int digit2=0;
int digit1=2;
int digit0=2;
void setup()
{
pinMode(BlueBtn, INPUT_PULLUP );
pinMode(OrngBtn, INPUT_PULLUP);
pinMode(ASecnd, INPUT);
pinMode(led, OUTPUT);
pinMode(BlueLED, OUTPUT);
pinMode(OrngLED, OUTPUT);
digitalWrite(led, HIGH);
digitalWrite(led, LOW);
Serial.begin(9600);
RTC_init();
//day(1-31), month(1-12), year(0-99), hour(0-23), minute(0-59), second(0-59)
// SetTimeDate(14,3,16,21,25,7);
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
pinMode(ClockSelect, OUTPUT);
pinMode( RTC, OUTPUT);
attachInterrupt(7, interupt, FALLING);//
digitalWrite(ClockSelect, HIGH); //disable device
digitalWrite(RTC, HIGH); //disable device
write_led_numbersClock(0x78,0x78,0x78,0x78); //Blank display
write_led_decimalsClock(0x18); // TIME COLAN ON 0X10= AM 0X18=PM
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
clr=SPSR;
clr=SPDR;
digitalWrite(led, HIGH);
}
void loop() {
j =digitalRead(BlueBtn);
digitalWrite(BlueLED, j);
i =!digitalRead(ASecnd);
digitalWrite(OrngLED, i);
Serial.println(ReadTimeDate());
delay(100);
int digit3=1; //this is the display digits
int digit2=0;
int digit1=2;
int digit0=9;
write_led_numbersClock(digit3, digit2, digit1, digit0); // the display looks like12:34
}
// Serial.println(ReadTimeDate());
void interupt() // interupt service 1 Hz
{
// digitalWrite(OrngLED, i);
}
//******************calls
void SetTime()
{
int digit3=1; //this is the display digits
int digit2=0;
int digit1=2;
int digit0=9;
write_led_numbersClock(digit3, digit2, digit1, digit0); // the display looks like12:34
}
//*****CALL****
void write_led_decimalsClock(int value)
{
digitalWrite(ClockSelect, LOW);
delay(10);
spi_transfer(0x77); // Decimal Point OpCode
spi_transfer(value); // Decimal Point Values
delay(10);
digitalWrite(ClockSelect, HIGH); //release chip, signal end transfer
}
//*****CALL****
void write_led_numbersClock(int digit1, int digit2, int digit3, int digit4)
{
digitalWrite(ClockSelect, LOW);
// delay(1); //was 10ms
spi_transfer(digit1); // Thousands Digit
delayMicroseconds(300) ;
spi_transfer(digit2); // Hundreds Digit
delayMicroseconds(300) ;
spi_transfer(digit3); // Tens Digit
delayMicroseconds(300) ;
spi_transfer(digit4); // Ones Digit
delay(1);
digitalWrite(ClockSelect, HIGH); //release chip, signal end transfer
}
//=====================================
int RTC_init(){
pinMode(RTC,OUTPUT); // chip select
// start the SPI library:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3); // both mode 1 & 3 should work
//set control register
digitalWrite(RTC, LOW);
SPI.transfer(0x8E);
//0110 0000
//0110 0100 enable 1Hz
SPI.transfer(0x64); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
digitalWrite(RTC, HIGH);
delay(10);
}
//=====================================
int SetTimeDate(int d, int mo, int y, int h, int mi, int s){
int TimeDate [7]={s,mi,h,0,d,mo,y};
for(int i=0; i<=6;i++){
if(i==3)
i++;
int b= TimeDate/10;
int a= TimeDate-b*10;
if(i==2){
if (b==2)
b=B00000010;
else if (b==1)
b=B00000001;
}
TimeDate= a+(b<<4);
digitalWrite(RTC, LOW);
SPI.transfer(i+0x80);
SPI.transfer(TimeDate);
digitalWrite(RTC, HIGH);
}
}
//=====================================
String ReadTimeDate(){
String temp;
int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
if(i==3)
i++;
digitalWrite(RTC, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(RTC, HIGH);
int a=n & B00001111;
if(i==2){
int b=(n & B00110000)>>4; //24 hour mode
if(b==B00000010)
b=20;
else if(b==B00000001)
b=10;
TimeDate=a+b;
}
else if(i==4){
int b=(n & B00110000)>>4;
TimeDate=a+b*10;
}
else if(i==5){
int b=(n & B00010000)>>4;
TimeDate=a+b*10;
}
else if(i==6){
int b=(n & B11110000)>>4;
TimeDate=a+b*10;
}
else{
int b=(n & B01110000)>>4;
TimeDate=a+b*10;
}
}
temp.concat(TimeDate[4]);
temp.concat("/") ;
temp.concat(TimeDate[5]);
temp.concat("/") ;
temp.concat(TimeDate[6]);
temp.concat(" ") ;
temp.concat(TimeDate[2]);
temp.concat(":") ;
temp.concat(TimeDate[1]);
temp.concat(":") ;
temp.concat(TimeDate[0]);
return(temp);
}
char spi_transfer(volatile char data) //SPI Bus setup
{
SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
{
};
return SPDR; // return the received byte
}
/* if (Thours10==1)
{write_led_numbersClock(digit3, digit2, digit1, digit0);} // the display looks like12:34
else
{write_led_numbersClock(0x78, digit2, digit1, digit0); } // the display looks like 1:23
*/