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

Problem while trying to write to Serial Window #1 at regular intervals

Hi All,
I'm trying to write to the Serial Window #1 at regular interval of time (But not successful yet). To generate the time interval i'm using timer0 of 8051 in 16 Bit Timer Mode 0x01
The values are initialized as shown below
TH0 = 0xFF
TL0 = 0x00
In the given program below, if I comment all the printf statements It works fine, generates accurate delay as needed (as seen in Debug Session). i.e. TL0 starts incrementing for every clock tick and when it reaches 0xFF, the next clock tick sets the overflow flag which in turn calls the ISR (Interrupt_Service_Routine0), wherein I again set the timer's TH0 and TL0 value.
But if I uncomment the printf statements in the program (Func1 and Func2), I don't get accurate time delay (as seen in Debug Session). when control reaches Func1 and passes ahead of printf statement the TH0 and TL0 value changes to 0x06 and 0x52 respectively.
As I have understood the timer 0 values should be between FF00 to FFFF (as initialized in the Timer_0_Init and Interrupt_Service_Routine0)
Please do correct me if my understanding is not correct

Using Keil IDE uVision2 V2.38a
Have selected ,b>Generic->8052 (all variants),/b> in the Options for Target in Project Menu
The program is as shown below:

/*------------------------------------------------------------------------------
HELLO.C

Copyright 1995-1999 Keil Software, Inc.
------------------------------------------------------------------------------*/

#include <REG52.H>                /* special function register declarations   */
                                  /* for the intended 8051 derivative         */
#include <stdio.h>                /* prototype declarations for I/O functions */


#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
#endif                                   /* Stop Exection with Serial Intr.   */
                                         /* is enabled                        */
#define FUNC1           3
#define FUNC2           2

sbit Port1Pin0 = P1^0;
sbit Port1Pin1 = P1^1;
sbit Port1Pin2 = P1^2;
sbit Port1Pin3 = P1^3;

unsigned short myFlag = 0;
unsigned short count = 0;

/* --------------------------------------------------------- */
//Functions (Func1 and Func2)to be called from ISR
void Func1() {
//      printf("Func1\n");

        Port1Pin0 = 1;
        Port1Pin1 = 0;
        Port1Pin2 = 1;
        Port1Pin3 = 0;
}

void Func2() {
//      printf("Func2\n");

        Port1Pin0 = 1;
        Port1Pin1 = 0;
        Port1Pin2 = 0;
        Port1Pin3 = 0;
}

/* --------------------------------------------------------- */
//Initializing TImer0
void Timer_0_Init(void)
{
        TMOD |= 0x01;

        TL0 = 0x00;
        TH0 = 0xFF;

        ET0 = 1;
        TR0 = 1;
        EA = 1;
}

/*----------------------------------------------------------*/
//ISR for Timer 0
void Interrupt_Service_Routine0(void) interrupt 1
{
        TR0 = 0;                //Deactivate Timer 0
        TL0 = 0x00;             //Setting timer Initial value again
        TH0 = 0xFF;             //Setting timer Initial value again
        TF0 = 0;                //Set Timer Overflow Flag to 0
        TR0 = 1;                //Activate Timer 0

        ++count;
        if (myFlag == 0 && count > FUNC1) {
                //Call Func1
                Func1();
                myFlag = 1;
                count = 0;
        }
        else if (myFlag == 1 && count > FUNC2) {
                //Call Func2
                Func2();
                myFlag = 0;
                count = 0;
        }
}

/*------------------------------------------------------------*/
void main(void)
{
/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
    SCON  = 0x50;                       /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */
#endif

        Timer_0_Init();
        while(1) {
                //Do Nothing, wait for Timer overflow which inturn calls ISR
                ;
        }
}

Thanks for your Time and Help

Parents
  • if you e-mail me I will gladly answer; however, since the sardine has consistently replied to my inquiries by stating "read the standards" I can not answer his inquiry by any other means.

    Please note that in my "read "the bible"" I have, as opposed to his posts not included any snide remarks about his (lack of) competence.

    I will, however answer the 'new' question not from a can:
    I do wonder where the figure of 0.00001% originates - Some clever area of statistical analysis?
    just a means of saying 'rarely'

    Erik

Reply
  • if you e-mail me I will gladly answer; however, since the sardine has consistently replied to my inquiries by stating "read the standards" I can not answer his inquiry by any other means.

    Please note that in my "read "the bible"" I have, as opposed to his posts not included any snide remarks about his (lack of) competence.

    I will, however answer the 'new' question not from a can:
    I do wonder where the figure of 0.00001% originates - Some clever area of statistical analysis?
    just a means of saying 'rarely'

    Erik

Children
  • if you e-mail me I will gladly answer; however, since the sardine has consistently replied to my inquiries by stating "read the standards" I can not answer his inquiry by any other means.

    First off, I haven't mentioned the 'C' standard once in this thread nor suggested that you read it.

    Second, surely it would be a shame for you to deprive the rest of the forum community the benefit of your knowledge, just because you don't want to tell me?

  • First off, I haven't mentioned the 'C' standard once in this thread nor suggested that you read it.
    correct, but do you expect me to forget all your snide remarks in other threads

    Second, surely it would be a shame for you to deprive the rest of the forum community the benefit of your knowledge, just because you don't want to tell me?

    I have, in the above thread, suggested they ask by e-mail. Would it not be even better if YOU found out and posted your finding since (according to you) your answers are so much better/clearer/precise/glorious/perfect/.... than mine.

    Erik