Таймер Arduino nano (mega328) Внешний тактовый источник на выводе

foxsto
Offline
Зарегистрирован: 28.03.2017

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

перегуглил массу примеров заливал в микроконтроллер и тишина, подача сигнала на ноги микроконтроллера никак не влияет на таймер

пожалуйста поделитесь рабочим таймером от внешнего тактового источника на выводе

может я не правильно ноги для таймера инициализирую?

и из таблицы сказано что нужно cs12 и cs11 включить

  // инициализация Timer1
  cli();  // отключить глобальные прерывания
  TCCR1A = 0;   // установить регистры в 0
  TCCR1B = 0;

  OCR1A = 0; // установка регистра совпадения

  TCCR1B |= (1 << WGM12);  // включить CTC режим
  TCCR1B |= (1 << CS11);

  TIMSK1 |= (1 << OCIE1A);  // включить прерывание по совпадению таймера
  sei(); // включить глобальные прерывания

обычно я пользуюсь таким таймером

b707
Offline
Зарегистрирован: 26.05.2017

и где тут внешний тактовый источник?

foxsto пишет:

из таблицы сказано что нужно cs12 и cs11 включить

если вы сами это пишете, почему в вашем коде этого нет?

foxsto
Offline
Зарегистрирован: 28.03.2017

зачем писать если это не работает,

     cli(); // отключить глобальные прерывания
    TCCR1A = 0; // установить TCCR1A регистр в 0
    TCCR1B = 0;
    TIMSK1 = (1 << TOIE1);
    TCCR1B |= (1<<CS11)|(1<<CS12);

    sei();  // включить глобальные прерывания)|(1<

на пине D5 генератор висит, таймер молчит

b707
Offline
Зарегистрирован: 26.05.2017

foxsto пишет:

зачем писать если это не работает,

 )|(1<

"я пробовал заводить с бензином и без, разницы нет, поэтому бензин слил..." ?

 

как проверяли то?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

можно сделать по образцу частотомера от DIMAX:
 

/*************** Ч А С Т О Т О М Е Р **********************/
volatile unsigned int int_tic=0; 
float freq_tic=0; 
volatile unsigned long tic; 
ISR (TIMER1_OVF_vect){ int_tic++; }

void freq_meter() {
     pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
     TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактирование от входа Т1
     delay(1000);
     TCCR1B=0;                             // Остановить счетчик
     tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
     int_tic=0; TCNT1 = 0; 
     freq_tic =(float) tic/1000.0;
}

 

foxsto
Offline
Зарегистрирован: 28.03.2017

 

припаял контакты подключил осциллограф, в таймере поставил на ногу шим сигнал

foxsto
Offline
Зарегистрирован: 28.03.2017

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

foxsto пишет:

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

В 99.9% сообщений на форумах далее информации не поступает )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

foxsto пишет:

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

В 99.9% сообщений на форумах далее информации не поступает )))

особенно когда ошибка детская )))

foxsto
Offline
Зарегистрирован: 28.03.2017

подправил код, запустил 32кГц на D5 3.3v

не работает

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("порт запущен");
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
  TCNT1 = 0;
}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}

если добавить в код запись

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("порт запущен");
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
  TCNT1 = 0;
  
  TIMSK1 = (1<<OCIE1A);   // Разрешить прерывание по совпадению

}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}

то вроде как срабатывает когда на ногу сигнал идет но не счетчик а ребут

foxsto
Offline
Зарегистрирован: 28.03.2017

Путем подбора с разных таймеров нашел рабочий вариант,

счетчик прибавляется но не со скоростью 32 кгц а гораздо медленнее

volatile unsigned int int_tic = 0;


void setup() {
  Serial.begin(9600);
  Serial.println("порт запущен");
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
  TCNT1 = 0;
  TIMSK1 = (1<<OCIE1A);   // Разрешить прерывание по совпадению
}
ISR (TIMER1_COMPA_vect) {
  int_tic++;
}
void loop() {
  Serial.println(int_tic);
  //delay(1000);
}

все равно где то что то не так

ua6em спасибо за код

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

foxsto пишет:

все равно где то что то не так

ua6em спасибо за код

в смысле не так, настроено на переполнение, когда произойдёт переполнение счетчика вызовется прерывание оно и добавит значение

PS это код частотомера выдранный у DIMAX )))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013
ua6em, заметь, ТС нигде не писал что ему надо получить от затактироваyного внешним сигналом таймера. Нафига он вывел счётчик переполнений в сериал можно только гадать...
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

dimax пишет:

можно только гадать...
 
Это как раз понятно - что бы сравнить теплое с мягким ...
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

ua6em, заметь, ТС нигде не писал что ему надо получить от затактироваyного внешним сигналом таймера. Нафига он вывел счётчик переполнений в сериал можно только гадать...
 

мне надо было частоту внешнего генератора, на удивление код частотомера работает весьма точно, допустимой мне точности в 500 герц на 300кгц он укладывается с запасом )))

PS Дмитрий! Заметил, что новички всё менее и менее могут описать требуемую задачу? Пришло поколение ЕГЭ...

foxsto
Offline
Зарегистрирован: 28.03.2017

ua6em

код в чистом виде не работает что был изначально

/*************** Ч А С Т О Т О М Е Р **********************/
volatile unsigned int int_tic=0; 
float freq_tic=0; 
volatile unsigned long tic; 
ISR (TIMER1_OVF_vect){ int_tic++; }

void freq_meter() {
     pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
     TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактирование от входа Т1
     delay(1000);
     TCCR1B=0;                             // Остановить счетчик
     tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
     int_tic=0; TCNT1 = 0; 
     freq_tic =(float) tic/1000.0;
}

может у меня maga328 бракованая

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

foxsto пишет:

ua6em

код в чистом виде не работает что был изначально

/*************** Ч А С Т О Т О М Е Р **********************/
volatile unsigned int int_tic=0; 
float freq_tic=0; 
volatile unsigned long tic; 
ISR (TIMER1_OVF_vect){ int_tic++; }

void freq_meter() {
     pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
     TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактирование от входа Т1
     delay(1000);
     TCCR1B=0;                             // Остановить счетчик
     tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
     int_tic=0; TCNT1 = 0; 
     freq_tic =(float) tic/1000.0;
}

может у меня maga328 бракованая

тут нечему не работать

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вы уверены что таймер по умолчанию работает в нужном вам режиме ??? Настройте и TCCR1A !!!

Смотрим wiring.c функция init:

	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10);
#endif

8-bit phase correct pwm mode - это тот режим что вам нужен ?

Может пора уже опубликовать ПОЛНЫЙ код с проблемой ???

foxsto
Offline
Зарегистрирован: 28.03.2017

Komandir пишет:

Вы уверены что таймер по умолчанию работает в нужном вам режиме ??? Настройте и TCCR1A !!!

Смотрим wiring.c функция init:

	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10);
#endif

8-bit phase correct pwm mode - это тот режим что вам нужен ?

Может пора уже опубликовать ПОЛНЫЙ код с проблемой ???

полный код я и выкладывал посути уже выше, мне нужен таймер который от шим сигнала внешнего на ноге D5 будет считать циклы если таймер1 на это не способен то сойдет другой таймер только не таймер0

что то вроде этого

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("порт запущен");
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
  TCNT1 = 0;
}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}

просто я не знаю даташитов что где как нужно прописать

стандартные таймеры с предделителем то работают, а вот от внешнего сигнала не могу таймер правильно прописать

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для начала добавьте TCCR1A = 0

foxsto
Offline
Зарегистрирован: 28.03.2017

Komandir пишет:

Для начала добавьте TCCR1A = 0

так тоже не работает(

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("порт запущен");
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  TCCR1A = 0;
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
  TCNT1 = 0;
}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

И разрешить прерывание от таймера 1 по переполнению:

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("START");
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  TIMSK1 = 1 << TOIE1;
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}
При 100К на входе:
START
0
1

Зачем вы в это лезете ??? Если дуб-дубом ???

foxsto
Offline
Зарегистрирован: 28.03.2017

Komandir пишет:

И разрешить прерывание от таймера 1 по переполнению:

volatile unsigned int int_tic = 0;

ISR (TIMER1_OVF_vect) {
  int_tic++;
}
void setup() {
  Serial.begin(9600);
  Serial.println("START");
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  TIMSK1 = 1 << TOIE1;
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
}
void loop() {
  Serial.println(int_tic);
  delay(1000);
}
При 100К на входе:
START
0
1

Зачем вы в это лезете ??? Если дуб-дубом ???

ваш код не работает

точнее он работает, но хуже чем варианте что я выкладывал #10

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Всё зависит от частоты на входе и от пределов таймера - сейчас таймер переполняется после 65536 импульсов на входе. С какой частотой работает ваш генератор на входе D5 ?

Что вы хотите получить ? если надо срабатывать на каждый входной импульс, то при чем тут таймер вообще ? Для этого надо использовать прерывание по входу !!!

foxsto
Offline
Зарегистрирован: 28.03.2017

Зачем вы в это лезете ??? Если дуб-дубом ???

для того чтобы понять как это работает, но не на бумаге а физически

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

del

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

32K как раз за 2 секунды 1 раз переполняют таймер на 64К !!!

Выводите тогда так - ((uint32_t)int_tic<<16) | TCNT1 - это будет число пришедших импульсов.

foxsto
Offline
Зарегистрирован: 28.03.2017

Komandir пишет:

Всё зависит от частоты на входе и от пределов таймера - сейчас таймер переполняется после 65536 импульсов на входе. С какой частотой работает ваш генератор на входе D5 ?

Что вы хотите получить ? если надо срабатывать на каждый входной импульс, то при чем тут таймер вообще ? Для этого надо использовать прерывание по входу !!!

а таймер не может работать по совпадению сигнала?

без счетчиков, чтобы тока сигнал с ноги появился он сработал?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Таймер СЧИТАЕТ импульсы. Что с чем он должен сравнивать ?

ОПИШИТЕ задачу-вопрос-проблему полностью !!!

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

foxsto пишет:

а таймер не может работать по совпадению сигнала?

без счетчиков, чтобы тока сигнал с ноги появился он сработал?

Изучите INT0, INT1, PCINT0, PCINT1, ... ....

foxsto
Offline
Зарегистрирован: 28.03.2017

Komandir пишет:

foxsto пишет:

а таймер не может работать по совпадению сигнала?

без счетчиков, чтобы тока сигнал с ноги появился он сработал?

Изучите INT0, INT1, PCINT0, PCINT1, ... ....

хорошо спасибо