Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet
Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet
Regulering af Quad-rotor helikopter - VBN - Aalborg Universitet
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
eksekvere kode.<br />
Til sidst skal timer0 sættes op til at skabe interrupts med et fast interval. Dette gøres ved hjælp <strong>af</strong><br />
følgende linier kode der skal placeres i main-rutinen således at de bliver kørt når processoren starter:<br />
1 MCUCR = _BV( SE ) ; / / m u l i g g ø r p r o c e s s o r e n s sleepmode<br />
2 TCNT0 = TCNT0_INIT ; / / I n i t i a l i s e r t i m e r 0 t æ l l e r e n<br />
3 TCCR0 = TMC8_CK256 ; / / Sæt t i m e r 0 t i l a t b l i v e t a l t op hver 2 5 6 .<br />
p r o c e s s o r c l o c k<br />
4 TIMSK = _BV( TOIE0 ) ; / / T i l l a d i n t e r r u p t s f r a t i m e r 0<br />
Første linje i denne kode sætter bit SE i control registret på processoren hvilket gør at processoren<br />
bliver i stand til at gå i standby, hvis den bliver bedt om det (kernen benytter dette hvis der ikke er<br />
flere tråde tilbage i aktiv-køen). Anden linje har den funktion at den initialiserer timer0-tælleren til<br />
værdien TCNT0_INIT. Denne værdi kan beregnes således såfremt divideren på timer0 er sat til 256<br />
som med ovenstående kode:<br />
Hvor<br />
TCNT0_INIT = 255 −<br />
TCNT0_INIT er konstanten der skal lægges ind i TCNT0<br />
CPUCLK<br />
256 · TICKRATE<br />
for at opnå den rigtige opgaveskiftfrekvens [-]<br />
CPUCLK er clockfrekvensen på processoren [Hz]<br />
TICKRATE er frekvensen hvormed der skal ske opgaveskift [Hz]<br />
Dog skal det nævnes til formel J.1 kun kan benyttes såfremt resultatet bliver positivt, da en negativ<br />
værdi i tælleren ikke har den ønskede funktion. Desuden skal TCNT0_INIT defineres som en makro<br />
således at den både kan benyttes i rutinen til timer0-overflow interrupts og i main-rutinen, uden at<br />
beregningen skal udføres på processoren.<br />
Tredje linje sætter to bits i kontrol registret til timer0 på processoren. Disse bits sørger for en divider<br />
på 256 på clockfrekvensen på processoren, således at timer-counteren kun bliver talt op en gang per<br />
256 clockpulser. Fjerde linje tillader overflow-interrupts fra timer0 mens andre typer interrupts fra<br />
timer0 bliver blokeret.<br />
Når dette er gjort er størstedelen <strong>af</strong> kernen sat op, og tilbage er derfor kun at starte de rigtige tråde.<br />
Dette gøres ved hjælp <strong>af</strong> følgende funktionskald:<br />
1 AvrXRunTask (TCB( t a s k _ n a v n ) ) ;<br />
Hvor TCB() er en prekompiler macro der finder den rigtige TaskControlBlock (datastruktur der<br />
indeholder information om en tråd). AvrXRunTask() placerer blot information om tråden i aktiv-<br />
køen, således at den kommer i betragtning når der skiftes tråd.<br />
Til sidst er blot tilbage at køre funktionen Epilog() der sørger for at starte kernen op og starte<br />
med at udføre kode til første tråd.<br />
A40<br />
(J.1)