[Top][All Lists]
[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
- [avr-gcc-list] Troubles with timer,
Olav Torheim <=