11.03.2016, 14:22 | #1 |
Junior Member
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0 |
Помогите с аналогичной функцией analogWrite
Код:
void setup() { //digitalWrite(3, HIGH); } void loop() { analogWrite(3, 1); delay(10000); } Написал свою функцию 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); } Как можно заставить его постоянно гореть используя delay()? |
11.03.2016, 15:10 | #2 |
Senior Member
Регистрация: 25.11.2013
Сообщений: 116
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
Понять бы для чего это нужно?
Не понимаю что это будет, могу предложить использовать таймер, а в прерывании таймера обрабатывать Ваш ШИМ Последний раз редактировалось cyberlab; 11.03.2016 в 15:53. |
11.03.2016, 15:35 | #3 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
Очень странный подход к моделированию ШИМ.
Вы скорость работы МК себе представляете? Передаете в качестве ШИМ "1" и думаете что вы способны заметить одиночный импульс меньше микросекунды среди 10 секундных задержек? Для справки: МК с частотой в 16Мегагерц исполняет в среднем 1 команду за 1.5 такта (многие за 1, некоторые за 3 и редко чуть больше) .. соответственно за 1 мегагерц (миллион раз в сек) он исполняет в среднем 10-12 команд. Ваши циклы имеют длительность в несколько команд МК .. и? |
11.03.2016, 18:44 | #4 | ||
Junior Member
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
Цитата:
Цитата:
С таймерами, что то ничего не вышло. За справку спасибо, буду знать теперь. Код переделал на такой и всё работает. Код:
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); } Последний раз редактировалось Tatarin; 12.03.2016 в 10:15. |
||
11.03.2016, 21:53 | #5 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
Своеобразно конечно .. но без знания что и зачем Вы хотите сделать, что-то сказать ещё - нереально.
|
12.03.2016, 10:27 | #6 |
Junior Member
Регистрация: 11.03.2016
Сообщений: 3
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
Хочу сделать проект без использования Wiring и использовать более быстрые функции и команды.
------ Предыдущий пост обновил. Код:
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20); Код:
TCCR2A |= _BV(COM2B1); |
12.03.2016, 12:05 | #7 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Помогите с аналогичной функцией analogWrite
analogWrite() и многое другое есть в моей библиотеке, тут по соседству. Смотрите, пользуйтесь.
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|