I would very much appreciate if anyone could throw some light on this error, not too hot with "C" as yet.

When I try and compile the following with Keil C51, I get the following error message.

Error C208 DS1302GetAll Too many actual parameters

Seems to be line in Time() function in the following code

/* DS1302 RTC Drivers*/

#pragma SMALL // Small memory model
#include <AT89S8253.h>
#include <intrins.h>
#include <stdio.h>
#include "delay.h"
#include "lcd.h"

//#define ResetWD() WDTCON = WDTCON | 0x02

sbit DS1302Sclk = P0^0;
sbit DS1302Io = P0^1;
sbit DS1302Ce = P0^2;

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__
{
unsigned int Second;
unsigned int Minute;
unsigned int Hour;
unsigned int Date;
unsigned int Month;
unsigned int Week;
unsigned int Year;
}SYSTEMTIME;


//Register address to read and write the definition of the macro
#define SEC_WRITE 0x80
#define SEC_READ 0x81
#define MIN_WRITE 0x82
#define MIN_READ 0x83
#define HOUR_WRITE 0x84
#define HOUR_READ 0x85
#define DATE_WRITE 0x86
#define DATE_READ 0x87
#define MONTH_WRITE 0x88
#define MONTH_READ 0x89
#define WEEK_WRITE 0x8a
#define WEEK_READ 0x8b
#define YEAR_WRITE 0x8c
#define YEAR_READ 0x8d
#define WP_WRITE 0x8e
#define WP_READ 0x8f
#define TCS_WRITE 0x90
#define TCS_READ 0x91
//RAM read and write the address of the macro definition, this address tag used to preserve initialization.
#define SET_FLAG_WRITE 0xc0
#define SET_FLAG_READ 0xc1
//RAM Burst Mode in order to read and write the word
#define RAM_BURST_WRITE 0xfe
#define RAM_BURST_READ 0xff
//Burst Mode Register command to read and write the word
#define CLOCK_BURST_WRITE 0xbe
#define CLOCK_BURST_READ 0xbf
//Write-protect settings
#define WP_ON 0x80
#define WP_OFF 0x00
//Macro definition: DS1302 has been initialized.
#define IS_SET 0xAA
#define NOT_SET 0x00
//Of CE, IO, SCLK line operation of the macro definition of the purpose of doing so are a platform for future transfer to other convenience, but, when
//The pin number of the design time, it can take to do it?
#define SETB_DS1302_CE(); DS1302Ce = 1;
#define CLR_DS1302_CE(); DS1302Ce = 0;
#define SETB_DS1302_SCLK(); DS1302Sclk = 1;
#define CLR_DS1302_SCLK(); DS1302Sclk = 0;
#define PUT_DS1302_IO(); DS1302Io = ACC0;
#define GET_DS1302_IO(); ACC7 = DS1302Io;

// Variables (Global)
char buf[16]; // LCD Display Buffer

//Prototypes
void serial_init(void);
void DS1302Init(void);
void DS1302SetWP(unsigned int Flag);
void DS1302WriteByte(unsigned int Data);
unsigned int DS1302ReadByte(void);
void DS1302SetAll(SYSTEMTIME *Time);
void DS1302GetAll(SYSTEMTIME *Time);
void Time(void);

void main(void)
{
serial_init();
lcd_init();
lcd_clear();

while(1)
{
Time();
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
DelayMs(255);DelayMs(255);DelayMs(255);DelayMs(255);
}
}


/////////////////////////////////////////////////////////////////////////////
void serial_init (void)
{
TMOD = 0x20; // Timer 1 mode 2: 8-Bit reload
TH1 = 0x98; // Reload value 300 baud
SCON = 0x52; // Mode 1: 8-bit UART, enable receiver TI remains set
TR1 = 1; // Timer 1 run
ES = 0; // Disable serial port interrupt
EA = 0; // Disable

//WDTCON = WDTCON | 0xEA; // Initial Watchdog Setup 2048Ms
//WDTCON = WDTCON | 0x01; // Enable WatchDog WDTEN Set
}
/////////////////////////////////////////////////////////////////////////////
void Time(void)
{
unsigned int Second,Minute,Hour,Date,Month,Week,Year;

DS1302Init();
lcd_goto(0x00);


//PROBLEM HERE//
DS1302GetAll(Second, Minute, Hour, Date, Month, Week, Year);


sprintf (buf," %02u/%02u/%02u% 02u:%02u",Date,Month,Year,Hour,Minute);lcd_puts(buf);
printf("Date%02u/%02u/%02u\n\rTime%02u:%02u\n\r",Date,Month,Year,Hour,Minute);
DelayMs(250);
}
////////////////////////////////////////////////////////////////////////////////////
void DS1302Init(void)
{
unsigned int Flag;
SYSTEMTIME TimeInit;

SETB_DS1302_CE();
DS1302SetWP(WP_OFF);
DS1302WriteByte(SET_FLAG_READ);
Flag = DS1302ReadByte();

if (Flag != IS_SET)
{
DS1302WriteByte(SET_FLAG_WRITE); //RAM 0xaa, DS1302WriteByte (SET_FLAG_WRITE); / / in the RAM in the first byte write 0xaa, that has been initialized.
DS1302WriteByte(IS_SET);
TimeInit.Second = 0x00; //TimeInit.Second = 0x00; / / initialization time.
TimeInit.Minute = 0x00;
TimeInit.Hour = 0x00;
TimeInit.Date = 0x12;
TimeInit.Month = 0x03;
TimeInit.Week = 0x06;
TimeInit.Year = 0x09;
DS1302SetAll(&TimeInit);
}
DS1302SetWP(WP_ON); //DS1302SetWP (WP_ON); / / open a write-protected.
CLR_DS1302_CE(); //CE?,DS1302 CLR_DS1302_CE (); / / release CE line, in order to avoid misoperation of the DS1302.
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1302SetWP(unsigned int Flag)
{
DS1302WriteByte(WP_WRITE); // DS1302WriteByte (WP_WRITE); / / write the word order.
DS1302WriteByte(Flag); // DS1302WriteByte (Flag); / / write the contents of registers.
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1302WriteByte(unsigned int Data)
{
unsigned int i;
ACC = Data;
for (i=8;i>0;i--) //ACC,SCLK,ACC for (i = 8; i> 0; i -) / / each write a minimum of ACC, and then sent on a SCLK is pulsed, ACC shifted to right for each one.
{
CLR_DS1302_SCLK();
PUT_DS1302_IO();
SETB_DS1302_SCLK();
ACC = ACC >> 1;
}
CLR_DS1302_SCLK(); //, CLR_DS1302_SCLK (); / / the negative hopping are read in order to prepare the next byte, and
//Do not know why, if the statement read into the next function, on how not right.
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int DS1302ReadByte(void)
{
unsigned int i;
for(i=8; i>0; i--) //IOACC,ACC?? for (i = 8; i> 0; i -) / / Add after each IO to read the highest ACC, then sending a negative jump, read the next, each ACC is also
//Shifted to right one.
{
ACC = ACC >>1;
GET_DS1302_IO();
SETB_DS1302_SCLK();
CLR_DS1302_SCLK();
}
return(ACC);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1302SetAll(SYSTEMTIME *Time)
{
SETB_DS1302_CE(); //CE,DS1302 SETB_DS1302_CE (); / / raises CE line, the DS1302 is ready to operate.
DS1302SetWP(WP_OFF); //DS1302SetWP (WP_OFF); / / turn off write-protected.
CLR_DS1302_CE(); //CE,DS1302 CLR_DS1302_CE (); / / release CE line, in order to avoid misoperation of the DS1302.

SETB_DS1302_CE(); //CE,DS1302 SETB_DS1302_CE (); / / raises CE line, the DS1302 is ready to operate.
DS1302WriteByte(CLOCK_BURST_WRITE); //Burst Mode Write DS1302WriteByte (CLOCK_BURST_WRITE); / / enter Burst Mode Write.
DS1302WriteByte(Time->Second);
DS1302WriteByte(Time->Minute);
DS1302WriteByte(Time->Hour);
DS1302WriteByte(Time->Date);
DS1302WriteByte(Time->Month);
DS1302WriteByte(Time->Week);
DS1302WriteByte(Time->Year);
DS1302SetWP(WP_ON); //DS1302SetWP (WP_ON); / / open a write-protected.
CLR_DS1302_CE(); //CE,DS1302???? CLR_DS1302_CE (); / / release CE line, in order to avoid misoperation of the DS1302.
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1302GetAll(SYSTEMTIME *Time)
{
SETB_DS1302_CE(); //CE,DS1302 SETB_DS1302_CE (); / / raises CE line, the DS1302 is ready to operate.
DS1302WriteByte(CLOCK_BURST_READ); //Burst Mode Read? DS1302WriteByte (CLOCK_BURST_READ); / / enter Burst Mode Read.
Time->Second = DS1302ReadByte();
Time->Minute = DS1302ReadByte();
Time->Hour = DS1302ReadByte();
Time->Date = DS1302ReadByte();
Time->Month = DS1302ReadByte();
Time->Week = DS1302ReadByte();
Time->Year = DS1302ReadByte();
CLR_DS1302_CE(); //CE?,DS1302 CLR_DS1302_CE (); / / release CE line, in order to avoid misoperation of the DS1302.
}

>Error C208 DS1302GetAll Too many actual parameters
This is how you are declaring DS1302GetAll:

void DS1302GetAll(SYSTEMTIME *Time);

This is how you are calling it:

DS1302GetAll(Second, Minute, Hour, Date, Month, Week, Year);

I'd say your error is quite right in saying that you're passing too many actual parameters, seeing as how the function expects only 1 and you're passing seven. I suspect what you intended to do was create a SYSTEMTIME object, fill it with the data you're presently passing incorrectly to the function, then pass the object itself:

SYSTEMTIME systime;

DS1302GetAll ( &systime );
sprintf (
    buf,
    " %02u/%02u/%02u% 02u:%02u",
    systime.Date,
    systime.Month,
    systime.Year,
    systime.Hour,
    systime.Minute );
lcd_puts(buf);

The declaration and definition of DS1302GetAll (awkward name, by the way) clearly shows that the SYSTEMTIME object is an output parameter. This means that the parameter is meant to be empty to begin with and the function initializes it.

Very much appreciate your advice, looks like I did not get my head round this at all. Just to clarify, is this what you meant, or have I not understood again! Obviously I will have to do a similar operation to write clock data to DS1302SetAll.

DS1302GetAll stays as is

typedef struct __SYSTEMTIME__
{
unsigned int Second;
unsigned int Minute;
unsigned int Hour; 
unsigned int Date;
unsigned int Month;
unsigned int Week; 
unsigned int Year;
}SYSTEMTIME systime; //Shows error "missing ; before systime"

DS1302GetAll (&systime);
	   	   	   	   
       sprintf (buf," %02u/%02u/%02u% 02u:%02u",systime.Date,systime.Month,systime.Year,systime.Hour,systime.Minute);lcd_puts(buf);
       printf("Date%02u/%02u/%02u\n\rTime%02u:%02u\n\r",systime.Date,systime.Month,systime.Year,systime.Hour,systime.Minute);
	   DelayMs(250);

when you call " DS1302GetAll (&systime); ", as Narue said, that function will fill all the elements of the "systime" structure with the individual time and date components.

then, in order to push this info to the LCD in a human-readable way, you need to format the elements in an organized, meaningful manner that the LCD output code understands it. that's what youre doing when you call the " sprintf(buf ... " call; it formats this time & date info into the string "buf", so that your subsequent call to " lcd_puts() " knows what to do.

one thing i'm uncertain about here, is your "printf()" command... you're programming a microcontroller, right? where exactly is this "printf()" command supposed to print it to? you shouldn't have a terminal. your output device is the LCD, and you've already sent the info to the LCD via the "lcd_puts()" function.


.

No, you're supposed to be making changes to the Time function, since that's where the error is and that's where your code is wrong. Allow me to be more hand holdey because you clearly don't get it. Change this:

void Time(void)
{
  unsigned int Second,Minute,Hour,Date,Month,Week,Year;

  DS1302Init();
  lcd_goto(0x00);

  DS1302GetAll(Second, Minute, Hour, Date, Month, Week, Year);

  sprintf (buf," %02u/%02u/%02u% 02u:%02u",Date,Month,Year,Hour,Minute);
  lcd_puts(buf);
  printf("Date%02u/%02u/%02u\n\rTime%02u:%02u\n\r",Date,Month,Year,Hour,Minute);
  DelayMs(250);
}

To this:

void Time(void)
{
  SYSTEMTIME systime;

  DS1302Init();
  lcd_goto(0x00);

  DS1302GetAll ( &systime );

  sprintf (
    buf,
    " %02u/%02u/%02u% 02u:%02u",
    systime.Date,
    systime.Month,
    systime.Year,
    systime.Hour,
    systime.Minute );

  lcd_puts(buf);

  printf(
    "Date%02u/%02u/%02u\n\rTime%02u:%02u\n\r",
    systime.Date,
    systime.Month,
    systime.Year,
    systime.Hour,
    systime.Minute);

  DelayMs(250);
}

EDIT: retracted


.

Now I get it! Should have figured this out for myself, old age and a mental block I think. Many thanks for your invaluable assistance. BTW, the other print statement is to a simulated terminal in Proteus, just for testing. Will try and get the formatting right for any future posts. Again very grateful to all.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.