Перейти к содержанию
    

Здравствуйте.

 

Подскажите пожалуйста, как создать детектор частоты на микроконтроллере Similcon Laboratories С8051F020. Собственно интересуют два момета:

1) Допускается ли завести на ногу МК частоту 56 МГц.

2) Как ее "поймать". Сначала думал можно переодически опрашивать порт на наличие "0" или "1", но частота кварцевого резонатора 22,1184MHz, не кратна 56МГц, выходит можно получить асинхронизм. Подскажите с чего начать.

 

Заранее благодарю за ответы.

Изменено пользователем Aleksandr_KPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Допускается ли завести на ногу МК частоту 56 МГц.

2) Как ее "поймать". Подскажите с чего начать.

 

Заранее благодарю за ответы.

 

1. Да. Просто зачем ? МК все равно с ней не справится.

2. А зачем ? Вам нужен иникатор типа "Есть сигнал/нет сигнала" ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) А с какой частотой он справится? Частота у меня будет поступать от ПЛИС, я ее там могу поделить, до нужного значения.

2) Схема уже создана, моя задача запрограммировать.

Изменено пользователем Aleksandr_KPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) А с какой частотой он справится? Частота у меня будет поступать от ПЛИС, я ее там могу поделить, до нужного значения.

хотя бы в 2 раза поделить, лучше в 4

2) Схема уже создана, моя задача запрограммировать.

если заведено не на вход таймера - то можете выкинуть схему... или реализовывать детектор на ПЛИС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота у меня будет поступать от ПЛИС, я ее там могу поделить, до нужного значения.
Ежели на выходе ПЛИС Вы можите формировать сигнал, который Вам необходим, то и формируйте: есть/нет частота...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите. Вам что надо : определить наличие переменного напряжения на ноге процессора (все равно какой частоты), измерить частоту, определить какая частота из скажем нескольких частот на ноге. Задачи решаются по-разному.

 

Если исходить из частоты кварца процессора 11059200 , то лучше всего чтобы на вход попадал сигнал с длительностью полупериода не менее 50-100 микросекунд, т е 5 килогерц и меньше. Это если мы программно будем щупать . Если использовать встроенный таймер/счетчик или массив программируемых счетчиков, то что-то типа 5 мегагерц максимум (там требование на ножки порта , что для четкого опознания уровня надо не менее двух клоков системной частоты держать один уровень- написал и полез искать, где это в мануале и не нашел, может это в старых процах было, но все равно лучше придерживаться этого значения).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотя бы в 2 раза поделить, лучше в 4

Ну это без проблем.

 

если заведено не на вход таймера - то можете выкинуть схему...

 

Вроде бы как заведено на ногу P1.0.

 

Ежели на выходе ПЛИС Вы можите формировать сигнал, который Вам необходим, то и формируйте: есть/нет частота...

 

Да наверное Вы правы, лучше построить детектор на ПЛИС. Да, а если нет частоты на ПЛИС, но есть питание, ноги ПЛИС подтянуты к "0"?

C8051.bmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, а если нет частоты на ПЛИС, но есть питание, ноги ПЛИС подтянуты к "0"?

Вы хотите проверять, есть ли тактовая на ПЛИС? тогда все-таки первый вариант - делитель на ПЛИС на n, а на контроллере периодически проверяете на сколько изменился счетчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрите. Вам что надо : определить наличие переменного напряжения на ноге процессора (все равно какой частоты), измерить частоту, определить какая частота из скажем нескольких частот на ноге. Задачи решаются по-разному.

 

Если исходить из частоты кварца процессора 11059200 , то лучше всего чтобы на вход попадал сигнал с длительностью полупериода не менее 50-100 микросекунд, т е 5 килогерц и меньше. Это если мы программно будем щупать . Если использовать встроенный таймер/счетчик или массив программируемых счетчиков, то что-то типа 5 мегагерц максимум (там требование на ножки порта , что для четкого опознания уровня надо не менее двух клоков системной частоты держать один уровень- написал и полез искать, где это в мануале и не нашел, может это в старых процах было, но все равно лучше придерживаться этого значения).

 

 

Не замети это сообщение.

 

В принципе планирую создать счетчик который будет отсчитывать такты на ноге МК (P1.0). Дальше через какоето время проверять состояние счетчика, если он в нуле, то выдавать команду на динамик, если нет то збрасывать счетчик и запускать заново. На ногу ПЛИС планирую подвести частоту около 1 МГц, исходя из ваших слов должно подойти.

В МК пока я не силен, не могу разобрался как заставить счетчик считать внешние импульсы. Может кто что посоветует, с какой стороны подойти. У меня седесь есть CrossBar register с помощью которого я доджен выбрать как будет работать мой порт Р1.0.

post-52032-1303475315_thumb.jpg

post-52032-1303475361_thumb.jpg

Изменено пользователем Aleksandr_KPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот это загрузите и он вам будет писать чего в регистры заносить и как с кросбаром бороться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот это загрузите и он вам будет писать чего в регистры заносить и как с кросбаром бороться

 

У меня такое есть, правда я пользуюсь Keil uVision. Мне не понятно достаточно ли настроек CrossBar и что конкретно я должен настроить, что бы таймер/счетчик начал считать внешние такты, какой алгоритм данной настройки (словесно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, кроссбар это просто заморочка для разработчиков :) . А вот чтобы считалось надо сделать несколько последовательных вещей.

Проинициировать делители частоты и генераторы системной частоты.

Проинициировать и настроить таймер.

Настроить ноги процессора.

Собственно написать свой код.

 

Лучше всего разобраться в этом примере:

.....\MCU\Examples\C8051F02x\Timers -> F02x_Timer2_16bitCaptureTimer.c

ну и вообще поройтесь в этой папке

 

Еще надо посмотреть в Oscillators файл F02x_Oscillator_Cristal.c Там определитесь с каким генератором вам надо работать - внешним кварцем или внутренним.

 

 

А добавлю: таймер , скажем 0 переводится в режим 1 - 16 битный счетчик. Из регистра TMOD настраиваем вход счетчика на вывод T0. Задав T0=1 и Gate=0 включаем подачу импульсов на вход счетчика -таймера.

 

Дальше вам надо будет настроить какой-нибудь таймер, скажем 1 в режим счета от системной частоты SYSCLOCK. Его тоже в 1 режим поставить и разрешить прерывание по его переполнению. Прикинуть интервал времени с которым он должен переполнятся такой, чтобы прерывание происходило скажем раз в 1 миллисекунду. Каждый раз в этом прерывании надо будет грузить в этот таймер новое его значение, чтобы через миллисекунду он переполнился.

 

Каждый раз когда будет появлятся прерывание таймера 1 надо будет смотреть чего там насчиталось таймером 0. Если существенно меньше , чем должно быть - частота на входе мала. Потом стираем значение счетчика таймера 0 и ждем следующей миллисекунды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за алгоритм.

 

Начал его выполнение с настройки кросбара, долго изучая datasheet, остался не совсем понятным следующий момент. При настройке кросбара возможно ли скажем не присваивать функциональность порту P0 и сразу например указать порту Р1 что его ногу Р1.0 будет заведен внешний тактовый сигнал Т2 согластно матрице кросбара. Согластно тому же datasheet такая возможность есть, выполнил пример из него, а результаты моего моделирования оказались расхожими с теми что в datashee.

 

In this example (Figure 17.6), we configure the Crossbar to allocate Port pins for UART0, the SMBus, UART1,

/INT0, and /INT1 (8 pins total). Additionally, we configure the External Memory Interface to operate in Multiplexed

mode and to appear on the Low ports. Further, we configure P1.2, P1.3, and P1.4 for Analog Input mode so that the

voltages at these pins can be measured by ADC1. The configuration steps are as follows:

1. XBR0, XBR1, and XBR2 are set such that UART0EN = 1, SMB0EN = 1, INT0E = 1, INT1E

= 1, and EMIFLE = 1. Thus: XBR0 = 0x05, XBR1 = 0x14, and XBR2 = 0x02.

2. We configure the External Memory Interface to use Multiplexed mode and to appear on the

Low ports. PRTSEL = 0, EMD2 = 0.

3. We configure the desired Port 1 pins to Analog Input mode by setting P1MDIN to 0xE3 (P1.4,

P1.3, and P1.2 are Analog Inputs, so their associated P1MDIN bits are set to logic 0).

4. We enable the Crossbar by setting XBARE = 1: XBR2 = 0x46.

- UART0 has the highest priority, so P0.0 is assigned to TX0, and P0.1 is assigned to RX0.

- The SMBus is next in priority order, so P0.2 is assigned to SDA, and P0.3 is assigned to SCL.

- UART1 is next in priority order, so P0.4 is assigned to TX1. Because the External Memory Inter-

face is selected on the lower Ports, EMIFLE = 1, which causes the Crossbar to skip P0.6 (/RD) and

P0.7 (/WR). Because the External Memory Interface is configured in Multiplexed mode, the Cross-

bar will also skip P0.5 (ALE). RX1 is assigned to the next non-skipped pin, which in this case is

P1.0.

- /INT0 is next in priority order, so it is assigned to P1.1.

- P1MDIN is set to 0xE3, which configures P1.2, P1.3, and P1.4 as Analog Inputs, causing the

Crossbar to skip these pins.

- /INT1 is next in priority order, so it is assigned to the next non-skipped pin, which is P1.5.

- The External Memory Interface will drive Ports 2 and 3 (denoted by red dots in Figure 17.6) during

the execution of an off-chip MOVX instruction.

5. We set the UART0 TX pin (TX0, P0.0), UART1 TX pin (TX1, P0.4), ALE, /RD, /WR

(P0.[7:3]) outputs to Push-Pull by setting P0MDOUT = 0xF1.

6. We configure the output modes of the EMIF Ports (P2, P3) to Push-Pull by setting P2MDOUT

= 0xFF and P3MDOUT = 0xFF.

7. We explicitly disable the output drivers on the 3 Analog Input pins by setting P1MDOUT =

0x00 (configure outputs to Open-Drain) and P1 = 0xFF (a logic 1 selects the high-impedance

state).

 

Я настроил кросбар так же

    
mov   XBR0, #05h
mov   XBR1, #14h                  
mov   XBR2, #46h

 

У меня выходит RX1 присвоен Р0.5, а должен Р1.0. В чем я ошибаюсь?

________.bmp

17.6.bmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) А с какой частотой он справится?

Учите теорему Котельникова/Найквиста.

 

Частота у меня будет поступать от ПЛИС, я ее там могу поделить, до нужного значения.

Тогда незачем зря бомбить, лучше контролировать частоту в самой ПЛИС, а наружу выдавать дискретный сигнал "pass/fail"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...