Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 05.05.2011, 00:45  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Алгоритм частотомера

Доброй ночи уважаемые
Уже второй день немогу составить правильный алгоритм..
А может он и правильный но протеус показывает что работает устройство не правильно...
Задача такая:
Надо определять такие фиксированные частоты.
32000Гц
44100Гц
48000Гц
96000Гц
192000Гц

Хочу написать программу для своей звуковой карты на микросхеме AD1955

Вот код:
Подскажите, что я делаю не так...

Код:
/**************************************************  ***
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 04.05.2011
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
**************************************************  ***/

#include ‹mega8.h›
#include ‹delay.h›
//#include ‹lcd.h›
#include ‹STDIO.h›
 
typedef unsigned char byte;

byte Clock=0;
byte Clock_o=0;
byte tmr=0; 

unsigned long display=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) // здесь будет отключение функции power_down
{
// Place your code here
//Powerdown off
Clock++;
PORTD.4=1;
delay_us(1);
PORTD.4=0;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)  // тут у нас будет сканирующий вход
{
// Place your code here
//Clock++;
//PORTD.2=1;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)   // образцовый таймер
                                                 // сним будем сравнивать поступающий сигнал на int_1 вывод
{                                                // по идее должен переполняться с частотой 200000кгц
// Reinitialize Timer 0 value                    // то есть 8000 000 Гц тактовая делим ее / на 200 000 Гц получем = 40 переводим в 16 рич. = 0x28;
// reset timer и переинициализация
TCNT0=0x28;
// Place your code here
Clock_o++;
} 

// SPI functions
#include ‹spi.h›

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Reset Source checking
/*if (MCUCSR & 1)
   {
   // Power-on Reset
   MCUCSR=0;
   // Place your code here

   }
else if (MCUCSR & 2)
   {
   // External Reset
   MCUCSR=0;
   // Place your code here

   }
else if (MCUCSR & 4)
   {
   // Brown-Out Reset
   MCUCSR=0;
   // Place your code here

   }
else
   {
   // Watchdog Reset
   MCUCSR=0;
   // Place your code here

   }; */

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In 
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T 
PORTB=0x00;
DDRB=0x2C;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
TCCR0=0x01;
TCNT0=0x28;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0xC0;
MCUCR=0x08;
GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 500,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x51;
SPSR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      { 
      if (PIND.2==0){
      PORTD.4=1;
      delay_us(1);
      PORTD.4=0;
      }
       
      // Place your code here
       
      PORTD.4=0;
      tmr++;
      delay_ms(50);
      if (tmr==30){
      
      if (Clock_o==254 && Clock › 30 && Clock ‹ 45){ // 40.64   32000Гц
       display=32000;
       PORTC.0=1;
       PORTC.1=0;
       PORTC.2=0;
       PORTC.3=0;
       PORTC.4=0;
      }      
      if (Clock_o==254 && Clock › 45 && Clock ‹ 59){ // 56.008  44100Гц
       display=44100;
       PORTC.1=1;
       PORTC.0=0;
       PORTC.2=0;
       PORTC.3=0;
       PORTC.4=0;
      } 
      if (Clock_o==254 && Clock › 59 && Clock ‹ 100){ // 60.96   48000Гц
       display=48000;
       PORTC.0=0;
       PORTC.1=0;
       PORTC.2=1;
       PORTC.3=0;
       PORTC.4=0;
      }
      if (Clock_o==254 && Clock › 100 && Clock ‹ 170){// 121.92  96000Гц
       display=96000;
       PORTC.0=0;
       PORTC.1=0;
       PORTC.2=0;
       PORTC.3=1;
       PORTC.4=0;
      }
      if (Clock_o==254 && Clock › 170 && Clock ‹ 255){  // 243.84   192000Гц
       display=192000;
       PORTC.0=0;
       PORTC.1=0;
       PORTC.2=0;
       PORTC.3=0;
       PORTC.4=1;
      }
      if (Clock_o==254 && Clock ‹ 30){ // 40.64   32000Гц
       display=32000;
       PORTC.0=1;
       PORTC.1=1;
       PORTC.2=1;
       PORTC.3=1;
       PORTC.4=1;
      } 
       
      tmr=0;         
      }
       if (Clock › 254){ // Защита от переполнения
       Clock_o=0;
       Clock=0;
      } 
      if (Clock_o›254){  // защита от переполнения
      Clock_o=0;
      } 
      };
}
На даный момент алгоритм такой:
Образцовый таймер переполняется 200000 раз в секунду
и инкриментируется переменная
по ИНТ0 сканируется сигнал данных
по прерыванию инкриментируется вторая переменная

когда в цикле таймер достигает 30 это примерно 1.5сек
происходит собственно измерение и сравнение этих двух переменных
И исходя из этих данных определяется частота...
Но в симмуляторе не работает,
работает только ошибка данных, это когда сигнал на входе отсутствует или ниже 32000Гц
Проверяю пока на светодиодах по порту "С"
Миниатюры:
Нажмите на изображение для увеличения
Название: протеус частотомер.png
Просмотров: 121
Размер:	129.6 Кб
ID:	21268  
Реклама:

Последний раз редактировалось artyomugr; 05.05.2011 в 01:02.
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (27.06.2019)
Непрочитано 05.05.2011, 09:42  
AlekseyN
Временная регистрация
 
Регистрация: 20.12.2008
Сообщений: 58
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
AlekseyN на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Сообщение от artyomugr Посмотреть сообщение
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) // тут у нас будет сканирующий вход { // Place your code here //Clock++; //PORTD.2=1; }
Чет я не понял.... Вы проверяете прерывание 1 а измеряемый сигнал, если смотреть на вашу схему присобачен к PD2/INT0 Да еще после этого вы на эту же ногу подаете выход 1... БРЕД!!!!

Затем очередной бред - тактовая частота 8 мегагерц, и таймер настраиваете на 8 мегагерц, а когда проц будет исполнять остальной код?

Прежде чем писать прогу сначала надо на листочке бумаге расписать все ноги, что из них будет входом или выходом, и за что эта нога будет отвечать. Затем в начале проги желательно делать определения (#define InFreq PIND.2) и уже в проге оперировать определениями чтобы не путаться.


Дальше очередной бред:
Сообщение от artyomugr Посмотреть сообщение
if (Clock_o==254 && Clock › 59 && Clock ‹ 100){ // 60.96 48000Гц display=48000; PORTC.0=0; PORTC.1=0; PORTC.2=1; PORTC.3=0; PORTC.4=0; }
начнем с того, что условие с несколькими значениями так не пишется
if (Clock_o==254 & Clock › 59 & Clock ‹ 100){ - так еще сработает

Присвоение порту Ц какого-то значения можно сделать за один такт МК, если боитесь, что в "ненужные" ноги запишутся "0" - наложите маску:
PORTC=(0b00011111 & 4);
А так получается вы на 8 мегагерцах хотите измерить время какого-то сигнала, а временем выполнения кода пренебрегаете.

Для начала почитайте ускоренный курс по Си для AVR...

Последний раз редактировалось AlekseyN; 05.05.2011 в 09:50.
AlekseyN вне форума  
Сказали "Спасибо" AlekseyN
warel (27.06.2019)
Непрочитано 05.05.2011, 10:03  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Алгоритм частотомера

да, ошибка в самой идеологии программы. Использовать счет по прерыванию на внешней ножке можно лишь для очень вялотекущих процессов - и то, даже в этом случае - это очень опасное решение - вдруг процесс перестанет быть вялым ? Вход - выход в прерывание занимает время- сохранение контекста, обработка прерывания - если прерывание не успеет обработаться за время, пока придет следующий импульс, новое прерывание становится в очередь, съедается стек - подбираемся к границе - и у нас уже не девайс, а сферический конь в вакууме - что-то вроде делает, но что...
Я уже не говорю о том, что это решение сильно грузит проц.
Короче, используйте таймер со счетным входом и туда подавайте Вашу частоту, другим таймером стробируйте на разрешение - запрет счета.
__________________
warez
urry вне форума  
Сказали "Спасибо" urry
warel (27.06.2019)
Непрочитано 05.05.2011, 10:13  
AlekseyN
Временная регистрация
 
Регистрация: 20.12.2008
Сообщений: 58
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
AlekseyN на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Сообщение от urry Посмотреть сообщение
да, ошибка в самой идеологии программы.
Вы правы, несомненно! При тактовой частоте в 8 МГц измерять частоты в несколько десятков килогерц можно и таким способом. Проблема в схеме - это раз, Второе - проблема в коде сравнения.
AlekseyN вне форума  
Сказали "Спасибо" AlekseyN
warel (27.06.2019)
Непрочитано 05.05.2011, 13:00  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Здравствуйте.
Нет, я сначала подключал правильно в шпротеусе
А потом начал переподключать для отладки..
И по этому схема сейчас немного иначе.
Как мне лучше сделать?
надо сканировать сигнал максимум под 200килогерц
и помимо этого будет еще дисплей с меню и SPI интерфейс ..
По идее , как я просчитал должно было работать, проверял на выводах МК PORTC
... но в реале работает только ошибка, когда сигнала нету...
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (27.06.2019)
Непрочитано 05.05.2011, 13:02  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Сообщение от AlekseyN Посмотреть сообщение
еще после этого вы на эту же ногу подаете выход 1... БРЕД!!!!
Он закомментирован и соответственно не сработает )
То я пробовал для отладки и проверки срабатывания прерывания..
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (27.06.2019)
Непрочитано 05.05.2011, 13:06  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Цитата:
if (Clock_o==254 & Clock › 59 & Clock ‹ 100){ - так еще сработает
Спасибо большое )
Сегодня попробую...
но советуют сделать иначе, а как - не знаю
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (27.06.2019)
Непрочитано 05.05.2011, 13:15  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Цитата:
Образцовый таймер переполняется 200000 раз в секунду
а что, теорему котельникова кто-то отменил??? Дискретизация по времени должна быть не меньше 2*Fmax. Иначе будете терять импульсы или получите 8кГц вместо 192.
Стандартное решение - таймер формирует временной интервал, а основная прога подсчитывает число импульсов за требуемый промежуток. Т.к. диапазон частот не большой можно взять интервал измерения 0,5-1мС и вписаться даже в 1-байтовый счетчик. При 500мС времени измерения 32кГц - 16 импульсов 192кГц - 96 импульсов.
__________________
misterdi<@>i.ua

Последний раз редактировалось MisterDi; 05.05.2011 в 13:21.
MisterDi вне форума  
Сказали "Спасибо" MisterDi
warel (27.06.2019)
Непрочитано 05.05.2011, 13:27  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Алгоритм частотомера

То есть Вы имеете ввиду что надо настроить на 400000Гц ?
А какую частоту максимум может зафиксировать внешнее прерывание INT0 ?
Можно же не постоянно сканировать вход, а например раз в 1.5сек.
с помощью переменной ...
У кого какие мысли насчет этого?
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (27.06.2019)
Непрочитано 05.05.2011, 13:41  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Алгоритм частотомера

Я же сказал Вам, состояние входа сканируйте в основном цикле программы. Примерно так:
1- Счетчик импульсов = 0
2- "Взводим" таймер на 0,5-1 мС
3- Если состояние тактового входа изменилось - увеличиваем счетчик
4- повторяем п3 до возникновения переполнения таймера
5 - анализируем значение счетчика:

0 - нет сигнала на входе
14 - 18 - 32кГц
20 - 22 - 44кГц
22 - 24 - 48кГц /// тут возможно прийдется подбирать
и т.д.
__________________
misterdi<@>i.ua
MisterDi вне форума  
Сказали "Спасибо" MisterDi
warel (27.06.2019)
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код Грея, алгоритм ассемблер? picavr Микроконтроллеры, АЦП, память и т.д 8 27.03.2009 04:39
Нужен алгоритм СRC с результатом 7бит AndryG Микроконтроллеры, АЦП, память и т.д 4 05.06.2007 18:51
Алгоритм билдер для ПИК контроллеров. Gladkih Микроконтроллеры, АЦП, память и т.д 9 24.02.2007 18:41
Определение сигнала отбоя АТС - алгоритм нужен Anatols Цифровые сигнальные процессоры 2 04.11.2005 12:17
[Решено] ОЧЕНЬ нужна блок-схема и алгоритм работы м/пр стир. машины Руслан Поиск схем. Делимся схемами 1 10.03.2005 15:02


Часовой пояс GMT +4, время: 11:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot