Генератор с раздельной регулировкой длительности 0 и 1

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Может кто подбросит код готовый ?

Везде только меандры да ШИМы

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Если нет готового,подскажите   как удобнее  это реализовать  на  встроеном  milis или   другие таймеры подключать

или может     библиотеку  Timerone использовать ?

длительность 1..100мс  как для "0" так и для  "1"

 пока  использую  прерывание по совпадению но чёт   получается больше 1мс,точнее 1.024мс  длительность импульса

OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);


ISR(TIMER0_COMPA_vect) 
{

  PORTB ^=(1<<2); 
 }

 

SLKH
Offline
Зарегистрирован: 17.08.2015

проще всего на micros() (см. блинк без делэй)

ногами дрыгать напрямую или либой CyberLib (что одно и то же)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

selevo, тыц

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

оо круто но ...

неработает почему-то

void setup() {
pinMode(9,OUTPUT);
TCCR1A=(1<<COM1A1)|(1<<COM1A0);
TCCR1B=(1<<WGM13)|(1<<CS12)|(1<<CS10);
OCR1A=1; ICR1=0;
}
 bool trigger1; 
void loop() {

if (!trigger1)
{ 

   ICR1= 300;
   OCR1A= 300;
    trigger1=1;
    }


//OCR1A=100; ICR1=100;
 }

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

selevo, конечно не работает. А разве должен? Вы выкинули мой код и вснули свои параметры не понимая их смысл.

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

ну мне  то  нужно только вывод,я его только и оставил. С куском  терминальным  и с  вводом ,работает...

вообще не понятно работает... такого режима   нет в описании при котором  сравнивается с начала с одим потом с другим,  OCR1A и ICR1. Это какое-то колдунство.

 как тогдаа сделать   чтобы посто переменными  a и b задавать длительность ?

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

selevo пишет:

 как тогдаа сделать   чтобы посто переменными  a и b задавать длительность ?

Так всё уже было сделано в моём коде, переменные x и y задавали длительность единицы и ноля на выходе.

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

спасибо большое,работает,туплю сильно...

мне бы твои нервы боярин... )))

Рабочий код:

(дя увеличения   точности перестройки, можно делить  и на 1  вместо  1000 в обеих строках и шаг будет 1мкс но не менее 128 исходя из деления на 128)

void setup() {
Serial.begin(9600);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
TCCR1A=(1<<COM1A1)|(1<<COM1A0);
TCCR1B=(1<<WGM13)|(1<<CS12)|(1<<CS10);
OCR1A=1; ICR1=0;
 bool volatile trigger1;
  uint16_t x = 13;
 uint16_t y = 20;
   ICR1= (uint32_t) (x+y) *1000/128;
   OCR1A= (uint32_t) y*1000 /128;
}

void loop() {
  
    
 }



 

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

dimax пишет:

Так всё уже было сделано в моём коде, переменные x и y задавали длительность единицы и ноля на выходе.

Всё таки никак не могу понять   где  описание  такого режима работы таймера   было найдено ?

я весь  PDF  перерыл

10 раз

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

selevo, не знаю, что вы подразумеваете под описанием, даташит крайне скуп на подробности.  Это режим №8 в таблице "Waveform Generation Mode Bit Description"