avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Troubles with timer


From: Olav Torheim
Subject: [avr-gcc-list] Troubles with timer
Date: Wed, 14 May 2003 18:56:58 +0200 (CEST)

I try to create a startup sequency by toggling the leds on the outputs of my AVR ATMega 16. I want to scale down my timer to make the startup sequency go slow enough. Strangely, the startup sequence only goes _faster_ when prescaling the timer to lower frequencies.
 
Parts from the source code is attached below:
 
        // Here I try to put out a startup sequence on the leds
        resetTimer();

        scaleTimer(5); // Scaling timer to clock / 1024
        startTimer();
        int teljar;
        char bipp = 1;
        for(teljar = 0;teljar<9;teljar++)
        {
                        if (teljar == 8)
                        {
                                writeDO('U');
                        }
                        else
                        {
                                writeDO((bipp << teljar));
                        }
                int teljar2 = 0;
                while (teljar2 != 1000)
                {
                        while(mTimerHighbyte != 0);
                        asm("nop\n\t");
                        teljar2 ++;
                }

        }
---
 
When entering 2 og 3 (clock/8 and clock/64) as parameters to my self-defined function scaleTimer(char scale) I can watch my program going through the startup sequence. Entering 4 or 5 makes the sequence run so fast that I am unable to watch it. What I am wondering is, wasn't the opposite supposed to happen? And why not?
 
 
Olav Torheim
---
 
Source code for TIMER_AVR.H:
 
#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>
#ifndef TIMER_AVR
#define TIMER_AVR
/*!
 * \class TIMER_AVR
 * \version 1.0 beta
 * \author musLINg (ansvarlig: Olav Torheim)
 *
 *  Hardware-interfacing mot 8-bits timer.
 * 
 */
volatile char mTimerHighbyte;
volatile char mTimeout;
volatile char mScale;
//! Interrupt rutine som kjører hver gang timeren får overflow
/*!
 * Hver gang 8-bitstimeren får overflow, inkrementeres mTimerHighbyte med 1.
 * Resultatet er ein "pseudo" 16-bitstimer med mange ganger so stor rekkevidde som den
 * opphavlige 8-bitstimeren.
*/
SIGNAL (SIG_OVERFLOW0) // Signal generated when timer overflows
{
        mTimerHighbyte++;
        if (mTimerHighbyte==255)
        {
                mTimeout = 1;
                mTimerHighbyte = 0;
        }
        outp(0,TCNT0); /* reload timer with initial value */
}
//! Initialiserer timeren
/*!
 * Skalerer timeren til (klokke / 8) og slår på overflow-interruptet.
*/
void initTimer(void)
{
        outp(2, TCCR0); /* prescaling to processor clock / 8 */
        /* enable the T/C0 overflow interrupt */
        outp((1 << TOIE0), TIMSK);
         sei(); /* set global interrupt enable */
}
//! Skalerer timeren til ønsket prescale
void scaleTimer(char scale)
{
 mScale = scale;
}
//! Nullstiller timeren
/*!
 * Stopper timeren, resetter TCNT0 og mTimerHighByte.
*/
void resetTimer(void)
{
        outp(0, TCCR0); /* stop timer */
        mTimerHighbyte = 0; /* reset high byte */
        outp(0, TCNT0); /* reset low byte */
  
  mScale = 2;
}
//! Starter timeren
void startTimer(void)
{
        mTimerHighbyte = 0;
        outp(0, TCNT0); /* start value of T/C0 */
        outp(mScale, TCCR0); /* start klokka */
}
//! Returnerer timerens nåværende verdi
/*!
 * \return short - Returnerer en bitvis ORet sum av TCNT0 og mTimerHighbyte
*/
short readTimer(void) // Returning timer value
{
        return ((TCNT0 | (mTimerHighbyte << 8)));
}
#endif

Ny versjon av Yahoo! Messenger
Nye ikoner og bakgrunner, webkamera med superkvalitet og dobbelt så morsom


reply via email to

[Prev in Thread] Current Thread [Next in Thread]