What Does the SendByte Function Do in This MCU Program?

  • Thread starter Thread starter Alex_Sanders
  • Start date Start date
  • Tags Tags
    Program
Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
5 replies · 3K views
Alex_Sanders
Messages
73
Reaction score
0
Very simple MCU program,the purpose would be sending strings to the computer, but no footnotes, so I have to guess the intention:

void SendStr(unsigned char *s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}

/*Question No.1: How does SendByte interact with SendStr?
Here is the SendByte func:*/

void SendByte(unsigned char dat)
{
SBUF = dat; /* Question No.2: No idea what this does*/
while(!TI); /* Question No.3: No idea what this does*/
TI = 0; /* Question No.4: No idea what this does*/
}

Any help would be appreciated, thanks in advance!
 
Last edited:
Physics news on Phys.org
Alex_Sanders said:
Very simple MCU program,the purpose would be sending strings to the computer, but no footnotes, so I have to guess the intention:

void SendStr(unsigned char *s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}

/*Question No.1: How does SendByte interact with SendStr?
Here is the SendByte func:*/

void SendByte(unsigned char dat)
{
SBUF = dat; /* Question No.2: No idea what this does*/
while(!TI); /* Question No.3: No idea what this does*/
TI = 0; /* Question No.4: No idea what this does*/
}

Any help would be appreciated, thanks in advance!


I am no MCU programmer, but googling seems to have the answer to your questions

1) How does SendByte interact with SendStr
- SendByte is called by SendStr. There is no other interaction
2) SBUF = dat.
This write the char to the serial port

3) while(!TI)
TI = 0;

The microcontroller signals that the byte has been written by setting TI to 1.
So essentially the while loop is a wait for the microcontroller to finish writing the byte.
 
Alex_Sanders said:
void SendByte(unsigned char dat)
{
SBUF = dat; /* Question No.2: No idea what this does*/
while(!TI); /* Question No.3: No idea what this does*/
TI = 0; /* Question No.4: No idea what this does*/
}

phiby said:
3) while(!TI)
TI = 0;
The code just above is subtly different from the code in the original post. In the code at the top there is a semicolon after while(!TI). In the code just above, there's no semicolon. This difference causes different behavior.
phiby said:
The microcontroller signals that the byte has been written by setting TI to 1.
So essentially the while loop is a wait for the microcontroller to finish writing the byte.
 
Code:
    SBUF = dat;   /* output data to SBUF (serial buffer) */
    while(!TI);   /* wait for TI (transmit interrupt) */
    TI = 0;       /* reset TI (transmit interrupt) */
 
Mark44 said:
The code just above is subtly different from the code in the original post. In the code at the top there is a semicolon after while(!TI). In the code just above, there's no semicolon. This difference causes different behavior.

The original code is correct.

while(!T) ;

will wait till T is set.

The next line
T = 0;

resets T.
 
Hey thanks a lot for your help! A great deal of headache has been saved thanks to you. I haven't thought about interrupt when looking at the code, now some lines really starting to make sense.