nest пишет:
Demckiy пишет:
это как ?работает только одно ШИМ или управления портами
Я не знаю как объяснить, это надо смоделировать в протеусе ...там сразу видно....
/*******************************************
Program :
Compiler : WinAVR
Chip type : ATmega8
System Clock : 8 MHz
*******************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
// External Interrupt 0 service routine
ISR(INT0_vect)
{
TCCR2 = 0b00000000; // stop Timer/Counter 2
TCNT1 = 0;
TCCR1B = 0b00000101; // start Timer/Counter 1
PORTB |= 0b00000001; // LED on
}
// Timer 1 overflow interrupt service routine
ISR(TIMER1_OVF_vect)
{
TCNT2 = 0;
OCR2 = 15;
TCCR2 = 0b00000111; // start Timer/Counter 2
TCCR1B = 0b00000000; // stop Timer/Counter 1
}
// Timer 2 overflow interrupt service routine
ISR(TIMER2_OVF_vect)
{
PORTB &= 0b11111110; // LED off
OCR2 += 2;
if( OCR2 > 240 )
{
TCCR2 = 0b00000000; // stop Timer/Counter 2
}
}
// Timer2 output compare interrupt service routine
ISR(TIMER2_COMP_vect)
{
PORTB |= 0b00000001; // LED on
}
int main(void)
{
// Input/Output Ports initialization
// Port B initialization
DDRB = 0b00000001; // PB0 LED
PORTB = 0b00000000;
// Port C initialization
DDRC = 0b00000000;
PORTC = 0b00000000;
// Port D initialization
DDRD = 0b00000000; // PD2 button
PORTD = 0b00000100;
// Timer/Counter 1 initialization
// bits: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
TCCR1A = 0b00000000;
// bits: ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
TCCR1B = 0b00000000;
TCNT1 = 0;
// Timer/Counter 2 initialization
// bits: - - - - AS2 TCN2UB OCR2UB TCR2UB
ASSR = 0b00000000;
// bits: FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20
TCCR2 = 0b00000000;
TCNT2 = 0;
OCR2 = 15;
// Timer(s)/Counter(s) Interrupt(s) initialization
// bits: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0
TIMSK = 0b11000100;
// External Interrupt(s) initialization
// bits: SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00
MCUCR = 0b00000001;
// bits: INT1 INT0 - - - - IVSEL IVCE
GICR = 0b01000000;
// bits: INTF1 INTF0 - - - - - -
GIFR = 0b01000000;
// Global enable interrupts
sei();
while (1)
{
}
return 0;
}
/*******************************************
Program :
Compiler : CVAVR
Chip type : ATmega8
System Clock : 8 MHz
*******************************************/
#include <mega8.h>
/* обработчик прерывания по внешнему сигналу на INT0 */
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
TCCR1B = 0b00000101; /* запуск таймера/счетчика 1 с предделителем 1024 */
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
/* обработчик прерывания по переполнению таймера/счетчика 1 */
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
TCCR1B = 0b00000000; /* остановка таймера/счетчика 1 */
}
/* обработчик прерывания по переполнению таймера/счетчика 2 */
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTB &= 0b11111110; /* установить 0 на PB0, выключение светодиода */
OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
if( OCR2 > 240 ) /* если значение регистра сравнения таймера/счетчика 2 больше
240, то ... */
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
}
}
/* обработчик прерывания по совпадению таймера/счетчика 2 */
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
void main(void)
{
/* инициализация порта B */
DDRB = 0b00000001; /* PB0 светодиод */
PORTB = 0b00000000;
/* инициализация порта C */
DDRC = 0b00000000;
PORTC = 0b00000000;
/* инициализация порта D */
DDRD = 0b00000000; /* PD2 кнопка */
PORTD = 0b00000100;
/* инициализация таймера/счетчика 1 */
/* регистр управления таймером/счетчиком 1 А */
/* биты: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 */
TCCR1A = 0b00000000;
/* регистр управления таймером/счетчиком 1 В */
/* биты: ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 */
TCCR1B = 0b00000000;
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
/* инициализация таймера/счетчика 2 */
/* регистр асинхронного режима таймера/счетчика 2 */
/* биты: - - - - AS2 TCN2UB OCR2UB TCR2UB */
ASSR = 0b00000000;
/* регистр управления таймером/счетчиком 2 */
/* биты: FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 */
TCCR2 = 0b00000000;
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
/* инициализация прерываний таймеров/счетчиков */
/* биты: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0 */
TIMSK = 0b11000100; /* разрешены прерывания по переполнению таймера/счетчика
1, по переполнению таймера/счетчика 2 и по совпадению таймера/счетчика 2 */
/* инициализация прерываний по внешнему сигналу */
/* биты: SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00 */
MCUCR = 0b00000001; /* флаг прерывания выставляется при изменении логического
уровня на INT0 */
/* биты: INT1 INT0 - - - - IVSEL IVCE */
GICR = 0b01000000; /* разрешение прерывания INT0 */
/* биты: INTF1 INTF0 - - - - - - */
GIFR = 0b01000000; /* сброс флага INT0 */
/* общее разрешение прерываний */
#asm("sei"
while (1)
{
}
}