Jump to content

angoli

Members
  • Content Count

    8
  • Joined

  • Last visited

Community Reputation

0 Обычный

About angoli

  • Rank
    Новенький

Электроника

  • Стаж в электронике
    Не связан с электроникой

Recent Profile Visitors

175 profile views
  1. Я не спорю что архитектура процессара играет важную роль. Просто 5 лет назад были не слабые процессоры. И я думаю что сильно они не изменились в производительности (одного ядра). Сейчас больше уделяют вниманию увеличению многопоточности, энергосбережение и уменьшение тепловыделение. Только в этом вроде направлении изменяется архитектура процессоров. Но это лично мое точка зрения. Вот у меня одно ядро ложится от протеуса когда я выставляю большую частоту генерации сигнала. А ведь процессор не слабый i7-47770K. Так что если смотреть со стороны одного ядра(потока), то они не сильно долеко ушли.
  2. Он не то что не тянет он улаживает ядро процессора за считанные секунды. А Вы считаете, что железо в Вашем компе "поумнеет" за 5 лет ? Не пыталсь его апгрейдить ? А причем тут апгрейдить? Частота на ядро 5 лет назад было такое же как и сейчас. Я так понял что не только у меня программа однопоточное. Жаль... жаль...
  3. Вопрос конечно не по теме. Но все таки. А Proteus может работать в многопоточном режиме? А то я пытаюсь в signal generator выставить частоту в 8MHz и программа ложится. Потому что ядро процессора загружается на 100%.
  4. Мысль была подсчитывать не количество пришедших тактов, а подсчитывание количество тактов микроконтроллера в промежутке старта прерывания и до появления входного сигнала. Паузу (1с) делал что бы не нагружать микроконтроллер, иначе ничего показывать не будет. В прервывании T2 я было добавил сброс t2 на 0. Самое удивительное потом после первого подсчета и сброса t2 почуму-то t2 не инкрементировался хотя пауза делалась. Очень странно. Но да ладно. Я в очередной раз переделал проект, теперь он работает до 12кГц, с погрешностью 10Гц. А если дальше гнать то погрешнать будет больше. Жалко что нельзя измерять до пару МГц. Ну да ладно.
  5. Если есть драйвер MAX7219, то могу подсказать как им выводить цифры.
  6. Изменил свой проект кординально. Теоретически у меня должно выводится правильная частота, но в протеусе выводит что захочет. Вот мои рассчеты. Таймер 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
  7. #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МГц и выше, то пишет что микроконтроллер перегружен и что он не будет так работать.
  8. Делаю частотомер в Proteus. Прошивку писал в codevisionavr. Микроконтроллер выбран atmega16. Стоит кварцевый резонатор 16Мгц. Подсчет времени использую таймер T2. Сигнал поступает на прерывание INT0. Когда замеряю частоту до 10 кГц, то все нормально. Но когда частота измерения 15 кГц и выше, то цифры начирают мергать из-за прерывания. А хотелось бы замерять до 6-8МГц. Может знает как изменить прошивку что бы замеряла высокие частоты и не моргали цифры? Kyrsach.rar
×
×
  • Create New...