| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > avr exb2313 |
| Автор: kostay 2.4.2008, 11:44 | ||
вобшем вот из етого надо сделать так 4тобы мигал ЛЕД 8 после каждых 15 прерываний примерно раз в секунду(тоесть в одну секунду 15 прерываний и зажигаем), 4астота ЦК 8Mhz внешние прерывания надо вобше убрать, делать 4ерез timer1 |
| Автор: PILOT 9.4.2008, 07:12 |
| /********************************************************************* Project : Kierroslukumittari Version : 2.0 (AVR-mikro-ohjaimelle, muokattu vanhaa 51-veriota Date : 2.6.2004 (51-versio 13.10.1998) Author : Jari Koskinen Company : Tietomyrsky Oy Comments : 20.5.05 Korjattu LED12 ja LED14 järjestys Muutettu ATtiny2313-piirille Chip type : ATtiny2313 Clock frequency : 4 MHz *********************************************************************/ #include <tiny2313.h> #define TRUE 1 #define FALSE 0 unsigned char int0done; // 0,5 s lippu unsigned char int0count; // ulkoisten kesk. laskuri unsigned char int0count0; // ed. laskurin 0,5 s summa /********************************************************************/ /* init-funktio, joka tekee kaikki tarvittavat alustustoimenpiteet */ /********************************************************************/ void init(void) { CLKPR=0x80; // Crystal Oscillator division factor: 1 CLKPR=0x00; PORTB = 0x00; // B-portin alustukset DDRB = 0xFF; PORTD = 0x00; // D-portin alustukset DDRD = 0x7B; TCCR1A = 0x00; // Timer 1: n alustukset TCCR1B = 0x0B; // CK/64 OCR1AH = 0xC3; // C350H = 50000 OCR1AL = 0x50; // 50000 * 2 us = 0,1 s MCUCR = 0x03; // keskeytys nousevasta reunasta TIMSK = 0x40; // Timer(s)/Counter(s) Interrupt(s) init ACSR = 0x80; // Analog Comparator: Off int0count0 = int0count = 0; int0done = FALSE; #asm("sei") // Asetetaan globaali keskeytys bitti } /********************************************************************/ /* Timer 1:n (16-bit) keskeytyspalveluohjelma. Keskeytys tapahtuu */ /* 0,5 s välein (4,032MHz/64=63 kHz, 1/63 kHZ * 31500 = 0,5s) */ /********************************************************************/ interrupt [TIM1_COMPA] void timer1_comp_isr(void) { int0count0 = int0count; // siirrä keskeytysten määrä int0count = 0; // nollaa keskeytyslaskuri int0done = TRUE; // aseta lippu, tulos on siirretty } /********************************************************************/ /* Pääohjelma odottaa (0,5s) keskeytyspulssien laskennan tulosta */ /* Kun tulos on selvillä, sytytetään tulosta vastaavat LEDit */ /* suurimmasta alkaen */ /********************************************************************/ void main(void) { init(); // tee tarvittavat alustukset while(1) { if (int0done == TRUE) // onko seuraava tulos valmiina? { // jos on, päivitetään näyttö int0done = FALSE; // merkitse tulos käsitellyksi PORTB = 0x00; // sammuta kaikki LEDit PORTD = 0x00; if (int0count0 > 1234567) // тут число соответствующее делителю частоты и частоте вызова OCR PORTB.6 = 1; // sytytä 4. LED } }; } |