[McHUG] Arduino Timer help

n3sb at qis.net n3sb at qis.net
Wed Sep 22 07:13:48 EDT 2010


Hi John;

Two additional items:

There's one comment in the code that's misleading. The comment
    //Timer1 Overflow Interrupt Enable
should really be
    //Timer1 Output Compare Interrupt Enable

Also - I had some fits initially getting the timers to work too.  
Fortunately there's a simulator in Atmel's AVR Studio that can read  
the elf files generated by the Arduino IDE. It works quite well -  
showing all the details in each of the registers, as well as the  
timers & counters doing their thing.

73; Steve, N3SB


Quoting John Yost <k3yjp at yahoo.com>:

> That's great Steve.
> I was working along the same line of thought but was missing the setup of the
> TIFR register and setting the wrong bit in TIMSK.
> Your code is more elegant than mine but I'm getting there.
>
>
> Now to go interrupt something.
>
> Thank Steve and I'll post how I make out with it.
>
> John
>
>
>
> ----- Original Message ----
> From: "n3sb at qis.net" <n3sb at qis.net>
> To: mchug at mailman.qth.net
> Sent: Tue, September 21, 2010 8:13:56 PM
> Subject: Re: [McHUG] Arduino Timer help
>
> Hi John;
>
> Here's an Arduino program that uses the 16 bit timer to generate an
> interrupt at 26400 Hz. You should be able to adapt it to your needs.
>
> It uses one of the Output Compare registers to generate an interrupt
> when the 16 bit timer, running at 16 MHz, matches the output compare
> value. In the interrupt routine the program adds the right delay value
> to the current output compare register value, and sets up for the next
> interrupt.
>
> Using this technique you can create all kinds of useful, very accurate
> time delays. The interrupt routine itself will NOT cause a cumulative
> time error because the timer itself keeps running.
>
> NOTE: Be careful if you modify variables in the interrupt routine that
> are used elsewhere in the program. You'll need to declare those
> variables as volatile so that the compiler always fetches a new copy
> of the variable from memory for your calculations.
>
> 73; Steve, N3SB
>
>
>
> // Program interrupt1 written November 15, 2008 N3SB
> //
> // This program sets up a 26400 Hz interrupt on an Arduino (ATMega168 based)
> // From that interrupt, timing for other packet functions can be
> developed (1200 Hz tone, 2200 Hz tone, and 1200 baud bit rate).
>
> // Macro and other defines
>
> // Variable defines
> unsigned int intcount = 0;
> unsigned char ledon = 0;
> unsigned char count1200 = 0;
> unsigned char count2200 = 0;
> unsigned char on1200 = 0;
> unsigned char on2200 = 0;
>
> // Pin Defines
> int ledpin = 13;               // Arduino pin used by the LED
> int pin2200 = 12;              // pin where the 2200 Hz signal will appear
> int pin1200 = 11;              // pin where the 1200 Hz signal will appear
>
> // Arduino runs at 16 MHz; to get to 26400 Hz we count 606 clocks
> // 16000000 / 606 = 26402.64 Hz (within 0.01%)
> //
> // We will use the 16 bit timer 1 hardware, and the COMPA interrupt.
>
> ISR(TIMER1_COMPA_vect)
> {
>    count1200++;                  // Counter for 1200 Hz tone. Toggles
> every 11 interrupts at 26400 Hz, or 2400 times per second.
>    if (count1200 == 11)
>    {
>      count1200 = 0;
>      if (on1200 == 0)
>      {
>        digitalWrite(pin1200, HIGH);
>        on1200 = 1;
>      }
>      else
>      {
>        digitalWrite(pin1200, LOW);
>        on1200 = 0;
>      }
>    }
>
>    count2200++;                  // Counter for 2200 Hz tone. Toggles
> every 6 interrupts at 26400 Hz, or 4400 times per second.
>    if (count2200 == 6)
>    {
>      count2200 = 0;
>      if (on2200 == 0)
>      {
>        digitalWrite(pin2200, HIGH);
>        on2200 = 1;
>      }
>      else
>      {
>        digitalWrite(pin2200, LOW);
>        on2200 = 0;
>      }
>    }
>
>    intcount++;                   // Counter for 1 Hz LED Blink
>    if (intcount == 26400)
>    {
>      intcount = 0;
>      if (ledon == 0)
>      {
>        digitalWrite(ledpin, HIGH);
>        ledon = 1;
>      }
>      else
>      {
>        digitalWrite(ledpin, LOW);
>        ledon = 0;
>      }
>    }
>
>    OCR1A = OCR1A + 606;          // Set Output Compare register for
> the next interrupt in 606 cycles
> }  // end of timer interrupt routine
>
> void setup() {
>    pinMode(ledpin, OUTPUT);       // configure LED pin for output
>    pinMode(pin1200, OUTPUT);
>    pinMode(pin2200, OUTPUT);
>
>    digitalWrite(ledpin, LOW);     // turn off LED
> //  Serial.begin(9600);
> //  Serial.println(" ");
> //  Serial.println("Program Interrupt1 - 15 November 2008 - N3SB");
> //  Serial.println(" ");
>
> //Timer1 Settings: Normal Mode, Timer Prescaler / 1
>
>    TCCR1A = 0;
>    TCCR1B = 1;
>
>    //Timer1 Overflow Interrupt Enable
>    TIFR1  |= (1<<OCF1A);       // Clear any pending output compare A  
> interrupts
>    TIMSK1 |= (1<<OCIE1A);      // Timer1 Output Compare A Interrupt Enable
>
>    OCR1A = TCNT1 + 606;
>
>    TIMSK0 = 0;                 // Disable Timer0 interrupts (enabled
> in Arduino setup code)
>
>    sei();
> }    // end of Arduino setup structure
>
> void loop()
> {
>    delay(1000);        // give the main loop something to do.
> }  // end of Arduino loop structure
>
>
>
>
>
>
> Quoting John Yost <k3yjp at yahoo.com>:
>
>> Hi Pete,
>>
>> Nothing yet.  If I let the timers just run to the max and overflow
>> they work ok,
>> but I want to set the TOP to a lower value than MAX to get the
>> interrupt at the
>> interval I want.
>>
>> Thanks for a reply
>> John
>> K3YJP
>>
>>
>>
>> ----- Original Message ----
>> From: Peter Morton <mortonph at comcast.net>
>> To: MicroController Ham User Group - Physical Computing for Ham Radio
>> <mchug at mailman.qth.net>
>> Sent: Tue, September 21, 2010 7:21:07 PM
>> Subject: Re: [McHUG] Arduino Timer help
>>
>> John-
>>
>> I was just wondering if you got any responses.  Didn't see any on McHug.
>>
>> I haven't played with the Arduino or ATMEGA for several years and my timer
>> expertise was limited then.  Hope you find some help.
>>
>> -Pete, W3GVX.
>>
>>
>> ----- Original Message -----
>> From: "John Yost" <k3yjp at yahoo.com>
>> To: "MicroController Ham User Group - Physical Computing for Ham Radio"
>> <mchug at mailman.qth.net>
>> Sent: Monday, September 20, 2010 8:22 PM
>> Subject: [McHUG] Arduino Timer help
>>
>>
>>> I am trying to adjust a 16 bit timer to count to a value less than the max
>>> xFFFF.
>>>
>>> I see examples in sketches for sound generation but can't get them to work
>>> properly.
>>>
>>> In one case I want to load TCNT5 (timer5 on a Mega) with 12500, with a
>>> prescale
>>> of 64 to get a 50ms overflow interrupt.(hummm, probably can't cause an
>>> overflow
>>> but should cause something else to happen)
>>>
>>> One method I tried used one of the compare modes but it screwed up a bunch
>>> of
>>> pins.
>>>
>>> Also tried this on the BBB with no luck there as well.
>>>
>>> Any thoughts
>>>
>>> thanks
>>>
>>> John
>>> K3YJP
>>>
>>>
>>>
>>>
>>> ______________________________________________________________
>>> McHUG mailing list
>>> Home: http://mailman.qth.net/mailman/listinfo/mchug
>>> Help: http://mailman.qth.net/mmfaq.htm
>>> Post: mailto:McHUG at mailman.qth.net
>>>
>>> This list hosted by: http://www.qsl.net
>>> Please help support this email list: http://www.qsl.net/donate.html
>>
>> ______________________________________________________________
>> McHUG mailing list
>> Home: http://mailman.qth.net/mailman/listinfo/mchug
>> Help: http://mailman.qth.net/mmfaq.htm
>> Post: mailto:McHUG at mailman.qth.net
>>
>> This list hosted by: http://www.qsl.net
>> Please help support this email list: http://www.qsl.net/donate.html
>>
>>
>>
>>
>> ______________________________________________________________
>> McHUG mailing list
>> Home: http://mailman.qth.net/mailman/listinfo/mchug
>> Help: http://mailman.qth.net/mmfaq.htm
>> Post: mailto:McHUG at mailman.qth.net
>>
>> This list hosted by: http://www.qsl.net
>> Please help support this email list: http://www.qsl.net/donate.html
>>
>
>
>
> ______________________________________________________________
> McHUG mailing list
> Home: http://mailman.qth.net/mailman/listinfo/mchug
> Help: http://mailman.qth.net/mmfaq.htm
> Post: mailto:McHUG at mailman.qth.net
>
> This list hosted by: http://www.qsl.net
> Please help support this email list: http://www.qsl.net/donate.html
>
>
>
>
> ______________________________________________________________
> McHUG mailing list
> Home: http://mailman.qth.net/mailman/listinfo/mchug
> Help: http://mailman.qth.net/mmfaq.htm
> Post: mailto:McHUG at mailman.qth.net
>
> This list hosted by: http://www.qsl.net
> Please help support this email list: http://www.qsl.net/donate.html
>





More information about the McHUG mailing list