Генератор на регистрах, можно ли и на 11 ноге (кроме 9 и 10) получить еще сигнал

Впишите сюда текст цитаты

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

int regim = 1;
int flag = 0;
int val = 100;
int dead = 10;
void setup() {
lcd.init();
lcd.backlight();

DDRB |= _BV(PB1) | _BV(PB2);       /* set pins as outputs */	

TCCR1A =B10110000;
TCCR1B =B00010001;

/* Или
analogWrite(9,5000 - 900);
analogWrite(10,5000 + 900);
*/

}
void loop()

{
if (digitalRead(14) == HIGH && flag == 0) //если кнопка нажата
// и перемення flag равна 0 , то …
{
regim++;
flag = 1;
if (regim > 10) //ограничение кол. режимов-нам и этих хатает
{
regim = 1; // переключать циклично
}
}

if (digitalRead(14) == LOW && flag == 1) //если кнопка НЕ нажата
//и переменная flag равна - 1 ,то …
{
flag = 0; //обнуляем переменную “knopka”
}

if (regim == 1) //первый режим
{
ICR1 = 3200; //задаем частоту 5КГЦ
OCR1A = 1500 - 90; //9пине
OCR1B = 1500 + 90; //10пине

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("5 Khz");

}

if (regim == 2) //второй режим
{
ICR1 = 1600; //задаем частоту 10КГЦ
OCR1A = 750 - 40; //9пине
OCR1B = 750 + 40; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“10 Khz”);
}

if (regim == 3) //третий режим
{
ICR1 = 800; //задаем частоту 20КГЦ
OCR1A = 380 - 15; //9пине
OCR1B = 380 + 15; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“20 Khz”);
}

if (regim == 4) //четвертый режим
{
ICR1 = 400; //задаем частоту 40КГЦ
OCR1A = 190 - 8; //9пине
OCR1B = 190 + 8; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“40 Khz”);
}

if (regim == 5) //пятый режим
{
ICR1 = 266; //задаем частоту 60КГЦ
OCR1A = 125 - 7; //9пине
OCR1B = 125 + 7; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“60 Khz”);
}

if (regim == 6) //шестой режим
{
ICR1 = 200; //задаем частоту 80КГЦ
OCR1A = 95 - 4; //9пине
OCR1B = 95 + 4; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“80 Khz”);
}

if (regim == 7) //седьмой режим
{
ICR1 = 160; //задаем частоту 100КГЦ
OCR1A = 75 - 4; //9пине
OCR1B = 75 + 4; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“100Khz”);
}

if (regim == 8) //восьмой режим
{
ICR1 = 106; //задаем частоту 150КГЦ
OCR1A = 48 - 4; //9пине
OCR1B = 48 + 4; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“150Khz”);
}

if (regim == 9) //девятый режим
{
ICR1 = 80; //задаем частоту 200КГЦ
OCR1A = 38 - 1; //9пине
OCR1B = 38 + 1; //10пине
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“200Khz”);
}

delay(50);
}

Впишите сюда текст цитаты


Можно ли на еще одной ножке получить сигнал длительностью 1/10 от длительности сигнала на 10 ноге

Вставьте, пожалуйста, код нормально.

А потом объясните, что вы пытаетесь сделать
Какой камень у вас?

Либо вставьте код по-человечески, либо идите на.

1 лайк

УНО
Что-то код косо встал, я вопрос про дед тайме в прошлый раз поднимал, помогли ребята, получился генератор на УНО с дед тайм, а вот можно ли и еще на какой то ноге получит “иголку”

На 11 ноге (PB3) есть OC2A - выход второго таймера

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

int regim = 1;
int flag = 0;
int val = 100;
int dead = 10;
void setup() {
  lcd.init();
  lcd.backlight();


  DDRB |= _BV(PB1) | _BV(PB2);       /* set pins as outputs */  

  TCCR1A =B10110000;
  TCCR1B =B00010001;


/* Или  
  analogWrite(9,5000 - 900);
  analogWrite(10,5000 + 900);
*/

  
}
void loop()

{
  if (digitalRead(14) == HIGH && flag == 0)  //если кнопка нажата
  // и перемення flag равна 0 , то ...
  {
    regim++;
    flag = 1;
    if (regim > 10)  //ограничение кол. режимов-нам и этих хатает
    {
      regim = 1;  //  переключать  циклично
    }
  }

  if (digitalRead(14) == LOW && flag == 1)  //если кнопка НЕ нажата
  //и переменная flag равна - 1 ,то ...
  {
    flag = 0;  //обнуляем переменную "knopka"
  }

  if (regim == 1)  //первый режим
  {
    ICR1 = 3200;   //задаем частоту 5КГЦ
    OCR1A = 1500 - 90;  //9пине
    OCR1B = 1500 + 90;  //10пине

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("5 Khz");
  }

  if (regim == 2)  //второй режим
  {
    ICR1 = 1600;   //задаем частоту 10КГЦ
    OCR1A = 750 - 40;  //9пине
    OCR1B = 750 + 40;  //10пине 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("10 Khz");
  }

  if (regim == 3)  //третий режим
  {
    ICR1 = 800;   //задаем частоту 20КГЦ
    OCR1A = 380 - 15;  //9пине
    OCR1B = 380 + 15;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("20 Khz");
  }

  if (regim == 4)  //четвертый режим
  {
    ICR1 = 400;   //задаем частоту 40КГЦ
    OCR1A = 190 - 8;  //9пине
    OCR1B = 190 + 8;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("40 Khz");
  }

  if (regim == 5)  //пятый режим
  {
    ICR1 = 266;   //задаем частоту 60КГЦ
    OCR1A = 125 - 7;  //9пине
    OCR1B = 125 + 7;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("60 Khz");
  }

  if (regim == 6)  //шестой режим
  {
    ICR1 = 200;   //задаем частоту 80КГЦ
    OCR1A = 95 - 4;  //9пине
    OCR1B = 95 + 4;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("80 Khz");
  }

  if (regim == 7)  //седьмой режим
  {
    ICR1 = 160;   //задаем частоту 100КГЦ
    OCR1A = 75 - 4;  //9пине
    OCR1B = 75 + 4;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("100Khz");
  }

  if (regim == 8)  //восьмой режим
  {
    ICR1 = 106;  //задаем частоту 150КГЦ
    OCR1A = 48 - 4;  //9пине
    OCR1B = 48 + 4;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("150Khz");
  }

  if (regim == 9)  //девятый режим
  {
    ICR1 = 80;   //задаем частоту 200КГЦ
    OCR1A = 38 - 1;  //9пине
    OCR1B = 38 + 1;  //10пине
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("200Khz");
  }

  
  delay(50);
}

а как мне связать ногу 10 первого таймера с 11 ногой 2 таймера?

Во первых = используйте switch - case, а не if. Со строки 47

На уно все остальные таймеры 8битные. Так что подобрать частоту может и не получится

Вы упорно пытаетесь вырастить кокс кокос на Северном полюсе. Почему не взять стм32 для этого?

Облазил все свои загашники…стм32 не нашел. Уно–аж 4 шт есть

Задачка интересная… чисто теоретически…
я не знаю, умеют ли таймеры Уно работать в паре. Читайте даташит на эту тему…

Аппаратно формируйте короткий импульс по фронту на 10 ноге

Я правильно понимаю : таймер 1 (16-битный) имеет только 2-у выходные ножки (9 и 10)…и что-то генерить на еще одной ноге не способен? Т.е программно я из нее все вытянул, и только аппаратно (используя внешний триггер) могу получить иголку от 10 ноги?

Всё зависит от того на сколько фронт иголки может отставать от фронта на 10 ноге…
Вход прерывание и формирование импульса это ~6 тактов процессора. Можно видимо привязаться к спаду на 9 ноге и выиграть несколько тактов.

Вы уж из извините меня, дилетанта. Как только я вижу слово “прерывания”–у меня отрицательное отношение к этому слову. Поэтому я писал этот скетч генератора… на регистрах. Отставать (новый)сигнал по фронту, от сигнала не должен. Т.е его длительность должна быть минимальна, по сравнению с сигналом на 10 ноге. Может на регистрах есть такая фича, получить еще один сигнал на какой-то ноге (по фронту совпадающий с 10 ногой)

Здесь, когда я просил помощи ввести “”““dead time””“”" в генераторе на регистрах УНО, некоторые сомневались в возможности этого (это можно только на stm32!!!)…но вопрос оказался решаемым. Вот и я , снова надеюсь на чудо:-)))))

Нет. Только две ноги. Можно второй таймер запустить, но он 8 битный и не все частоты будут доступны !

А второй таймер может по фронту сигнала на 10 ноге выдать на какой то ноге импульс 1 миллисекунду? В принципе, у меня генератор до 200кгц (если это что то значит для 2 таймера)

Не “по фронту”, а сам по себе. То есть вам надо запустить два таймера синхронно с одной частотой. Поскольку тактируются они от одного источника, то один раз запущенные синхронно - они так и будут синхронно тикать, пока не остановите