Быстрый ШИМ с Arduino, входы-выходы не работают
Привет сообществу!
Я использую ATTINY85 и программирую его через AVRISP с помощью Arduino UNO.
Вот код, который я использую :
#include <avr/io.h>
#include <avr/interrupt.h>
void setup() {
PORTB = 0; //Сброс значений на порту B
// После настройки счетчика таймера
// установите направление портов для вывода
DDRB |= (1<<PB1) | (1<<PB0) | (1<<PB3); // PB0, PB1 and PB3
// PLLCSR - PLL control and status register:
// PLL-это тактовый множитель
// - умножает систему 8 МГц на 8 до 64 МГц
// PLL включен, когда включен бит: PLLE,
// Предохранитель CKSEL запрограммирован на 0001. Эти часы
// выключены в спящем режиме!
PLLCSR |= (1<<PLLE); // PLL вкл
// Подождите, пока бит PLOCK не будет включен
// прежде чем разрешить включение PCK
//WaitForPLOCK();
//unsigned int i = 0;
while ((PLLCSR & (1<<PLOCK)) == 0x00)
{
// Ничего не делайте до тех пор, пока не будет установлен бит plock
}
// Включить асинхронный режим, установить источник тактовых импульсов ШИМ
PLLCSR |= (1<<PCKE);
TCCR1 = (1<<CTC1) | // включить PWM
(1<<PWM1A) | // Установить источник в pck
(0<<(CS13)) |
(0<<(CS12)) |
(1<<(CS11)) |
(1<<(CS10)) | // Clear the pin when match with ocr1x
(1<<COM1A1);
GTCCR = (1<<PWM1B) | (1<<COM1B1);
// Set PWM TOP value - счетчик будет отсчитываться и сбрасываться
// после достижения этого значения
// OCR1C
// 100 кГц 159
// 80 кГц 199
OCR1C = 199;
// Enable Timer1 OVF interrupt
TIMSK = (1<<OCIE1A) | (1<<TOIE1);
sei();
OCR1A = 190; //chaning th FR
}
void loop() {
PORTB |= (1 << PB3);
delay(500);
PORTB &= ~(1 << PB3);
delay(500);
}
проблема в том, что при использовании ШИМ мои остальные выходы не работают . Есть идеи, почему это происходит?
Я использую библиотеку ATTINY CORE от Spence Konde.
@Johny Arduino, 👍1
1 ответ
▲ 5
Эта строка:
TIMSK = (1<<OCIE1A) | (1<<TOIE1);
включает пару прерываний генерируемых таймером 1. Всякий раз, когда вы
включаете источник прерывания, вы должны убедиться, что соответствующий ISR
был определен. В противном случае запрос прерывания направляется в
__bad_interrupt ()
, который по умолчанию переходит к вектору сброса , тем самым
сбрасывая вашу программу.
,
@Edgar Bonet
Смотрите также:
- attiny85 и arduino — аналоговое чтение + pwmOut
- Двигатель постоянного тока шумит, но не вращается
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Как прочитать значение PIN PWM-выхода?
- Задержка PWM без блокировки кода
- Arduino вылетает и перезагружается
- Почему переменные PWM в этом фрагменте кода RC обрабатываются таким образом? Что такое магические числа?
- Как объявить массив переменного размера (глобально)
Потрясающе!! Спасибо! Это сработало!, @Johny Arduino