Или я туплю или одно из двух. ШИМ работает от таймера. Все зависит от режима (стр 104, 133, 157, ДШ ATmega48/88/168) Я через TCNT не делал, не зачем было! Вот мой код вывода звука через ШИМ.
- Код: Выделить всё
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
unsigned int sound = 0;
unsigned char *data;
#define DIV_0 ((0 << CS22) | (0 << CS21) | (1 << CS20))
#define DIV_8 ((0 << CS22) | (1 << CS21) | (0 << CS20))
#define DIV_64 ((0 << CS22) | (1 << CS21) | (1 << CS20))
#define DIV_256 ((1 << CS22) | (0 << CS21) | (0 << CS20))
#define DIV_1024 ((1 << CS22) | (0 << CS21) | (1 << CS20))
ISR(SIG_OUTPUT_COMPARE3A) {
sei();
if (sound) {
if (sound--) {
OCR1B = pgm_read_byte(data++);
} else {
TCCR1A = 0;
TCCR1B = 0;
TCCR3B = 0;
DDRE &= ~(1 << PE2);
}
}
TCNT3 = 0;
}
void SoundPlay(unsigned char* wave, unsigned int wave_size) {
if (!sound) {
data = wave;
sound = wave_size;
DDRE |= (1 << PE2);
TCCR1A = (1 << WGM10) | (1 << COM1B1);
TCCR1B = (1 << WGM12) | DIV_0;
TCCR3A = 0;
TCCR3B = DIV_8;
OCR3A = 125;
ETIMSK |= (1 << OCIE3A);
TCNT3 = 0;
}
}
ATmega162, внутрений RC, CKDIV=1 (8мгц)
На 1 таймере сидит ШИМ (32 кгц), на 3 - таймер для его обновления (8 кгц)