This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Some matter with my "printf()",what can i do ?

When program running to "printf()",the PC always stop at

C:0X0A2A 3099FD JNB TI(0X98.1),C:0A2A
I try adding some word as following :
ES = 0;   //UART INT is Enable before
TI = 1;
printf("%bd",3);
ES = 1;

So , the program running well.Can you tell why being disable UARTs'INT and Setting TI are necessary? How can i overleap this word ?

Another question,why "printf("%bd",3);" can send unsigned char variable to PC right while "printf("%c",3);" not ? What's different between %bd and %c?

Parents
  • There are knowledgeable people here who emphasize reading the manuals because no number of short answers from someone else can substitute for your own learning.
    TI must be polled because it takes the transmit module time to transmit the byte after it is loaded into the Tx buffer, at 9600baud it's around 1 ms, this is a LONG time for the cpu. It can do alot and come back around with the next byte to send before the Tx module is done sending the first byte. So the cpu polls the TI bit and waits until the transmission is complete because the TI bit is set at that time.
    After power up you don't need to set the TI bit, just load the Tx buffer with the first byte after transmission and interrupts are enabled. The module will set TI after the byte is sent and your isr will be called.
    Most of my applications set TI in "main loop" code to request transmission because there is some sort of packet structure and it's just neater to keep all of the state machine/error handling in the isr.

Reply
  • There are knowledgeable people here who emphasize reading the manuals because no number of short answers from someone else can substitute for your own learning.
    TI must be polled because it takes the transmit module time to transmit the byte after it is loaded into the Tx buffer, at 9600baud it's around 1 ms, this is a LONG time for the cpu. It can do alot and come back around with the next byte to send before the Tx module is done sending the first byte. So the cpu polls the TI bit and waits until the transmission is complete because the TI bit is set at that time.
    After power up you don't need to set the TI bit, just load the Tx buffer with the first byte after transmission and interrupts are enabled. The module will set TI after the byte is sent and your isr will be called.
    Most of my applications set TI in "main loop" code to request transmission because there is some sort of packet structure and it's just neater to keep all of the state machine/error handling in the isr.

Children
  • There are knowledgeable people here who emphasize reading the manuals because no number of short answers from someone else can substitute for your own learning.

    Stating the same in another way:
    If you study for a week, you can get going in a week. If you do not study and ask here for every step you will get going in a year.

    Erik