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

Timer in autoload mode

I use Keil sometimes and while using a timer in autoload mode, the TH0 is loaded with the calculated value but TL0 starts incrementing from 00 instead of the calculated value F0.Am I missing something while using or configuring the keil simulator?

Parents
  • The program below is for generating square wave of some delay. I have taken F0 as eg to

    check for small duration. When I run the program in step mode, the TL0 increments directly

    to F3 and then the timer stops in autoload mode.The same set of instructions function in mode 1
    I use keil Uvision 2.

    #include <reg51.h>

    void delay();
    sbit mybit = P1^5;
    main();
    { while(1)
    { mybit = mybit^1;
    delay();
    } }

    void delay()
    { TMOD = 0x02;
    TH0 = 0xF0;
    TL0 = 0xF0;
    TRO = 1
    while(TF0==)
    TR0 = 0;
    TF0 = 0;
    }

Reply
  • The program below is for generating square wave of some delay. I have taken F0 as eg to

    check for small duration. When I run the program in step mode, the TL0 increments directly

    to F3 and then the timer stops in autoload mode.The same set of instructions function in mode 1
    I use keil Uvision 2.

    #include <reg51.h>

    void delay();
    sbit mybit = P1^5;
    main();
    { while(1)
    { mybit = mybit^1;
    delay();
    } }

    void delay()
    { TMOD = 0x02;
    TH0 = 0xF0;
    TL0 = 0xF0;
    TRO = 1
    while(TF0==)
    TR0 = 0;
    TF0 = 0;
    }

Children
  • "The program below"

    that's a great piece of code.

    keep up the good work!

  • This is one of the better lines:

    while(TF0==)
    


    I have to assume that the while loop should run until TFD becomes NULL.

  • I am simply amazed how many people who are supposed to be savvy at least with computers, fail to grasp the advantage of using "copy-paste" (but they apparently use it with success in their homework!) and re-type their "code". Stunning.

  • "Stunning."

    as they say, stupidity is without limit.

  • You can use this example as a reference:

    http://www.keil.com/download/docs/97.asp

    This is a Timer 1, 8 bit auto-reload example that is being serviced by a Timer ISR.

    This example will exhibit the same issue you see - that the hardware is clearing the flag when it jumps to the Timer 1 interrupt vector.

    Are you using an Timer ISR? In the above example, if you set EA = 0 or go to Peripheral -> Interrupt, and set EA =0, you will see the timer flag 1 (TF1) will never get cleared.

    You can also observe the timer values under Peripherals -> Timer 1.

    You can read more about how timers work on an 8051 here:

    www.8052.com/tuttimer.phtml

  • "This example will exhibit the same issue you see"

    I am not sure. I think his code appears to be correct. it is not clear what he observed (no auto-reloading or incorrect auto-reloading?). but if all he is concerned is that the first observable tmr count in the isr is not 0xf0 - that's due to interrupt latency.

    but from what he wrote, it doesn't sound like that's he is complaining.

    " - that the hardware is clearing the flag when it jumps to the Timer 1 interrupt vector."

    I am pretty sure that's not his issue, and I am pretty sure that's supposed to have happened.

  • /*Program for generating sqwave on pin 7 of port 2*/

    #include <REG51.h>

    sbit mybit = P2^7;
    void delay();

    main()
    { while(1)
    { mybit = mybit^1; /*Invert mybit to toggle between 0 and 1*/
    delay ();
    } }

    void delay()
    { TMOD = 0X20; /*Timer 1 operation in mode 2*/
    TH1 = -184;
    TR1 = 1;
    while(TF1==0);/*Polling mode is used instead of interupt mode*/
    TR1 = 0;
    TF1 = 0;
    }

    It works in autoload mode and the TL1 starts intially from 00 and later gets

    loaded by the value in TH1 register.The problem is that it doesnt leave the delay routine

    to go back to main program again where "mybit" is inverted to generate square wave of

    50%duty cycle. The timer starts again after overflow and step mode execution is stuck at

    while(TF1==0). But when it runs in mode 1, everything functions smoothly and the delay

    routine returns to the main program.

  • 'The problem is that it doesnt leave the delay routine'

    you just cannot help killing yourself, can you?

  • Ashley,

    Why don't you just help the poor chap?! Come on, the guy suffered enough (I would if I could!)

  • "Why don't you just help the poor chap?! Come on, the guy suffered enough (I would if I could!)"

    tammy: for the same reason that I have given up on you.

    at some point, a person is deemed beyond help.

  • <QUOTE>tammy: for the same reason that I have given up on you.</QUOTE>

    i remember tapeer as a stewdent. to teech him i used code like this

    
      while ( still_breathing )
      {
        send_message( to_tapeer, "read abi, page x, section y" );
    
        receive_message( from_tapeer, msg );
    
        if ( is_response_an_insult ( msg ) )
        {
           // msg prob from tapeer
    
           if (! is_response_like ( msg, "you are wrong, r0 is not preserved") )
           {
             // tapeer might at finally be listening
    
             if ( is_response_like ( msg, "im very good, you dont know anything") )
             {
               // tapeer found information but too stubborn to admit help was good
    
               break;
             }
           }
         }
       }
    
       do_some_real_work ( );
      }
    
    

    always yo're freind.

    Zeusti

  • void delay()
    {
      TMOD = 0X20; /*Timer 1 operation in mode 2*/
      TH1 = -184;
      TR1 = 1;
      while(TF1==0);/*Polling mode is used instead of interupt mode*/
      TR1 = 0;
      TF1 = 0;
    }
    

    It works in autoload mode and the TL1 starts intially from 00 and later gets

    loaded by the value in TH1 register.The problem is that it doesnt leave the delay routine

    to go back to main program again

    how can it 'work' when "The problem is "

    for the first delay you depend on whatever is in TL1 for your delay no autoload takes place before the timer roll over. for the next delay you will get the autoload value plus whetever counts happened before TR1=0. You are confusing the whole issue by using autoload. With a lot of feniggeling I have no doubt this could be done with autoload but why use auotoload when only one run in the routine. Using illogical modes does nothing but make the issue confusing, complex. less maintainable, less understandable, and error prone.

    why not just straight code

    void delay()
    {
      TMOD = 0X10; /*Timer 1 operation in mode 1*/
      TH1 =  0xff;
      TL1 = -184;
      TR1 = 1;
      while(TF1==0);/*Polling mode is used instead of interupt mode*/
      TR1 = 0;
      TF1 = 0;
    }
    

    Erik

  • "why not just straight code"

    it doesn't fundamentally solve his problem - that the code doesn't return (for some extremely strange reason, in my view) to main().

    your code will have the exact same "problem" - if the code didn't return from his "while (TF1==0);", it wouldn't return from your "while (TF1==0);". thus why i called your line of thoughts "secondary".

    at this point, I am inclined to think this is a user (observational) problem.

  • Erik,

    I am beginning to suspect that Ashley is Jack Sprat's mother in law...

  • your code will have the exact same "problem" - if the code didn't return from his "while (TF1==0);", it wouldn't return from your "while (TF1==0);". thus why i called your line of thoughts "secondary".

    TR1 = 1;
      while(TF1==0);/*Polling mode is used instead of interupt mode*/
    

    will continue, a running timer (0 or 1) will (eventually) set TF to 1.

    Erik