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 р стоит, смысла заморачиваться не было
Печально. Просто делал на том что было.