Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:timer:hardware_delay [2010/02/11 14:12] raivo.sellet:examples:timer:hardware_delay [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Raudvaraline viide ======+<pagebreak> 
 +====== Riistvaraline viide ======
  
 //Vajalikud teadmised: [HW] [[et:hardware:homelab:controller]], [AVR] [[et:avr:timers]], [LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:delay]], [LIB] [[et:software:homelab:library:timer]], [PRT] [[et:examples:timer:software_delay]]// //Vajalikud teadmised: [HW] [[et:hardware:homelab:controller]], [AVR] [[et:avr:timers]], [LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:delay]], [LIB] [[et:software:homelab:library:timer]], [PRT] [[et:examples:timer:software_delay]]//
Line 15: Line 16:
 ===== Praktika ===== ===== Praktika =====
  
-Allpool olev programmikood on taimeril põhinev viitefunktsioon, mida on natuke lihtsustatud. Loendamise põhimõte on sama, mis tarkvaralise viite funktsioonilgi - tekitatakse soovitud arv 1 ms pikkuseid viiteid. Viite tekitamiseks on kasutusel ATmega128 8-bitine loendur TIMER0. Eelnevalt on juba välja arvutatud, et 14,7456 Mhz taktsageduse puhul peab loenduri taktsignaal olema vähemalt 64-ga jagatud, et 1 ms jooksul 8-bitine loendur üle ei täituks. See, mis väärtust loendur omama peab, et ületäitumine toimuks 1 ms järel, on esitatud avaldise kujul ja omistatud muutujale //timer_start//. //F_CPU// on makro-keele konstant mis näitab taktsagedust hertsides. Nimetatud taktsageduse puhul peaks loenduri väärtus 25,6 olema, kuid kuna murdarve kasutada ei saa, siis loenduri algväärtuseks saab 26. Siin tekib paraku ka viga viite ajas, kuid see on üsna väike (-1,7 μs).+Allpool olev programmikood on taimeril põhinev viitefunktsioon, mida on natuke lihtsustatud. Loendamise põhimõte on sama, mis tarkvaralise viite funktsioonilgi - tekitatakse soovitud arv 1 ms pikkuseid viiteid. Viite tekitamiseks on kasutusel ATmega128 8-bitine loendur 0. Eelnevalt on juba välja arvutatud, et 14,7456 Mhz taktsageduse puhul peab loenduri taktsignaal olema vähemalt 64-ga jagatud, et 1 ms jooksul 8-bitine loendur üle ei täituks. See, mis väärtust loendur omama peab, et ületäitumine toimuks 1 ms järel, on esitatud avaldise kujul ja omistatud muutujale //timer_start//. //F_CPU// on makro-keele konstantmis näitab taktsagedust hertsides. Nimetatud taktsageduse puhul peaks loenduri väärtus 25,6 olema, kuid kuna murdarve kasutada ei saa, siis loenduri algväärtuseks saab 26. Siin tekib paraku ka viga viite ajas, kuid see on üsna väike (-1,7 μs).
  
 Tsüklis toimub loenduri algväärtustamine ja ületäitumise lipukese nullimine (sellesse 1 kirjutades). Seejärel oodatakse, kuni loendur loendab algväärtusest 256-ni, ehk ületäitumiseni. Ületäitumise hetkel läheb ületäitumise lipuke kõrgeks ja 1 ms viide ongi toimunud. Funktsiooni lõpus taimer peatatakse. Tsüklis toimub loenduri algväärtustamine ja ületäitumise lipukese nullimine (sellesse 1 kirjutades). Seejärel oodatakse, kuni loendur loendab algväärtusest 256-ni, ehk ületäitumiseni. Ületäitumise hetkel läheb ületäitumise lipuke kõrgeks ja 1 ms viide ongi toimunud. Funktsiooni lõpus taimer peatatakse.
Line 21: Line 22:
 <code c> <code c>
 // //
-// Riistvaraline viide millisekundites+// Riistvaraline viide millisekundites Atmega kontrolleril
 // //
 void hw_delay_ms(unsigned short count) void hw_delay_ms(unsigned short count)
Line 54: Line 55:
 } }
 </code> </code>
 +
 +<pagebreak>
 +
 +Esitatud viite funktsioon kasutab aga taimerite teeki, mille lähtekood Atmega kontrollerile näeb välja järgmine:
 +
 +<code c>
 +//
 +// Taimer 0 taktijaguri valiku tüüp
 +//
 +typedef enum
 +{
 + TIMER0_NO_PRESCALE         = 0x01,
 + TIMER0_PRESCALE_8          = 0x02,
 + TIMER0_PRESCALE_32         = 0x03,
 + TIMER0_PRESCALE_64         = 0x04,
 + TIMER0_PRESCALE_128        = 0x05,
 + TIMER0_PRESCALE_256        = 0x06,
 + TIMER0_PRESCALE_1024       = 0x07
 +}
 +timer0_prescale;
 +
 +//
 +// Taimer 0 normaalrežiimi seadistamine
 +//
 +inline void timer0_init_normal(timer0_prescale prescale)
 +{
 + TCCR0 = prescale & 0x07;
 +}
 + 
 +//
 +// Taimer 0 peatamine
 +//
 +inline void timer0_stop()
 +{
 + TCCR0 = 0x00;
 +}
 +
 +//
 +// Taimer 0 loenduri väärtuse määramine
 +//
 +inline void timer0_set_value(unsigned char value)
 +{
 + TCNT0 = value;
 +}
 +
 +//
 +// Taimer 0 ületäitumise lipukese nullimine
 +//
 +inline void timer0_overflow_flag_clear(void)
 +{
 + bit_set(TIFR, TOV0);
 +}
 +
 +//
 +// Taimer 0 ületäitumise lipukese oleku lugemine
 +//
 +inline bool timer0_overflow_flag_is_set(void)
 +{
 + return (bit_is_set(TIFR, TOV0) ? true : false);
 +}
 +</code>
 +
 +<pagebreak>
  
 Järgnevalt on toodud samasugune programm nagu tarkvaralise viite näiteski. Lühemal 100 ms poolperioodil LED süüdatakse, pikemal 900 ms poolperioodil kustutatakse. Tulemusena vilgatab LED  iga sekundi järel. Paraku pole ka selles näites periood täpselt 1 sekund, sest programmi muude funktsioonide täitmine igas tsüklis võtab samuti aega. Täpseks ajastuseks tuleb kasutada 16-bitist taimerit koos katkestustega. Järgnevalt on toodud samasugune programm nagu tarkvaralise viite näiteski. Lühemal 100 ms poolperioodil LED süüdatakse, pikemal 900 ms poolperioodil kustutatakse. Tulemusena vilgatab LED  iga sekundi järel. Paraku pole ka selles näites periood täpselt 1 sekund, sest programmi muude funktsioonide täitmine igas tsüklis võtab samuti aega. Täpseks ajastuseks tuleb kasutada 16-bitist taimerit koos katkestustega.
Line 59: Line 123:
 <code c> <code c>
 // //
-// Kodulabori raudvaralise viite demonstratsioonprogramm.+// Kodulabori riistvaralise viite demonstratsioonprogramm.
 // Programm vilgutab ~1 sekundi järel hetkeks LED-i. // Programm vilgutab ~1 sekundi järel hetkeks LED-i.
 // //
et/examples/timer/hardware_delay.1265897574.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