Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2016, 14:22   #1
Tatarin
Junior Member
 
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0
Tatarin is an unknown quantity at this point
Question Помогите с аналогичной функцией analogWrite

Код:
void setup() {
  //digitalWrite(3, HIGH);
}

void loop() {
  analogWrite(3, 1);
  delay(10000);
}
Светодиод слабо горит и пауза в 10 сек. ему не мешает.
Написал свою функцию analogWrite(aWrite).
Код:
void setup() {
  DDRD |= B00001000;
}
/*
 * pwm коэффициент заполнения
 */
void aWrite(volatile uint8_t *port, uint8_t pin, uint8_t pwm){
  int i = 0;
  while(i < pwm){
    *port = pin;
    i++;
  }
  
  int j = 0;
  while(j < 256 - pwm){
    *port = B00000000;
    j++;
  }
}

void loop() {
  //3 pin ATmega328
  aWrite(&PORTD, B00001000, 1);
  delay(10000);
}
Но светодиод лишь марает раз в 10 секунд.
Как можно заставить его постоянно гореть используя delay()?
Tatarin вне форума   Ответить с цитированием
Старый 11.03.2016, 15:10   #2
cyberlab
Senior Member
 
Регистрация: 25.11.2013
Сообщений: 116
Вес репутации: 0
cyberlab is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

Понять бы для чего это нужно?
Не понимаю что это будет, могу предложить использовать таймер, а в прерывании таймера обрабатывать Ваш ШИМ

Последний раз редактировалось cyberlab; 11.03.2016 в 15:53.
cyberlab вне форума   Ответить с цитированием
Старый 11.03.2016, 15:35   #3
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

Очень странный подход к моделированию ШИМ.
Вы скорость работы МК себе представляете? Передаете в качестве ШИМ "1" и думаете что вы способны заметить одиночный импульс меньше микросекунды среди 10 секундных задержек?

Для справки: МК с частотой в 16Мегагерц исполняет в среднем 1 команду за 1.5 такта (многие за 1, некоторые за 3 и редко чуть больше) .. соответственно за 1 мегагерц (миллион раз в сек) он исполняет в среднем 10-12 команд. Ваши циклы имеют длительность в несколько команд МК .. и?
Arhat109 вне форума   Ответить с цитированием
Старый 11.03.2016, 18:44   #4
Tatarin
Junior Member
 
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0
Tatarin is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

Цитата:
Сообщение от cyberlab Посмотреть сообщение
Понять бы для чего это нужно?
Не понимаю что это будет, могу предложить использовать таймер, а в прерывании таймера обрабатывать Ваш ШИМ
Задача сделать функцию analogWrite().

Цитата:
Сообщение от Arhat109 Посмотреть сообщение
Очень странный подход к моделированию ШИМ.
Вы скорость работы МК себе представляете? Передаете в качестве ШИМ "1" и думаете что вы способны заметить одиночный импульс меньше микросекунды среди 10 секундных задержек?

Для справки: МК с частотой в 16Мегагерц исполняет в среднем 1 команду за 1.5 такта (многие за 1, некоторые за 3 и редко чуть больше) .. соответственно за 1 мегагерц (миллион раз в сек) он исполняет в среднем 10-12 команд. Ваши циклы имеют длительность в несколько команд МК .. и?
Это мой первый опыт с микроконтроллером. Хочется разобраться как и что работает.
С таймерами, что то ничего не вышло. За справку спасибо, буду знать теперь.

Код переделал на такой и всё работает.
Код:
void setup() {
  int start;
  int i;

  Serial.begin(9600);
  Serial.print("Start test: ");
  start = millis() ;
  for (i = 0 ; i < 30000 ; i++){
    bitSet(DDRB, 3); //pin 11 
    bitSet(DDRD, 3); //pin 3
    //pinMode(11, OUTPUT);
    //analogWrite(3, 0);
    TCCR2A |= _BV(COM2B1);
    OCR2B = 0;
  }
  Serial.print(millis() - start);
  Serial.println(" msec \nend test");
}


void loop() {
  PORTB |=B00001000; 
  OCR2B=255;
  delay(10);
  if(PINB & B00001000) Serial.println("Gorit") ;
  delay(1000);
  PORTB &=B11110111; 
  OCR2B = 0;
  delay(10);
  if(!(PINB & B00001000)) Serial.println("Ne gorit") ;
  delay(1000);
}
P.S. не знаю на сколько правильная реализация.

Последний раз редактировалось Tatarin; 12.03.2016 в 10:15.
Tatarin вне форума   Ответить с цитированием
Старый 11.03.2016, 21:53   #5
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

Своеобразно конечно .. но без знания что и зачем Вы хотите сделать, что-то сказать ещё - нереально.
Arhat109 вне форума   Ответить с цитированием
Старый 12.03.2016, 10:27   #6
Tatarin
Junior Member
 
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0
Tatarin is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

Хочу сделать проект без использования Wiring и использовать более быстрые функции и команды.
------
Предыдущий пост обновил.
Код:
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
на:
Код:
TCCR2A |= _BV(COM2B1);
P.S. Может кому то пригодится.
Tatarin вне форума   Ответить с цитированием
Старый 12.03.2016, 12:05   #7
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Помогите с аналогичной функцией analogWrite

analogWrite() и многое другое есть в моей библиотеке, тут по соседству. Смотрите, пользуйтесь.
Arhat109 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:42. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика