Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 3 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 21 по 30 из 56

Тема: Частотомер на mega8

  1. #21
    Цитата Сообщение от Ромм Посмотреть сообщение
    1. Я так понимаю, что установится флаг прерывания и оно встанет в очередь на обработку
    TCNT0 станет равным 0, а А не увеличится - будет ошибка.

    Цитата Сообщение от Ромм Посмотреть сообщение
    2. Думаю тоже самое
    Да, но секундный интервал будет не выдержан.

    Цитата Сообщение от Ромм Посмотреть сообщение
    3. Возможно я не правильно понял
    В обработчике прерывания уже запрещены.

    Цитата Сообщение от Ромм Посмотреть сообщение
    5. Что значит по заданному модулю?
    Я не помню, но скорее что-то типа compare - автосброс по достижению заданного значения. Но ещё раз скажу - так не пробьётесь. Измерительный интервал-то нужно выдержать с точностью до такта.
    С уважением. Сергей.


  2. #22

    Регистрация
    26.02.2004
    Адрес
    Николаев
    Сообщений
    13,741
    Позывной
    UR5ZQV
    Ромм,
    еперь схема выглядит так.
    Красным выделен участок для гистерезиса, опять же по совету одного из форумчан, для надежной работы на низких частотах (предвижу реакцию Александра) ).
    И она не замедлиться . У вас же получился почти НЧ генератор на мосте Вина. Вам "гистерезиса" входа КМОП не хватает? У меня это бывало только при нечистом сигнале (типа умножители частоты с плохой фильтрацией, решалось улучшением фильтрации) либо наличие соизмеримого уровня помех, решается топологически. Вы опишите подробнее источник сигнала, который Вы пытаетесь померять.
    Александр. (Ex: RB5ZDR, UQ2GKQ)

  3. #23
    Аватар для RA4HJW
    Регистрация
    20.02.2006
    Адрес
    г. Самара
    Сообщений
    610
    Записей в дневнике
    31
    Позывной
    RA4HJW
    Цитата Сообщение от UR5ZQV Посмотреть сообщение
    ... по подъему или спаду, не зависимо от скважности.
    триггер на выходе даст скважность 2, соответственно Fmax для Т0 будет в оптимуме.

  4. #24
    Цитата Сообщение от Sergey_gh Посмотреть сообщение
    Я не помню, но скорее что-то типа compare - автосброс по достижению заданного значения. Но ещё раз скажу - так не пробьётесь. Измерительный интервал-то нужно выдержать с точностью до такта.
    Я
    понял что это нужно сделать. В инете мало информации или я не умею искать. Если кто-то и выкладывает свои разработки, то уже в откомпелированном виде. Я только недавно стал с СИ разбираться.
    Сергей, а Вы учитываете что на входе стоит предделитель на 10? И с учетом этого велика ли будет ошибка? Измеряемая частота максимум 60 МГц, после делителя 6 МГц, тактовая 16 МГц.

    Александр:
    - про сигнал 2 кГц я уже упоминал;
    - есть самодельный простой генератор для проверки кварцев (сейчас там кварц на 3.6865 МГц);
    - есть собранный Могиканин, который надо укладывать в диапазоны, из-за которого собственно все это и затевалось.

    то Николай RA4HJW:
    извините, но я пока не понимаю о чем Вы)
    Последний раз редактировалось Ромм; 23.12.2017 в 20:52.
    Никогда такого не было и вот опять...

  5. #25
    Нажмите на изображение для увеличения. 

Название:	част.jpg 
Просмотров:	713 
Размер:	399.9 Кб 
ID:	277586
    Вот так оно выглядит)
    Никогда такого не было и вот опять...

  6. #26
    Аватар для RA4HJW
    Регистрация
    20.02.2006
    Адрес
    г. Самара
    Сообщений
    610
    Записей в дневнике
    31
    Позывной
    RA4HJW
    попробую объяснить.
    см. документацию на восьмерку

    Нажмите на изображение для увеличения. 

Название:	T0_ATMega8.jpg 
Просмотров:	602 
Размер:	195.1 Кб 
ID:	277619

    Внешняя частота должна быть гарантированно меньше тактовой в 2 раза с учетом рабочего цикла 50/50 (т.е. меандр). Поскольку детектор фронта может обнаружить его при этом условии. Для надежности производитель рекомендует подавать входную частоту не более Fclk/2,5.

    Делитель на 5 не даёт меандра на выходе, согласно Вашей схемы, соответственно детектирование фронта на верхней границе по частоте этого делителя на 10 даст неопределенность детектирования фронта. Исправить это можно установив делитель на 2 (D1.1 формируте меандр) на выходе схемы, а не на входе.

  7. #27
    Ромм, Вам Сергей все правильно сказал. Не хочу обсуждать схему использования тмр0 как счетчика при задатчике длины окна в тмр1,
    такое может иметь место, но нужно очень четко представлять подводные камни.


    Рекомендую Вам очень внимательно изучить труды по принципам построения частотомеров присутствующего здесь на форумах Леонида Ивановича Ридико (ЛИ).
    Лучше и понятней, чем написано у него, Вы вряд ли найдете.

    На мой взгляд нестабильные показания связаны не с формирователем входных импульсов, хотя и в нем и был косяк(но тем не менее он считал).
    В этой программе принципиально неверно ВСЁ с точки зрения обработки прерываний, тем более таймерных.
    Ведь в момент обработки события по прерывнию основное тело программы не исполняется, исполняется только текст обрабочика конкретного
    прерывания, чья очередь наступила в порядке приоритетов. (если объявлен сквозняк в обработчиках, то тут может быть вообще атас полный).
    Поэтому главное правило при написании обработчиков прерываний - он должен жрать как можно МЕНЬШЕ времени у процессора.
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    При обработке таймеров (особенно нулевого) обычно люди борются за каждый машинный такт, а здесь такое расточительство - обработка в прерывании,
    считающего внешние события, переменных с использовванием чисел с плавающей точкой!
    Далее, в тмр1 8раз(!) идет вывод инфы на индикатор, а в это время обработчик тмр0 сначала отрублен, но потом устроен сквозняк:
    #asm("cli")
    TCNT1=0;
    TCNT0=0;
    #asm("sei").
    А если посмотреть скомпиленный текст, то после sei компилятор из стека восстанавливает много-много регистров, в том числе и SREG, что сводит к нулю все усилия,
    а устроенный сквозняк может исказить результат.
    Если переходить на "ручное управление" в обработчике прерывания, то тогда ВЕСЬ его текст надо писать на асме, будет больше толку.
    --------------------------------------------------------------------------------------------------------------------------

    Простейший расчет времени, проводимого в обработчике прерывания:
    меряем 4 мгц.
    тмр0 срабатывает 4000000/(256*10)=1562 раза в секунду.
    одно обращение к индикатору, например gotoxy(0,0) занимает порядка 800 тактов процика, что при 16 мгц составляет 1/20000 сек
    а lcd_clear() занимает порядка 24800 тактов процика (1/650 сек).
    Ясно, что за это время тмр0 переполнится много раз даже при измеряемой частоте в несколько мгц и конечный результат будет неверен из-за
    пропусков счета.
    поэтому:
    для тмр0следует сделать например так:
    volatile unsigned int timer_counter=0;
    volatile unsigned int external_timer_count er=0;
    volatile unsigned char timer_delta=0;
    volatile unsigned chsr measure_ready =0;
    .................... .................... .................... .................... ......
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    timer_counter++; //ВСЁ!
    }
    .................... .................... .................... .................... ..........

    interrupt [TIM1_COMPA] void timer1_compa_isr(voi d)
    {
    timer_delta=TCNT0; //самое первое действие, зафиксировать огрызок
    TCCR0=0; //останов счета по тмр0, чтобы не считал дальше, потому что тогда возможно, что к концу работы обработчика тмр1 в счетчике тмр0
    //может что-то насчитаться при большой частоте измеряемого сигнала
    TCNT0=0; //обнуление тснт0
    measure_ready=1; // флаг окончания счета, обрабатывается за пределами прерывания
    external_timer_count er=timer_counter; //переписали во внешнюю для обработчика переменную из тмр0, которая обрабатывается за пределами прерывания
    timer_counter=0;//сброс счетчика циклов переполнения тмр0
    TCCR0=(1<<CS02)+(1<< CS01); //старт тмр0 на новое измерение с обнуленными счетчиками в самый последний момент работы обработчика тмр1
    }
    .................... .................... .................... .................... .................... .................... ..............
    в основном цикле:
    .................... .................... .................... .................... ....
    if(measure_ready)
    {
    measure_ready=0; //сброс флага
    //работа с volatile переменными снаружи прерываний
    //отруб прерываний должен быть минимальным по времени, поэтому тут самое лучшее просто переписать в другую переменную, а не
    перевод во float
    cli();
    //перевод в флоат,
    //если будет валить прерывание, то добавить промежуточную переменные unsigned int aaa,unsigned char aaa1 куда просто
    //переписывать external_timer_count er & timer_delta
    //тогда отруб прерываний будет занимать минимальное время
    A=external_timer_cou nter;
    C=timer_delta;
    sei();

    A=(A+C)/X;
    lcd_clear();
    lcd_gotoxy(0,0);
    sprintf(temp,"%.2f", A);
    lcd_puts(temp);
    lcd_gotoxy(0,1);
    lcd_puts("kHz");//можно выкинуть и готовить один раз
    lcd_gotoxy(7,1);
    sprintf(temp,"%1d",X/100);
    lcd_puts(temp);
    }
    .................... .................... .................... .................... ...............
    Все сказанное точно также касается и обработчика прерывания по окончанию преобразования АЦП.
    В нем надо оставить только запись результата преобразования в промежуточную переменную типа volatile unsigned int,
    а все остальное делать за пределами прерываний.
    И непреложное правило, если работаете хотя бы с одним обработчиком прерываний - проверять загрузку процика в прерываниях подсчетом количества тактов,
    а тут такой тугой замес из двух таймерных прерываний, перекрывающих одно другое, да еще сквозняк внутри одного(ТМР1).

  8. Спасибо от Ромм

  9. #28
    Цитата Сообщение от RA4HJW Посмотреть сообщение
    Делитель на 5 не даёт меандра на выходе, согласно Вашей схемы
    Николай,
    добрый день!
    У меня схема делителя на 10.
    Сначала я не учел, что первоначальная схема из инета разработана под 561ТМ2. У них RS-входы прямые. У 74HC74 RS-входы инверсные и поэтому делитель сразу не заработал, вот я и смотрел осциллографом сигналы на всех входах-выходах. Уже с выхода первого D-триггера почти чистый меандр (с шумами типа дребезг контактов).
    А когда делитель полностью заработал, дальше первого триггера везде чистый меандр 50 на 50, в том числе и на входе Т0 МК.

    Добавлено через 12 минут(ы):

    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    а тут такой тугой замес из двух таймерных прерываний, перекрывающих одно другое, да еще сквозняк внутри одного(ТМР1)
    Добрый
    день, Николай Николаевич!
    Это очень конкретный и ценный для меня ответ/совет! Даже и не знаю как благодарить...
    Не посоветуете литературу с примерно таким же доходчивым изложением?
    Все что мне удавалось читать, касается этих вопросов вскользь или таким языком написано, как будто для профессоров).

    Добавлено через 14 минут(ы):

    Нашел сайт Ридико. Буду читать.

    Дааа...
    Накосячил я с обработкой прерываний...
    Думал просто в конце обработчика флаги сбросить и счетчики обнулить.
    Оказывается не все так просто.
    Последний раз редактировалось Ромм; 24.12.2017 в 13:28.
    Никогда такого не было и вот опять...

  10. #29
    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    TCCR0=(1<<CS02)+(1<< CS01); //старт тмр0 на новое измерение с обнуленными счетчиками в самый последний момент работы обработчика тмр1
    А нельзя записать TCCR0=0x06; ? Это не тоже самое?

    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    TCCR0=(1<<CS02)+(1<< CS01); //старт тмр0 на новое измерение с обнуленными счетчиками в самый последний момент работы обработчика тмр1
    А нельзя записать TCCR0=0x06; ? Это не тоже самое?

    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    volatile unsigned int timer_counter=0;
    volatile unsigned int external_timer_count er=0;
    Николай Николаевич, чем физически эти переменные отличаются? Здесь в переменной external_timer_count er external это ведь не спецификатор??

    Добавлено через 8 минут(ы):

    Цитата Сообщение от Кукин Николай Николаевич Посмотреть сообщение
    A=external_timer_cou nter;
    C=timer_delta;
    sei();

    A=(A+C)/X;
    И вот здесь тогда видимо должно быть либо A=external_timer_cou nter*256;
    либо A=(A*256+C)/X;
    Последний раз редактировалось Ромм; 24.12.2017 в 14:59.
    Никогда такого не было и вот опять...


  11. #30
    Аватар для DL1BA
    Регистрация
    13.01.2006
    Адрес
    Германия
    Сообщений
    1,536
    Позывной
    DL1BA
    Я делал похожий частотомер http://www.cqham.ru/forum/showthread...%ED%E0-Atmega8

    За основу брал этот код:

    Код:
    // Input: Pin D2
     
    volatile boolean first;
    volatile boolean triggered;
    volatile unsigned long overflowCount;
    volatile unsigned long startTime;
    volatile unsigned long finishTime;
     
    // here on rising edge
    void isr () 
    {
      unsigned int counter = TCNT1;  // quickly save it
     
      // wait until we noticed last one
      if (triggered)
        return;
     
      if (first)
        {
        startTime = (overflowCount << 16) + counter;
        first = false;
        return;  
        }
       
      finishTime = (overflowCount << 16) + counter;
      triggered = true;
      detachInterrupt(0);   
    }  // end of isr
     
    // timer overflows (every 65536 counts)
    ISR (TIMER1_OVF_vect) 
    {
      overflowCount++;
    }  // end of TIMER1_OVF_vect
     
     
    void prepareForInterrupts ()
      {
      // get ready for next time
      EIFR = bit (INTF0);  // clear flag for interrupt 0
      first = true;
      triggered = false;  // re-arm for next time
      attachInterrupt(0, isr, RISING);     
      }  // end of prepareForInterrupts
     
     
    void setup () 
      {
      Serial.begin(115200);       
      Serial.println("Frequency Counter");
     
      // reset Timer 1
      TCCR1A = 0;
      TCCR1B = 0;
      // Timer 1 - interrupt on overflow
      TIMSK1 = bit (TOIE1);   // enable Timer1 Interrupt
      // zero it
      TCNT1 = 0;  
      overflowCount = 0;  
      // start Timer 1
      TCCR1B =  bit (CS10);  //  no prescaling
     
      // set up for interrupts
      prepareForInterrupts ();   
     
      } // end of setup
     
    void loop () 
      {
     
      if (!triggered)
        return;
     
      unsigned long elapsedTime = finishTime - startTime;
      float freq = F_CPU / float (elapsedTime);  // each tick is 62.5 ns at 16 MHz
     
      Serial.print ("Took: ");
      Serial.print (elapsedTime);
      Serial.print (" counts. ");
     
      Serial.print ("Frequency: ");
      Serial.print (freq);
      Serial.println (" Hz. ");
     
      // so we can read it  
      delay (500);
     
      prepareForInterrupts ();   
    }   // end of loop
    -------------------------------
    Василий DL1BA ex UK8BA
    -------------------------------

Страница 3 из 6 ПерваяПервая 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Частотомер
    от 4L1FL в разделе Измерения
    Ответов: 30
    Последнее сообщение: 05.02.2017, 17:51
  2. Частотомер
    от Yrec24 в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 97
    Последнее сообщение: 15.02.2011, 15:06
  3. Частотомер
    от Yrec24 в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 5
    Последнее сообщение: 18.05.2010, 21:42
  4. Частотомер
    от UR5WPR в разделе Бытовая техника, мой автомобиль, домашняя автоматизация
    Ответов: 6
    Последнее сообщение: 09.12.2008, 21:59
  5. Частотомер ч3-38
    от rz3abk в разделе Антенны
    Ответов: 9
    Последнее сообщение: 06.03.2007, 20:59

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •