View Full Version : Please help me with this MCU program? (written in C)
Alex_Sanders
Jan14-12, 07:53 PM
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!
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.
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*/
}
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.
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.
SBUF = dat; /* output data to SBUF (serial buffer) */
while(!TI); /* wait for TI (transmit interrupt) */
TI = 0; /* reset TI (transmit interrupt) */
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.
Alex_Sanders
Jan20-12, 07:45 AM
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.
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.