1. отключаю прерывание по int0
2. запускается ШИМ(OCR0A = 200)
3. пока кнопка нажата бесконечный while
4. OCR0A = 0;
5. включаю прерывание по INT0, прерывание заканчивается и МК снова засыпает
Проблема в том, что после того как он засыпает, на ножке ШИМ случайным образом появляется логическая единица. Я в чем-то ошибся и надо порт как-то к земле притягивать? В моем понимании вывод ШИМ должен быть прижат к земле во сне
Спойлер
#define F_CPU 600000#include <avr/io.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
#define PWM_PIN 0
#define BTN 1
ISR (INT0_vect) {
ClearBit(GIMSK, INT0);
OCR0A = 200;
while(~PINB & (1 << BTN));
OCR0A = 0;
SetBit(GIMSK, INT0);
}
int main(void){
DDRB = (1 << PWM_PIN); // set pins for output
PORTB = (1 << BTN); // set pullup for BTN
TCCR0A = (1 << COM0A1) | (1 << COM0A0) | (1 << WGM00) | (1 << WGM01);
TCCR0B = (1 << CS01);
TCNT0 = 0;
OCR0A = 0;
GIMSK |= (1 << INT0);
MCUCR |= (1 << SE) | (1 << SM1);
sei();
while(1){
sleep_cpu(); // sleep cpu
}
}