Jump to content

Частотомер На Atmega16


angoli
 Share

Recommended Posts

Делаю частотомер в Proteus. Прошивку писал в codevisionavr. Микроконтроллер выбран atmega16. Стоит кварцевый резонатор 16Мгц. Подсчет времени использую таймер T2. Сигнал поступает на прерывание INT0. Когда замеряю частоту до 10 кГц, то все нормально. Но когда частота измерения 15 кГц и выше, то цифры начирают мергать из-за прерывания. А хотелось бы замерять до 6-8МГц. Может знает как изменить прошивку что бы замеряла высокие частоты и не моргали цифры?

Kyrsach.rar

Edited by angoli
Link to comment
Share on other sites

Химические элементы FANSO EVE Energy для питания беспроводных датчиков
Литиевые батарейки различного химического состава и разных типоразмеров широко используются в беспроводных датчиках систем сбора данных, промышленной автоматики и систем умного дома. И в любом из многочисленных вариантов использования беспроводных датчиков основными требованиями к их работе являются автономность и бесперебойность функционирования.
Главным условием, гарантирующим такую работу, является правильный выбор элемента питания для датчика.

Подробнее >>

#include <mega16.h>
#include <delay.h>

unsigned long int i;
unsigned long int frequency;
unsigned long int temp_h;
unsigned long int temp_l;
unsigned long int x, y, z;


int num[10]={
        0b11000000,    //0
        0b11111001,    //1
        0b10100100,    //2
        0b10110000,    //3              
        0b10011001,    //4
        0b10010010,    //5
        0b10000010,    //6
        0b11111000,    //7
        0b10000000,    //8
        0b10010000};   //9
int str[8]={0};


void main( void )
{
 int j;
 DDRA = 0xff;
 PORTA = 0x00;
 DDRC = 0xff;
 PORTC = 0xff;

 /*DDRD &= ~(1<<PIN_INT0);
 PORTD |= (1<<PIN_INT0); 
 GICR |= (1<<INT0); 
 MCUCR |= (1<<ISC01)|(1<<ISC00);*/

 TCCR1B |= (1<<ICES1)|(1<<CS10);
 SREG |= (1<<7);
 TIMSK |= (1<<TICIE1);


 /*TCCR2 |=(1<<CS20)|(1<<CS21)|(1<<CS22);
 SREG |=(1<<7);
 TIMSK |= (1<<TOIE2);
 TCNT2 =0;*/

 #asm("sei");

 while(1)
 {        
    str[0]=frequency/10000000;
        i=frequency%10000000;

        str[1]=i/1000000;
        i=i%1000000;

        str[2]=i/100000;
        i=i%100000;

        str[3]=i/10000;
        i=i%10000;

        str[4]=i/1000;
        i=i%1000;

        str[5]=i/100;
        i=i%100;

        str[6]=i/10;

        str[7]=i%10;

    for(j=0; j<8; j++)
     {
        PORTA = num[str[j]];

        if(j==0)
           PORTC = 0b10000000;
        if(j==1)
           PORTC = 0b01000000;
        if(j==2)
           PORTC = 0b00100000;
        if(j==3)
           PORTC = 0b00010000;
        if(j==4)
           PORTC = 0b00001000;
        if(j==5)
           PORTC = 0b00000100;
        if(j==6)
           PORTC = 0b00000010;
        if(j==7)
           PORTC = 0b00000001;
        delay_us(1000);
        PORTA=0xff;
     }

 }
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{

temp_h = ICR1H;
temp_l = ICR1L;
if(x == 0)
{
   x = (temp_h*256+temp_l);
}
else
{
   y = (temp_h*256+temp_l);
   z = y - x;
   frequency = (unsigned long)16000000/z; 

}
}

Нашел в интернете такой код на таймер Т1 и вставил себе в проект, но он не работает. Может вместо ICR1L должно быть другое что-то? Или вообще все не правильно?

Кстати заметил что когда ставлю измеряемую частоту 1МГц и выше, то пишет что микроконтроллер перегружен и что он не будет так работать.

Edited by angoli
Link to comment
Share on other sites

Сравнительное тестирование алкалиновых батареек POWER FLASH 

В потребительском и промышленном сегментах российского рынка химических источников тока имеется множество щелочных (алкалиновых) батареек различных производителей и ценовых категорий. Но велика ли разница в их качестве?

Провели небольшой сравнительный тест, чтобы понять, могут ли источники тока POWER FLASH эффективно заменить продукцию таких известных производителей, как Duracell и GP, вычислить, чему равна стоимость одного часа работы батареек, а также сравнить полученные данные со значениями, указанными в технической документации.  Подробнее>>

Изменил свой проект кординально. Теоретически у меня должно выводится правильная частота, но в протеусе выводит что захочет. Вот мои рассчеты. Таймер T2 работает на частоте микроконтроллера (16 МГц). Значит t2 будет считатся 62500 раз в секунду. Когда на вход INT0 поступает сигнал, то происходит прерывание где сохраняются состояние TCNT2 и t2. Затем останавливается прерывание INT0 на секунду. Когда пройдет 1с запустится прерывание INT0. В чем мои просчеты, кто знает?

#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2
#define PIN_INT0 PIND2
unsigned long int t2, saveregt2, savet2;
unsigned long int i;
unsigned long int frequency;
char num[10]={
	 0x00, //0
	 0x01, //1
	 0x02, //2
	 0x03, //3			
	 0x04, //4
	 0x05, //5
	 0x06, //6
	 0x07, //7
	 0x08, //8
	 0x09}; //9
int str[8]={0};
void SPI_Init(void) //инициализация выводов для порта вывода на экран
{
SPI_DDRX |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
SPI_PORTX |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);
SPI_PORTX |= (1<<SPI_SS);
SPI_PORTX &= ~(1<<SPI_SCK);
SPI_PORTX &= ~(1<<SPI_MOSI);
}
void SPI_WriteData(char adres, char data) //вывод на экран
{
char i=16;
int tmp=adres;
tmp = (tmp<<8)|data;
SPI_PORTX &= ~(1<<SPI_SS);
{while(i>0)
 {
 SPI_PORTX &= ~(1<<SPI_SCK);
 SPI_PORTX.SPI_MOSI=((tmp & (1<<(i-1))) != 0 );
 SPI_PORTX |= (1<<SPI_SCK);
 i--;
 }

}	
SPI_PORTX &= ~(1<<SPI_SCK);
SPI_PORTX |= (1<<SPI_SS);
SPI_PORTX &= ~(1<<SPI_MOSI);
}
char count1=8;
void main(void)
{
int j;
DDRD &= ~(1<<PIN_INT0);			 //инициализация порта на прием сигнала
PORTD |= (1<<PIN_INT0);
GICR |= (1<<INT0);
MCUCR |= (1<<ISC01)|(0<<ISC00);

TCCR2 |= (1<<CS20);					 //инициализация счетчика Т2
TIMSK |= (1<<TOIE2);

SPI_Init();
SPI_WriteData(0x09,0xFF);				 //запускаем драйвер MAX7219
SPI_WriteData(0x0A,0x0F);
SPI_WriteData(0x0B,0x07);
SPI_WriteData(0x0C,0x01);
SPI_WriteData(0x0F,0x00);
{while(count1>0)
 {
 SPI_WriteData(count1,0x00);
 count1--;
 }
}
while (1)
 {
 #asm("sei");
 frequency = 16000000/(savet2*256 + saveregt2);	 //получаем частоту
 str[0]=frequency/10000000;		 //получаем числа из частоты по одельности.
	 i=frequency%10000000;
	 str[1]=i/1000000;
	 i=i%1000000;
	 str[2]=i/100000;
	 i=i%100000;

	 str[3]=i/10000;
	 i=i%10000;

	 str[4]=i/1000;
	 i=i%1000;

	 str[5]=i/100;
	 i=i%100;

	 str[6]=i/10;

	 str[7]=i%10;

 for(j=0; j<8; j++)		 //вывод на экран
 {
	 if(j==0)
	 SPI_WriteData(0x01,num[str[j]]);
	 if(j==1)
	 SPI_WriteData(0x02,num[str[j]]);
	 if(j==2)
	 SPI_WriteData(0x03,num[str[j]]);
	 if(j==3)
	 SPI_WriteData(0x04,num[str[j]]);
	 if(j==4)
	 SPI_WriteData(0x05,num[str[j]]);
	 if(j==5)
	 SPI_WriteData(0x06,num[str[j]]);
	 if(j==6)
	 SPI_WriteData(0x07,num[str[j]]);
	 if(j==7)
	 SPI_WriteData(0x08,num[str[j]]);
	 delay_us(1000);
 }
 TCNT2 = 0;
 t2 = 0;
 }

}
interrupt [EXT_INT0] void ExtInt0(void)
{
saveregt2 = TCNT2;					 //сохраняем состояние счетчика
savet2 = t2;
GICR |= (0<<INT0);					 //останавливаем прерывание на 1с.
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
if(t2 == 62500)						 //прошло 1с
{
 GICR |= (1<<INT0);					 //запускаем прерывание
}
t2++;								 //счетчик переполнений
}

111.rar

Edited by angoli
Link to comment
Share on other sites

Новые источники питания на DIN-рейку класса High End от MORNSUN
Компания MORNSUN разработала новую линейку ИП с креплением на DIN-рейку класса High End. Линейка состоит из двух семейств однофазных ИП, различающихся функционалом (LIMF и LIHF) и одного семейства на трехфазное напряжение (LITF). У всех этих ИП печатная плата с компонентами имеет лаковое покрытие. Продукция работоспособна в температурном диапазоне -40...85ºС (для однофазных) и -30...70ºС (для трехфазных). Кроме того, однофазные ИП соответствуют требованиям ATEX и могут использоваться во взрывоопасных зонах. Семейство LIMF имеет стандартный функционал (ККМ, сухой контакт реле, 150% перегрузочная способность), а семейство LIHF – максимальный функционал с доп. функциями селективной защиты (SFB) и возможностью дистанционного управления (может заменить серию QUINT от Phoenix Contact).

Подробнее >>

Причём тут INT0 (внешнее прерывание), если Вам нужно считать количество импульсов входной частоты за промежуток времени ? И для чего какие-то остановы на 1 секунду ? Ещё бы у Вас не выводилась каша. Что-то останавливаете, запускаете когда захотите, ....

У Вас в голове всё перемешалось.

Для низкой частоты нужно измерять период (время между двумя фронтами), для более высокой - кол-во импульсов за промежуток времени.

Link to comment
Share on other sites

Мысль была подсчитывать не количество пришедших тактов, а подсчитывание количество тактов микроконтроллера в промежутке старта прерывания и до появления входного сигнала. Паузу (1с) делал что бы не нагружать микроконтроллер, иначе ничего показывать не будет. В прервывании T2 я было добавил сброс t2 на 0. Самое удивительное потом после первого подсчета и сброса t2 почуму-то t2 не инкрементировался хотя пауза делалась. Очень странно.

Но да ладно. Я в очередной раз переделал проект, теперь он работает до 12кГц, с погрешностью 10Гц. А если дальше гнать то погрешнать будет больше. Жалко что нельзя измерять до пару МГц. Ну да ладно.

Link to comment
Share on other sites

Мысль была подсчитывать не количество пришедших тактов, а подсчитывание количество тактов микроконтроллера в промежутке старта прерывания и до появления входного сигнала. Паузу (1с) делал что бы не нагружать микроконтроллер, иначе ничего показывать не будет. В прервывании T2 я было добавил сброс t2 на 0. Самое удивительное потом после первого подсчета и сброса t2 почуму-то t2 не инкрементировался хотя пауза делалась. Очень странно.

Но да ладно. Я в очередной раз переделал проект, теперь он работает до 12кГц, с погрешностью 10Гц. А если дальше гнать то погрешнать будет больше. Жалко что нельзя измерять до пару МГц. Ну да ладно.

Да ладно, нельзя. Для начала сделай простой вариант. 8-ми битным таймером отмеряешь секунду с помощью предделителя и подсчёта кол-ва переполнений в прерывании , 16-ти битный таймер настраиваешь на счёт по внешнему входу и прерывание по переполнению, считаешь в обработчике прерываний их количество, предделитель у него ставишь 1. Как только у тебя наберётся количество прерываний 8-битного таймера равные 1 секунде, запрещаешь все прерывания и выключаешь 16 битный таймер, далее количество прерываний этого таймера будет старшим байтом, старший регистр таймера, средним, младший регистр таймера, младшим затем объединяешь эти байты так, чтобы они расположились в той последовательности как написал выше и получаешь число измеренной частоты в герцах, дальше для отображения можешь преобразовывать его в килогерцы, мегагерцы. Разрешающая способность такого частотомера будет 1 герц как минимум и частоту ты мерять сможешь как минимум до 16 мегагерц. Как реализуешь этот вариан, делай для низкой частоты блок где будешь мерять период тогда можно будет переключаться между ними.

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

Мысль была подсчитывание количество тактов микроконтроллера в промежутке старта прерывания и до появления входного сигнала
Мысль верная. Это - измерение периода.

Но логично же, чем период будет меньше (частота выше), тем будет увеличиваться погрешность измерения.

Разрешающая способность такого частотомера будет 1 герц как минимум и частоту ты мерять сможешь как минимум до 16 мегагерц.
Я с АВРами не совсем дружу, по этому буду по наслышке. Где то на форуме слышал, что у них таймеры синхронные, т.е. каждый его инкремент (имеется в виду с внешним тактированием) происходит по тактовой частоте МК, независимо от внешнего сигнала.

Если это так, то разрешающая способность будет уменьшаться, при приближении входной частоты к частоте МК. Например, частоту 10.5 Мгц уже не померишь, т.к. период её не кратен 1/16 us.

Но, чтобы меня тут не закидывали тухлыми помидорами, скажу сразу - эта инфа недостоверная :) Возможно у АВР таймеры асинхронные.

Link to comment
Share on other sites

Я с АВРами не совсем дружу, по этому буду по наслышке.
Там есть асинхронный таймер (в основном для реализации RTC), к выводам OSC1/OSC2, не путать c XTAL1, XTAL2, можно подключить часовой кварц.

И есть синхронные таймеры с внешним тактированием. Согласно документации, рекомендуется, чтобы частота этого внешнего сигнала не превышала тактовой частоты, деленной на 2,5.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

Там есть асинхронный таймер .......

Ну значит реализуем точный секундный интервал и считаем таймером импульсы на тактовом входе. Сколько насчитали - такая и частота в герцах.
Link to comment
Share on other sites

Вопрос конечно не по теме. Но все таки. А Proteus может работать в многопоточном режиме? А то я пытаюсь в signal generator выставить частоту в 8MHz и программа ложится. Потому что ядро процессора загружается на 100%.

Link to comment
Share on other sites

Так ложится (вылетает) или всего лишь не тянет в реальном времени (тормозит)?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

Вопрос конечно не по теме. Но все таки. А Proteus может работать в многопоточном режиме? А то я пытаюсь в signal generator выставить частоту в 8MHz и программа ложится. Потому что ядро процессора загружается на 100%.

Тоже пытался такое проделать в протеусе, но также, загрузка процессора на 100%, причём так было 5 лет назад и так же сейчас.

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

причём так было 5 лет назад и так же сейчас.
А Вы считаете, что железо в Вашем компе "поумнеет" за 5 лет ? :) Не пыталсь его апгрейдить ? :)
Link to comment
Share on other sites

Так ложится (вылетает) или всего лишь не тянет в реальном времени (тормозит)?

Он не то что не тянет он улаживает ядро процессора за считанные секунды.

причём так было 5 лет назад и так же сейчас.
А Вы считаете, что железо в Вашем компе "поумнеет" за 5 лет ? :) Не пыталсь его апгрейдить ? :)

А причем тут апгрейдить? Частота на ядро 5 лет назад было такое же как и сейчас.

Я так понял что не только у меня программа однопоточное. Жаль... жаль...

Link to comment
Share on other sites

А причем тут апгрейдить? Частота на ядро 5 лет назад было такое же как и сейчас.

А при том. Почитайте, чем отличаются старые процы от современных, и теже Атлоны от Интелов. Частота ядра это не совсем показатель производительности.

Или Вы считаете, что какой-нибудь старый одноядерный пенёк, с частотой, например, в 2.5-3.0 Ггц будет работать так же, как и современный (например i-5 или i-7) с той же частотой на одном ядре ? :)

Или, если для Вас частота ядра - показатель производительности, то может посчитаете, что Атлон и Интел с одинаковой частотой ядра и одинаковым количеством ядер тоже будут работать одинаково ? :)

Link to comment
Share on other sites

Я не спорю что архитектура процессара играет важную роль. Просто 5 лет назад были не слабые процессоры. И я думаю что сильно они не изменились в производительности (одного ядра). Сейчас больше уделяют вниманию увеличению многопоточности, энергосбережение и уменьшение тепловыделение. Только в этом вроде направлении изменяется архитектура процессоров. Но это лично мое точка зрения.

Вот у меня одно ядро ложится от протеуса когда я выставляю большую частоту генерации сигнала. А ведь процессор не слабый i7-47770K. Так что если смотреть со стороны одного ядра(потока), то они не сильно долеко ушли.

Edited by angoli
Link to comment
Share on other sites

причём так было 5 лет назад и так же сейчас.
А Вы считаете, что железо в Вашем компе "поумнеет" за 5 лет ? :) Не пыталсь его апгрейдить ? :)

Так и имелось в виду, что это с апгрейдом, что 5-ти летней давности железо ложилось, что современное, ложится также даже не пикнув. i-5 3570К 3.5 Ггц и 8 гиг оперативки.

Edited by a_sergeevich

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...