Частотомер + Генератор на Таймере 2, что не так?

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

Собрал проверочный скетч ддля частотомера и Генератора от DIMAX, для проверки дополнил генератором на таймере2, не считает, выводы 11 и 5 замкнуты перемычкой, что не так???
 

volatile unsigned int int_tic=0; 
volatile unsigned long tic; 

enum Prescalers {
   PRESCALER_STOP = 0,
   PRESCALER_1 = 1, 
   PRESCALER_8 = 2, 
   PRESCALER_32 = 3, 
   PRESCALER_64 = 4, 
   PRESCALER_128 = 5, 
   PRESCALER_256 = 6, 
   PRESCALER_1024 = 7  
};


void setup() {
   Serial.begin(115200);
   TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
 //  pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
   
   pinMode(11, OUTPUT);
   uint8_t prescaler = PRESCALER_1; //Частота около 300кНz
   uint8_t topValue = 26;
   pinMode(11, OUTPUT);
   TCCR2A = 0x42;              // Инвертирование пина 11 по сравнению и режим CTC то OCR2A
   TCCR2B = 0x00 | prescaler;  // Установить СТС режим и делитель частоты
   OCR2A = topValue;           // установить TOP равным topValue
    }

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; 
}

void loop() {
 freq_meter();
 Serial.print(tic);
 Serial.println(" Hz ");
 delay(2000);

 }

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

На одном и том же МК?

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

sadman41 пишет:

На одном и том же МК?

да

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А что показывают в осциллографе и какое оказывается воздействие от внешнего генератора ?

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

sadman41 пишет:

А что показывают в осциллографе и какое оказывается воздействие от внешнего генератора ?

Сейчас нет возможности посмотреть, только вечером, генератор на таймере проверен неоднократно, частотомер из скетча DIMAX, тоже проверен, есть какая-то тонкость в аппаратном прерывании которую я не знаю, подозреваю, что оно на лапы микроконтроллера завязано и затрагивает пин 11

первый раз в монтиторе порта показывает 18Hz, далее 1 Hz

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Тонкость, несомненно, есть. Подождём вечера.

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

sadman41 пишет:

Тонкость, несомненно, есть. Подождём вечера.

С высокой долей вероятности (более 99,9%)  генератор на Timer2 не работает (((

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

ua6em, в скетче ошибок нет. Думаю кармическое что-то.. :)

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

dimax пишет:

ua6em, в скетче ошибок нет. Думаю кармическое что-то.. :)

Дима, что так, как у меня, так обязательно кармическое, просто под рукой была WAVGAT )))
На ардуино nano оказалось, что всё работает, сейчас буду пытать, на чём именно ломается WAVGAT
(Генератор точно работал на 2 таймере)

Генератор работает, не работает частотомер, увы...
В своём генераторе ты используешь два таймера. на третьем формируешь тау измерения 2 сек и всё работает, здесь всё упрощено и засада, где косяк? Почему на плате WAVGAT не работает?

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

ua6em, попробуйте с аддоном от WAVGat

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

dimax пишет:

ua6em, попробуйте с аддоном от WAVGat

с этим аддоном и компилировалось...
Так как генератор V2.5 для этого проца работает - надеялся, что проблем быть не должно...
Непонятки...Еще попытаю ...

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

ua6em, я залил в свой нано-вавгат, не меняя ни буквы из вашего кода - и всё заработало. Вам точно нужно сменить хобби на что-то другое :)

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

dimax пишет:

ua6em, я залил в свой нано-вавгат, не меняя ни буквы из вашего кода - и всё заработало. Вам точно нужно сменить хобби на что-то другое :)

Дмитрий! Это самое простое решение!
... орешек знаний твёрд, но всё же, мы не привыкли отступать...
И кстати, первую часть я же нормально сделал, чужие скетчи собирать воедино научился )))

Плату какую выбирал (аддон чей)?

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

ua6em пишет:

Плату какую выбирал (аддон чей)?

WAVGat

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

dimax пишет:

ua6em пишет:

Плату какую выбирал (аддон чей)?

WAVGat

У меня есть вторая плата, на ней версию 2.5 собираю, там частотомер работает, были проблемы - при запитке от ноутбука занижал вдвое частоту, его величество наводки 50 герц всему виной, провода - дюпон, запитал от повербанка и всё стало как было задумано, не хочется курочить, попытаю ещё платочку, может брак какой, попробую сделать раздельно частотомер на WAVGAT а генератор на nano...

Собрал скетч с частотомером от DIMAX (генератор для WAVGAT)
Компилируется! Мониторить на скорости порта вдвое выше )))
 

#include "lgtx8p.h"

volatile unsigned int int_tic=0; 
volatile int32_t  freq=0; 
unsigned long old_millis = 0;
unsigned long scet = 0;
int flag = HIGH;

enum Prescalers {
   PRESCALER_STOP = 0,
   PRESCALER_1 = 1, 
   PRESCALER_8 = 2, 
   PRESCALER_32 = 3, 
   PRESCALER_64 = 4, 
   PRESCALER_128 = 5, 
   PRESCALER_256 = 6, 
   PRESCALER_1024 = 7  
};


void setup() {
   pinMode(13, OUTPUT);
   Serial.begin(115200);
   TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
   //  pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
   
   //разгон до 32 МГц от внутреннего RC генератора
   CLKPR = 1<<PMCE;//разрешить изменение
   CLKPR = 0; //делитель =1
      
   // Таймер 2 настраиваем на генерирование меандра на 11 пине
   pinMode(11, OUTPUT);
   uint8_t prescaler = PRESCALER_1; //Частота около 300кНz (600kHz)
   uint8_t topValue = 26;
   pinMode(11, OUTPUT);
   TCCR2A = 0x42;              // Инвертирование пина 11 по сравнению и режим CTC то OCR2A
   TCCR2B = 0x00 | prescaler;  // Установить СТС режим и делитель частоты
   OCR2A = topValue;           // установить TOP равным topValue
  
  }

ISR (TIMER1_OVF_vect){ int_tic++;}

void freq_meter(){
//подготовка таймера1
TCCR1B=0; TCCR1A=0; TIMSK1 = 1<<TOIE1;// подключить прерывание
 int_tic=0; TCNT1=0; TIFR1=TIFR1;//всё обнулить
  //подготовка таймера3
   TCCR3B=0;TCCR3A=0; TIFR3=TIFR3; 
   //все 3 регистра стравнения что б удобнее смотреть регистр флагов
     uint16_t ocr = ( (uint32_t)F_CPU/1024) -1;
     OCR3AH=ocr>>8; OCR3AL=ocr;// -2 sec
     OCR3BH=ocr>>8; OCR3BL=ocr;// -2 sec
     OCR3CH=ocr>>8; OCR3CL=ocr;// -2 sec  
    TCCR3B=5<<CS30; //старт счёта 2х секунд
   TCCR1B=7<<CS10;//старт счёта таймера1 от тактового входа
  while(TIFR3==0);// крутится пока не будет флагов конца счёта 
 TCCR1B=0;// стоп Тimer1
TIMSK1=0;
if ( (TIFR3&(1<<0))==0){// если не было переполнения, то считаем
 freq= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
  int_tic=0; TCNT1 = 0; 
  } //monitor_flag=1;
 }
 

void loop() {
  if(millis() - old_millis >= 10000){
  freq_meter();
  old_millis = millis();
  Serial.print(freq);
  Serial.println(" Hz ");
     }
    if (flag != digitalRead(11)){flag=digitalRead(11); scet++;} 
    if (scet >=20000){digitalWrite(13, !digitalRead(13));scet=0;}
   }

 

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

Поправил скетч на предмет проверки исправности 5-го цифрового порта, работает, порт не битый:
 

// Скетч проверки исправности 5-го порта

#include "lgtx8p.h"
unsigned long scet = 0;
int flag = HIGH;

enum Prescalers {
   PRESCALER_STOP = 0,
   PRESCALER_1 = 1, 
   PRESCALER_8 = 2, 
   PRESCALER_32 = 3, 
   PRESCALER_64 = 4, 
   PRESCALER_128 = 5, 
   PRESCALER_256 = 6, 
   PRESCALER_1024 = 7  
};

void setup() {
   pinMode(13, OUTPUT);
   pinMode(5, OUTPUT);
    
   //разгон до 32 МГц от внутреннего RC генератора
   CLKPR = 1<<PMCE;//разрешить изменение
   CLKPR = 0; //делитель =1
      
   // Таймер 2 настраиваем на генерирование меандра на 11 пине
   pinMode(11, OUTPUT);
   uint8_t prescaler = PRESCALER_1; //Частота около 300кНz (600kHz)
   uint8_t topValue = 26;
   pinMode(11, OUTPUT);
   TCCR2A = 0x42;              // Инвертирование пина 11 по сравнению и режим CTC то OCR2A
   TCCR2B = 0x00 | prescaler;  // Установить СТС режим и делитель частоты
   OCR2A = topValue;           // установить TOP равным topValue
    } //END SETUP

void loop() {
      if (digitalRead(5) != digitalRead(11)){digitalWrite(5, digitalRead(11));} //синхронизируемся с 11 портом
      if (flag != digitalRead(5)){flag=digitalRead(5); scet++;} // счетчик работает от 5-го порта
      if (scet >=20000){digitalWrite(13, !digitalRead(13));scet=0;}
   } //END LOOP

 

Проверка Таймера на 5-м пине, тоже работает )))

#include "lgtx8p.h"

enum Prescalers {
   PRESCALER_STOP = 0,
   PRESCALER_1 = 1, 
   PRESCALER_8 = 2, 
   PRESCALER_64 = 3, 
   PRESCALER_256 = 4, 
   PRESCALER_1024 = 5
};
unsigned int counter = 0;

void setup() {
   pinMode(13, OUTPUT);
   
   uint8_t prescaler = PRESCALER_1024;
   uint8_t topValue = 255;
   pinMode(5, OUTPUT);
   TCCR0A = 0x12;              // Инвертирование пина 5 по сравнению и режим CTC то OCR0A
   TCCR0B = 0x00 | prescaler;  // Установить СТС режим и делитель частоты
   OCR0A = topValue;           // установить TOP равным topValue
}

void loop() {
  while(digitalRead(5)==LOW);
  counter++;
  if(counter==60000){
  digitalWrite(13,!digitalRead(13));
  counter = 0;}
}