| ??? 05/14/09 13:39 Read: times |
#165332 - Please format your code Responding to: ???'s previous message |
You will clearly never get anywhere programming without neatly formatted code. A compiler does not care but humans DO.
By the sound of it you have written real values to the device registers, and read garbage back. Trace your code. Get your write() and read() functions correct and you will be happy. Hint. SCLK should be zero in between bytes.
#include "8051.h"
#include "serial.h"
#define SCLK P2_0
#define DATA_IO P2_1
#define RESET_ P2_2
#define YELLOW_LED P3_6
#define RED_LED P3_7
unsigned char serial_storage = 0x00;
unsigned char display;
void usec_wait(unsigned char);
void msec_wait(unsigned char);
void sec_wait(unsigned char);
void convert_and_send(unsigned char);
unsigned char receive_convert(void);
//**************************************************************
//DELAY FUNCTIONS - USEC_WAIT ; MSEC_WAIT ; SEC_WAIT
//**************************************************************
void usec_wait(unsigned char k)
{
while (k != 0) {
k--;
}
}
//////////////////////////////////////////////////////
void msec_wait(unsigned char j)
{
while (j != 0) {
usec_wait(165);
j--;
}
}
//////////////////////////////////////////////////////
void sec_wait(unsigned char sec_count)
{
while (sec_count != 0) {
msec_wait(250);
msec_wait(250);
msec_wait(250);
msec_wait(250);
sec_count--;
}
}
//////////////////////////////////////////////////////
//**************************************************************
//SERIAL INTERRUPT FUNCTION
//**************************************************************
void serial_interrupt() interrupt 4
{
if (TI)
TI = 0;
if (RI) {
serial_storage = SBUF;
usec_wait(1);
RI = 0;
RED_LED = 1;
}
}
//*******************************************************************
//FUNCTION THAT SENDS ADDRESS OR DATA_IO AFTER CONVERTING IT TO BITS
//*******************************************************************
void convert_and_send(unsigned char hex_data1)
{
bit sending_bit;
unsigned char comparing_byte = 0x01;
unsigned char i;
unsigned char storing_byte = 0x00;
SBUF = hex_data1;
usec_wait(5);
for (i = 0; i < 8; i++) {
storing_byte = (hex_data1 & comparing_byte);
if (storing_byte == 0x00)
sending_bit = 0;
else
sending_bit = 1;
SCLK = 0;
SCLK = 0;
DATA_IO = sending_bit; //Clock to DATA_IO delay is 250ns (max)
comparing_byte <<= 1;
SCLK = 1;
}
serial_storage = 0x00;
usec_wait(2);
}
//**************************************************************************************
//FUNCTION THAT RECEIVES DATA AND THEN CONVERTS IT TO CHARACTER AND PASSES TO ITS CALLER
//**************************************************************************************
unsigned char receive_convert(void)
{
bit receiving_bit;
unsigned char comparing_byte = 0x00;
unsigned char i = 0;
unsigned char received_data = 0x00;
for (i = 0; i < 8; i++) {
SCLK = 1;
SCLK = 1; //For giving a DEALY
SCLK = 0;
receiving_bit = DATA_IO;
if (receiving_bit == 0)
comparing_byte = 0x00;
else
comparing_byte = 0x80; //comparing byte is 10000000 as the bit is to be placesd in the MSB position
received_data = received_data >> 1;
received_data = received_data | comparing_byte;
}
return (received_data);
}
void main()
{
initialize_serial(); //INITIALIZES THE SERIAL PORT
//FUNCTION THAT INITIALIZES THE TIMMER IC BY SETTING CH AND WP BIT
RED_LED = 0; //BOTH LED's GLOW WHEN THE RTC IS BEING SET
YELLOW_LED = 0;
RESET_ = 1;
msec_wait(1);
convert_and_send(0x8E); //SETS THE WP BIT AS ZERO
msec_wait(1);
convert_and_send(0x00);
RESET_ = 0;
msec_wait(1);
RESET_ = 1;
msec_wait(1);
convert_and_send(0x80); //SETS THE CH BIT AS ZERO
msec_wait(1);
convert_and_send(0x00);
RESET_ = 0;
msec_wait(1);
sec_wait(4);
RESET_ = 1; //INITIALIZING the HT1380
msec_wait(1);
convert_and_send(0xBE); //Burst Mode Command
msec_wait(1);
convert_and_send(0x00); //Sec register, Including the CH=0
msec_wait(1);
convert_and_send(0x00); //min
msec_wait(1);
convert_and_send(0x10); //hour
msec_wait(1);
convert_and_send(0x10); //date
msec_wait(1);
convert_and_send(0x05); //month
msec_wait(1);
convert_and_send(0x07); //day
msec_wait(1);
convert_and_send(0x08); //year
msec_wait(1);
RESET_ = 0;
msec_wait(10);
RESET_ = 1;
msec_wait(1);
convert_and_send(0x8E); //SETS THE WP BIT AS ONE
msec_wait(1);
convert_and_send(0x80);
RESET_ = 0;
RED_LED = 1; //BOTH LED's TURN OFF WHEN THE RTC TIME HAS BEEN SET
YELLOW_LED = 1;
while (1) {
RED_LED = 0; //This shows that only the while loop is running and system is waiting for command(REGISTER ADDRESS)
msec_wait(500);
if (serial_storage != 0x00) {
RED_LED = 1; //This shows that the serial_storage has the character
RESET_ = 1;
convert_and_send(serial_storage); //sending the address of the register that we want to read from
msec_wait(1);
display = receive_convert(); //putting the read DATA_IO into display
RESET_ = 0;
SBUF = display; //sending the read DATA_IO serially to the computer
msec_wait(2);
display = 0x00;
} else {
RED_LED = 1;
msec_wait(500);
}
}
}
David. |



