Atmega8 и analogWrite()
- Войдите на сайт для отправки комментариев
Всем добрый день! Пишу программу для радиоуправления игрушкой. Пишу в АРДУИНО IDE, и потом прошиваю АТмегу8. Немного по коду: передатчик передает 1 байт, в котором 4 младших бита отвечают за управление (направление движения, повороты), а 4 старших бита передают значение скорости от 0 до 15. Программа конвертирует их в значения 60 - 255 для ШИМ. Так вот этот ШИМ таки и не работает. При низком значении скорости на порту PB1 (пин 9) стоит "0", а если скорость увеличивать, то PB1 просто переключается в "1". ШИМа нет. Почему-то analogWrite() не срабатывает. Можете подсказать в чем ошибка? Проверял код на АрдуиноМЕГА2560 и ДУЕ - работает, а на АТмеге8 не хочет.. То есть все работает кроме ШИМ. Порт просто включается или выключается. Код:
#include <avr/io.h>
//#include <util/delay.h>
#include <SPI.h>
#include <RF24.h>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
RF24 radio(10, 5);
const uint32_t pipe = 123456789;
byte data[4];
byte speedBtnS;
int SPD = 0;
void setup()
{
DDRD |= (1<<9);
DDRD |= (1<<6);
DDRD |= (1<<7);
PORTD &= ~(1<<6);
PORTD &= ~(1<<7);
myservo.attach(8); // attaches the servo on pin 9 to the servo object
//Serial.begin(57600);
radio.begin();
radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
radio.openReadingPipe(1,pipe); // открыть канал на приём
radio.startListening(); // приём
myservo.write(90);
}
void loop()
{
if(radio.available())
{
radio.read(data, 1);
//Serial.println(data[0]);
speedBtnS = (data[0] & 0b11110000) >> 4;
//speedBtnS = map(speedBtnS, 0, 15, 63, 255);
analogWrite(9, (speedBtnS*13) + 60);
if (data[0] & 0b00000001){ // чтение конкретного бита
if (data[0] & 0b00000010){ // чтение конкретного бита
myservo.write(120); // налево
}
else
{
myservo.write(60); // направо
}
}
else
{
myservo.write(90); // прямо
}
if (data[0] & 0b00000100){ // чтение конкретного бита
if (data[0] & 0b00001000){ // чтение конкретного бита
PORTD |= (1<<6);
PORTD &= ~(1<<7);//// вперед
}
else
{
PORTD |= (1<<7);
PORTD &= ~(1<<6); //// назад
}
}
else
{
PORTD &= ~(1<<7);
PORTD &= ~(1<<6); // стоп
}
}
}
проверьте через пример "FADE" со светодиодом
какая версия ИДЕ, может таймеры не прописаны?
Вот только хотел написать ответ, как вы успели раньше меня.
Ошибка была банальная: изначально планировал ШИМ брать с PD5 (ардуино pin5), но оказалось что этот пин не поддерживает команду analogWrite(), а только ардуино пины 9-11 (PB1-PB3). Я по схеме перекинул с PD5 (pin5) на PB1 (pin9), а в коде вместо DDRB |= (1<<1); написал DDRD |= (1<<9);
Ошибка была в том что я неправильный порт указал и не настроли порт с шимом на выход. Пять минут манипуляций в Протеусе помогли найти ошибку.
Нет, всеравно не заработало. В протеусе я тестировал "голый" код. Без всяких библиотек. В железе не заработало. Убирая по частям части кода и тестируя обнаружил что analogWrite() (ШИМ) работает только если не подключена библиотека <Servo.h>. Вот стоит ее удалить и ШИМ сразу начинает работать. Похоже что библиотека сервы что-то меняет в настройках таймера или портов... Как выйти из положения?
Нет, всеравно не заработало. В протеусе я тестировал "голый" код. Без всяких библиотек. В железе не заработало. Убирая по частям части кода и тестируя обнаружил что analogWrite() (ШИМ) работает только если не подключена библиотека <Servo.h>. Вот стоит ее удалить и ШИМ сразу начинает работать. Похоже что библиотека сервы что-то меняет в настройках таймера или портов... Как выйти из положения?
а, ты почитай в описании библиотеки серво, какие ресурсы она юзает и как это влияет определённые выводы PWM
я тоже в свое время на этом накололся. на меге 8 только 3 аппаратных шима, 9 10 11 пины ардуиновские. 11 пин также относится к spi, поэтому когда ру игрушки делал оставались только 9 и 10 пины. но если нужна еще серва она блокирует шим на 9 и 10 пине. итого шимов вообще не остается. изза этого если нужна серва+nrf24l01+шим приходилось ставить мегу328. это было проще чем разбираться с программным шимом, и не хотелось мирится с его недостатками. про мини таже меньше 100 р стоит, смысла заморачиваться не было
Печально. Просто делал на том что было.