Частотомер + Генератор на Таймере 2, что не так?
- Войдите на сайт для отправки комментариев
Пнд, 11/02/2019 - 15:46
Собрал проверочный скетч ддля частотомера и Генератора от 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);
}
На одном и том же МК?
На одном и том же МК?
да
А что показывают в осциллографе и какое оказывается воздействие от внешнего генератора ?
А что показывают в осциллографе и какое оказывается воздействие от внешнего генератора ?
Сейчас нет возможности посмотреть, только вечером, генератор на таймере проверен неоднократно, частотомер из скетча DIMAX, тоже проверен, есть какая-то тонкость в аппаратном прерывании которую я не знаю, подозреваю, что оно на лапы микроконтроллера завязано и затрагивает пин 11
первый раз в монтиторе порта показывает 18Hz, далее 1 Hz
Тонкость, несомненно, есть. Подождём вечера.
Тонкость, несомненно, есть. Подождём вечера.
С высокой долей вероятности (более 99,9%) генератор на Timer2 не работает (((
ua6em, в скетче ошибок нет. Думаю кармическое что-то.. :)
ua6em, в скетче ошибок нет. Думаю кармическое что-то.. :)
Дима, что так, как у меня, так обязательно кармическое, просто под рукой была WAVGAT )))
На ардуино nano оказалось, что всё работает, сейчас буду пытать, на чём именно ломается WAVGAT
(Генератор точно работал на 2 таймере)
Генератор работает, не работает частотомер, увы...
В своём генераторе ты используешь два таймера. на третьем формируешь тау измерения 2 сек и всё работает, здесь всё упрощено и засада, где косяк? Почему на плате WAVGAT не работает?
ua6em, попробуйте с аддоном от WAVGat
ua6em, попробуйте с аддоном от WAVGat
с этим аддоном и компилировалось...
Так как генератор V2.5 для этого проца работает - надеялся, что проблем быть не должно...
Непонятки...Еще попытаю ...
ua6em, я залил в свой нано-вавгат, не меняя ни буквы из вашего кода - и всё заработало. Вам точно нужно сменить хобби на что-то другое :)
ua6em, я залил в свой нано-вавгат, не меняя ни буквы из вашего кода - и всё заработало. Вам точно нужно сменить хобби на что-то другое :)
Дмитрий! Это самое простое решение!
... орешек знаний твёрд, но всё же, мы не привыкли отступать...
И кстати, первую часть я же нормально сделал, чужие скетчи собирать воедино научился )))
Плату какую выбирал (аддон чей)?
Плату какую выбирал (аддон чей)?
WAVGat
Плату какую выбирал (аддон чей)?
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;} }Поправил скетч на предмет проверки исправности 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;} }