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; }