Atmega8 и analogWrite()

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем добрый день! Пишу программу для радиоуправления игрушкой. Пишу в АРДУИНО 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); // стоп
      }        
   }
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

проверьте через пример "FADE" со светодиодом

какая версия ИДЕ, может таймеры не прописаны?

forfrends
Offline
Зарегистрирован: 24.02.2015

Вот только хотел написать ответ, как вы успели раньше меня.

Ошибка была банальная: изначально планировал ШИМ брать с PD5 (ардуино pin5), но оказалось что этот пин не поддерживает команду analogWrite(), а только ардуино пины 9-11 (PB1-PB3). Я по схеме перекинул с PD5 (pin5) на PB1 (pin9), а в коде вместо DDRB |= (1<<1); написал DDRD |= (1<<9);

Ошибка была в том что я неправильный порт указал и не настроли порт с шимом на выход. Пять минут манипуляций в Протеусе помогли найти ошибку.

forfrends
Offline
Зарегистрирован: 24.02.2015

Нет, всеравно не заработало. В протеусе я тестировал "голый" код. Без всяких библиотек. В железе не заработало. Убирая по частям части кода и тестируя обнаружил что analogWrite() (ШИМ) работает только если не подключена библиотека <Servo.h>. Вот стоит ее удалить и ШИМ сразу начинает работать. Похоже что библиотека сервы что-то меняет в настройках таймера или портов... Как выйти из положения?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

forfrends пишет:

Нет, всеравно не заработало. В протеусе я тестировал "голый" код. Без всяких библиотек. В железе не заработало. Убирая по частям части кода и тестируя обнаружил что analogWrite() (ШИМ) работает только если не подключена библиотека <Servo.h>. Вот стоит ее удалить и ШИМ сразу начинает работать. Похоже что библиотека сервы что-то меняет в настройках таймера или портов... Как выйти из положения?

а, ты почитай в описании библиотеки серво, какие ресурсы она юзает и как это влияет определённые выводы PWM

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я тоже в свое время на этом накололся. на меге 8 только 3 аппаратных шима, 9 10 11 пины ардуиновские. 11 пин также относится к spi, поэтому когда ру игрушки делал оставались только 9 и 10 пины. но если нужна еще серва она блокирует шим на 9 и 10 пине. итого шимов вообще не остается. изза этого если нужна серва+nrf24l01+шим приходилось ставить мегу328. это было проще чем разбираться с программным шимом, и не хотелось мирится с его недостатками. про мини таже меньше 100 р стоит, смысла заморачиваться не было

forfrends
Offline
Зарегистрирован: 24.02.2015

Печально. Просто делал на том что было.