This is an old revision of the document!


Lihtsa viite tekitamine

Kontrollige, et optimeerimine oleks välja lülitatud: -O0 ja et AVRStudios oleks määratud kontrolleri taktsagedus: 14745600

void delay1s(int count){ // ~0,09s
	unsigned int i,j;
	for(i=0;i<count;i++){
	for(j=0;j<65530;j++){asm volatile ("nop");}}
}
 
 
//Väljakutsumine programmist
delay1s(10); //0,9 sek.

Paus taimeriga. Järgnevat pausi tekitamise koodi optimeerimine ei mõjuta.

// Paus millisekundites
// Pausi tegemiseks on kasutusel taimer 0
// Maksimaalne pausi aeg on 4500 ms
// Pausi täpsus on 3%
void aeg(unsigned int t)
{
  // Maksimaalse aja piiramine
  if (t > 4500) t = 4500;
 
  // Sagedusjaguri teguriks 1024
  TCCR1B = _BV(CS12) | _BV(CS10);
 
  // Taimerile sellise väärtuse omistamine, et
  // t millisekundi pärast märgitakse katkestuse bitt
  TCNT1 = 0xFFFF - (unsigned int)((unsigned long)t * (unsigned long)144 / (unsigned long)10);
 
  // Lõputu tsükkel kuni katkestuse bitt märgitakse
  while ((TIFR & _BV(TOV1)) == 0)
  {
  	asm volatile ("nop");
  }
 
  // Katkestuse biti kustutamine toimub seda üheks kirjutades
  TIFR |= _BV(TOV1);
}

Viide kasutades util/delay.h päisfaili. Probleem on maksimaalses väärtuses, mida _delay_ms aktsepteerib. Järgnev funktsioon võimaldab kasutada oluliselt suuremaid viiteid.

void delay_ms(uint16_t ms) // Määrab pausi pikkuse
{
	while (ms)    // tsükkel, kuni ms väärtus on jõudnud nullini
	{
		_delay_ms(1); // 1ms viide
		ms--;  // lahtutab igas tsüklis ühe maha
	}
}
//*****************************************************************************
//
// Delay with timer 1.
//
//*****************************************************************************
void delay_ms(unsigned int ms)
{
	unsigned int count = 0;
 
	//
	// No PWM generating.
	//
	TCCR1A = 0;
 
 	//
	// Clock prescaler to 4, so the timer clock will be 250khz.
	//
	TCCR1B = BIT(CS11) | BIT(CS10);	
 
	//
	// Cycle until ms times of overflow.
	//
	while (count++ < ms)
	{
		//
		// Preload timer value to get overflow in 1ms.
		//
		TCNT1 = 5;
 
		//
		// Wait for overflow.
		//
		while (!IS_BIT_SET(TIFR, TOV1))
		{
			asm volatile ("nop");
		}
 
		//
		// Clear timer overflow interrupt flag.
		//
		SET_BIT(TIFR, TOV1);
	}	
 
	//
	// Stop the timer.
	//
	TCCR1B = 0;
}
et/examples/delay.1253528390.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0