Вопрос:
У меня возникли проблемы с настройкой высокоскоростного PWM на моем ATtiny85. Мне нужно использовать PCK со скоростью 400 кГц. Я считаю, что правильно соблюдал данные, но по какой-то причине флаги прерывания таймера не работают.
Если я программирую устройство, выход соответствующего штыря будет постоянным 5 В.
Если я закомментирую настройку PCK и вместо нее использую системные часы, флаги будут правильно установлены, а PWM будет работать нормально. Код размещен. Почему настройки флагов и PWM не работают?
#include <avr/io.h> #include <avr/interrupt.h> int main(void) { PORTB = 0; //Reset values on port B // After setting up the timer counter, // set the direction of the ports to output DDRB |= (1<<PB1) | (1<<PB0); // Set the direction of PB1 to an output // PLLCSR — PLL control and status register: // PLL is a clock multiplier — multiplies system 8 MHz by 8 to 64 MHz // PLL is enabled when:PLLE bit is enabled, // CKSEL fuse is programmed to 0001. This clock is // switched off in sleep modes! PLLCSR |= (1<<PLLE); // PLL enable // Wait until the PLOCK bit is enabled // before allowing the PCK to be enabled //WaitForPLOCK(); //unsigned int i = 0; while ((PLLCSR & (1<<PLOCK)) == 0x00) { // Do nothing until plock bit is set } PLLCSR |= (1<<PCKE); // Enable asynchronous mode, sets PWM clock source TCCR1 = (1<<CTC1) | // Enable PWM (1<<PWM1A) | // Set source to pck (1<<(CS10)) | // Clear the pin when match with ocr1x (1<<COM1A1); GTCCR = (1<<PWM1B) | (1<<COM1B1); // Set PWM TOP value — counter will count and reset // after reaching this value // OCR1C // 400 kHz 159 // 450 kHz 141 // 500 kHz 127 OCR1C = 159; // Enable Timer1 OVF interrupt TIMSK = (1<<OCIE1A) | (1<<TOIE1); sei(); // This should set the duty cycle to about 75% OCR1A = 120; Лучший ответ:
Ошибки (раздел 27 таблицы данных) заявляет, что PLL не будет блокировать до 6 МГц. Единственным обходным решением является установка часов на 6 МГц или выше.
Ответ №1
Решение включало предохранитель CKDIV8. Для правильного программирования этого плавкого предохранителя требуется HVSP “Высоковольтное последовательное программирование”. После извлечения этого предохранителя, чтобы устройство работало на частоте 8 МГц, PWM выдавал выход 400 кГц. Я надеюсь, что другие люди найдут это полезным!