Jump to content
Sign in to follow this  
TAS90

Msp Vs Pic Шим И Синус

Recommended Posts

Дорогие люди помогите с дипломом :) ! пишу про блокиратор LTE сети, используется микроконтроллер для синтеза аналоговых сигналов(Пилообразный и синус для шума) есть программа, сперта с texas instruments для MSP430, подойдет ли она на PIC16F628, т.к. видел что его чаще использовали для генераторов шума ( плюс в мсп 64 ноги - многовато :)) ). Главный вопрос даже не в этом, мне необходимо получить эксперимент, а именно хотя бы спектры сигналов после микроконтроллера, какие программы использовать для запуска асс-рского кода и получения спектров? Вот программа для MSP430:

NAME PWMDAC

;************************************************************************************

; Программа реализации ЦАП на базе ШИМ

; Генерирует синусоиду частотой 250Гц с использованием ШИМ на базе таймера Timer_B.

;

; Описание: программа демонстрирует использование ШИМ-таймера совместно

; с внешними фильтрами для реализации ЦАП. Показан способ формирования

; синусоиды частотой 250Гц, пилообразного сигнала частотой 125Гц и

; сигнала с постоянным уровнем с использованием таймера Timer_B.

; Возможно аналогичное использование таймера Timer_A. В таблице sine table holds the

; хранятся отсчёты значений синусоиды. Для формирования «пилы» используется

; простой инкремент значения ШИМ. Постоянный уровень формируется зарядом

; конденсатора RC-цепи при помощи выхода ШИМ. Значение напряжения при этом

; прямо пропорционально коэффициенту заполнения сигнала ШИМ. После

; инициализации, ЦПУ переводится в режим пониженного энергопотребления LPM0.

; Он остаётся в этом режиме до прихода прерывания CCIFG0 от таймера Timer_B

; В подпрограмме обработки прерывания таймера Timer_B ISR в регистр CCR1

; загружается следующее значение для синусоиды, значение «пилы» инкрементируется

; и загружается в регистр CCR2. По возвращении из прерывания

; ЦПУ снова переходит в режим пониженного энергопотребления LPM0.

;************************************************************************************

#include "MSP430X14x.H" ; Включить в проект файл со

; стандартными определениями

Delta EQU 250 ; Delta = требуемая частота DCO/8192

; Требуемая частота генератора DCO = 2.048МГц

; Это значение используется

; в программном стабилизаторе FLL

; для калибровки частоты генератора DCO

; с использованием кварцевого

; резонатора с частотой 32768Гц

; в качестве опорного. Более подробная

; информация по стабилизации частоты

; генератора DCO и программе

; стабилизатора FLL см. пример применения

; под названием «Управление частотой

; генератора с цифровым управлением (DCO)

; микроконтроллеров MSP430x11x»

; ( "Controlling the DCO frequency of the

; MSP430x11x" Literature number SLAA074)

;--------------------------------------------------------------------------------------

RSEG CODE

;--------------------------------------------------------------------------------------

Sine_Tab DW 255 ; Таблица синуса, отсчёты

DW 254 ; десятичные значения

DW 246 ; загружаемые в регистр TBCCR1 для изменения

DW 234 ; коэффициента заполнения ШИМ.

DW 219 ; Вместо байт требуется использовать слова

DW 199 ; т.к. в регистры ТВ

DW 177 ; требуется записывать слово целиком

DW 153 ; Значение '0' использовать нельзя

DW 128 ; иначе таймер будет глючить.

DW 103

DW 79

DW 57

DW 37

DW 22

DW 10

DW 2

DW 1

DW 2

DW 10

DW 22

DW 37

DW 57

DW 79

DW 103

DW 128

DW 153

DW 177

DW 199

DW 219

DW 234

DW 246

DW 255

;------------------------------ Здесь начинается программа ----------------------------

RESET mov #02FEh,SP ; Инициализация указателя стека

StopWDT mov #WDTPW+WDTHOLD,&WDTCTL

; Остановить сторожевой таймер WDT

SetupP4 bis.b #00Eh,&P4SEL ; Выбрать TB1, TB2 и TB3 вместо портов

bis.b #00Eh,&P4DIR ; P4.x, и назначить их выходами

SetupBC mov.b #0A6h,&BCSCTL1 ; ACLK делится на 4. RSEL=6,

; MCLK и SMCLK не делятся,

; источником MCLK и SMCLK является DCO

; генератор XT2 выключен.

; ПРИМЕЧАНИЕ: для определения значения

; Rsel для требуемой частоты DCO,

; обратитесь к таблице DCO в докуметнтации

call #Delay ; Пауза для стабилизации кварца.

; Необходима из-за того, что

; кварцевый резонатор 32768Гц используется

; в качестве опорного для стабилизации частоты

; генератора DCO. Поэтому резонатор на 32768

; должен быть стабильным.

call #SW_FLL ; Вызов подпрограммы стабилизации

; частоты генератора DCO.

call #TB_SETUP ; Инициализация таймера Timer_B

; для генерации сигналов ШИМ

clr R15 ; R15 и R14 используются как указатели

clr R14 ; на таблицу синусов и для хранения

; значения «пилы» после стабилизации DCO

eint ; Разрешение прерываний

bis #LPM0,SR ; «усыпить» ЦПУ.

; Завершение программы

; остаётся обработчик прерывания CCIFG0

; где обновляются значения ШИМ

;--------------------------------------------------------------------------------------

Delay ; Программная пауза для стабилизации кварца

;--------------------------------------------------------------------------------------

mov #0004h,R15

L1 mov #0FFFFh,R14 ; ~ 1 секунда .

L2 dec R14 ;

jnz L2 ;

dec R15 ;

jnz L1 ;

ret ;

;

;--------------------------------------------------------------------------------------

SW_FLL ; Подпрограмма стабилизации частоты DCO.

; Кварцевый генератор 32768Гц используется

; в качестве опорной частоты для стабилизации

; и подстройки генератора DCO до требуемой

; частоты 2.048МГц. Это требуется в устройствах

; где нужна фиксированная частота DCO и для

; тех моделей MSP430 где нет аппаратного

; модуля FLL. См. руководства пользователя

; MSP430x3xx и MSP430x1xx Family

; User's Guides (literature number SLAU012 и

; SLAU049 соответственно) по вопросам,

; касающимся системы тактирования MSP430

;

; процедура основана на подсчёте тактов DCO

; за период ACLK (точнее, за 1/4 периода ACLK

; т.к. частота ACLK поделена на 4). Таймер

; Timer_A используется для подсчёта тактов DCO

; Полученное значение сравнивается с

; номинальным (Delta). Если число слишком

; большое, DCO декрементируется. Если число

; слишком маленькое, DCO инкрементируется.

; Далее сравнение повторяется.

; Процесс продолжается до тех пор, пока

; значения не сравняются. После этого

; DCO генерирует на требуемой частоте

; См. пример применения «Управление частотой

; генератора с цифровым управлением (DCO)

; микроконтроллеров MSP430x11x»

; ( "Controlling the DCO frequency of the

; MSP430x11x" Literature number SLAA074) по

; вопросам, связанным с управлением

; генератором DCO.

;

; Эта процедура вызывается только один раз

; в качестве примера, в реальных условиях

; её требуется выполнять периодически, чтобы

; быть уверенным, что генератор DCO

; остаётся откалиброванным.

;--------------------------------------------------------------------------------------

clr R15 ;

Setup_TA mov #TASSEL1+TACLR,&TACTL

; Источник тактирования TA - SMCLK

Setup_CC2 mov #CCIS0+CM0+CAP,&CCTL2

; Определить CCR2,CAP,ACLK

bis #MC1,&TACTL ; Запустить таймер timer_A

; в непрерывном режиме

Test_DCO bit #CCIFG,&CCTL2 ; Проверка флага захвата

jz Test_DCO ;

bic #CCIFG,&CCTL2 ; Очистка флага захвата

;

AdjDCO mov &CCR2,R14 ; В R14 число тактов SMCLK

sub R15,R14 ; в R14 разница

mov &CCR2,R15 ; В R15 число тактов SMCLK

cmp #Delta,R14 ; Delta = SMCLK/(32768/4)

jlo IncDCO ;

jeq DoneFLL ;

DecDCO dec.b &DCOCTL ;

jmp Test_DCO ;

IncDCO inc.b &DCOCTL ;

jmp Test_DCO ;

DoneFLL clr &CCTL2 ; очистить CCR2

clr &TACTL ; остановить таймер timer_A

ret ; возврат из подпрограммы

;--------------------------------------------------------------------------------------

TB_SETUP ; Подпрограмма инициализации таймера

; Timer_B для генерации ШИМ

;--------------------------------------------------------------------------------------

mov #TBSSEL1+TBCLR,&TBCTL

; SMCLK –источник тактирования TB.

mov #CCIE,&TBCCTL0 ; Перевести CCR0 в режим сравнения,

; разрешить прерывания от него

mov #0FFh,&TBCCR0 ; Записать 255d в CCR0. Это соответствует

; периоду ШИМ-выходов в 256 отсчётов (8 бит).

; т.е. получаем 8-битный ЦАП.

mov #02E0h,&TBCCTL1 ; Перевести CCRx в режим сравнения, запретить

mov #02E0h,&TBCCTL2 ; прерывания, режим выхода '7' , т.е.

mov #02E0h,&TBCCTL3 ; сброс/установка. Сигнал EQU0 устанавливает

; выход в «1», а EQU1 в «0». Установим

; условия сравнения для регистра как

; его равенство нулю

mov #Sine_Tab,&TBCCR1

; Загрузить первый отсчёт в CCR1

mov #01h,R14 ; Загрузить начальное значение «пилы» в R14.

mov #0AAh,&TBCCR3 ; И значение для постоянного уровня

; которое соответствует ~ 2/3 Vcc т.к.

; #0AAh это примерно 2/3 от #0FFh.

bis #MC0,&TBCTL ; Запустить таймер timer_B в режиме инкремента

ret

;--------------------------------------------------------------------------------------

TB_ISR ; Подпрограмма обработки прерываний таймера

; Timer_B: изменяет значения в регистрах

; CCR1 и CCR2 для изменения коэффициента

; заполнения ШИМ для синусоиды и «пилы».

; Значение в CCR3 не изменяется для

; формирования постоянного уровня

;--------------------------------------------------------------------------------------

incd R15 ; Инкремент указателя в R15 to

; для следующего значения в таблице синуса

; Инкремент двойной, т.к.

; значения в таблице двухбайтовые

and #03Fh,R15 ; Операция лог. «И» с числом 03Fh даёт

; счётчик по модулю 32 для указания на

; значения в таблице

mov Sine_Tab(R15),&TBCCR1

; Загрузить следующее значение синуса в CCR1

add #04h,R14 ; Инкрементировать значение «пилы»

; Изменение шага в R14

; приведёт к изменению частоты «пилы»

and #0FFh,R14 ; Исключим лишние биты

mov R14,&TBCCR2 ; Загрузим новое значение пилы в CCR2

reti ; возврат, прерывания разрешены

;-----------------------------------------------------------------------------------

COMMON INTVEC ; Вектора прерываний MSP430x14x

;-----------------------------------------------------------------------------------

ORG TIMERB0_VECTOR

DW TB_ISR ; Прерывание от CCIFG0

ORG RESET_VECTOR

DW RESET ; POR, внеш. Reset, Watchdog

END

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. 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
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...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

    • By Терентенко Андрей
      Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)
    • By Splav
      Речь пойдет о таймере цикличного включения вентиляции гаража.
      Стояла задача обеспечить принудительную вентиляцию гаража.
      Оставлять включенным вентилятор круглые сутки - неоправданно.
      Включать его периодически вручную... Неудобно и лишено смысла.
      Поэтому было решено включать его на определенное время через разные интервалы времени, в зависимости от субъективного восприятия наличия сырости в гараже.
      Вменяемых вариантов в продаже я не нашел.
      Можно, конечно, приобрести на Али программируемый суточный таймер или что-то подобное...
      Да, можно, но мне кажется, что собрать из подручных деталей тоже можно, ну и мозги потренировать.
      За основу был выбран PIC12F675, потому что он у меня был.
      По уму здесь должен стоять PIC12F629, он дешевле, в нем нет АЦП, который в конструкции не используется и отключен.
      Итак.
      Время работы выбрано фиксированным и неизменным - 1 час.
      Время простоя - в зависимости от режима.
      1 час - 2 часа - 3 часа.
      (Изначально я планировал другие задержки: 2-3-5 часов. На практике в моих гаражных условиях эти интервалы оказались слишком большими)
      Индикация осуществляется всего 1 светодиодом.
      Переключение режимов и управление - всего 1 кнопкой.
      Схема:

      Коротко о работе:
      Кнопка.
      Опрос кнопки 10 раз в секунду. Антидребезг и подавление помех 0,3с - 3 опроса подряд кнопка нажата.
      Короткое нажатие на кнопку(от 0,3 до 2 с) - переключение режимов по кругу. 1 - 2 - 3 - OFF - 1 - 2 -  ....
      Длинное нажатие на кнопку (дольше 2 с) - смена состояния реле.
      Если оно было включено - выключается.
      Если было выключено - включается. Интервалы работы реле при этом соответствуют режиму.
      В режиме OFF длинное нажатие ничего не меняет.
      Переключение режима или смена состояния реле происходят при отпускании кнопки.
      Светодиод.
      Индикация режимов светодиодом:
      1 - 1 раз в 2 секунды загорается, если реле не включено. Проблеск света.
            1 раз в 2 секунды гаснет, если реле включено. Проблеск тени.
      2 - 1 раз в секунду загорается, если реле не включено.
            1 раз в секунду гаснет, если реле включено.
      3 - 2 раза в секунду загорается, если реле не включено.
            2 раза в секунду гаснет, если реле включено.
      OFF - загорается раз в 5 секунд. Контроль того, что МК не завис.
      Режимы работы.
      Время работы циклического таймера по режимам:
      1 - 1 час работы / 3 часов отдых. 6/24
      2 - 1 час работы / 2 часа отдых.  8/24
      3 - 1 час работы / 1 часа отдых.  12/24
      Работа.
      При отключении питания, пока не разрядились конденсаторы фильтра, МК отключает все выходы, сохраняет текущие данные в память, ждет 15 сек в таком состоянии и возобновляет работу, если отключение было кратковременным и емкостей фильтра питания хватило.
      Если отключение питания было длительным то, при возобновлении питания, загружает сохраненные данные из памяти и продолжает работу.
      При первом включении, после программирования МК, устройство работает в 1-ом режиме.
      Программа писалась в MPLab X IDE v4.05.
      Прошивка:fan_cycle_timer.hex

      Плата для устройства не разрабатывалась. Все было собрано на макетке.
      В блоке питания использован стандартный трансформатор для монтажа на плату ТПК 2х9V с 2-мя вторичными обмотками на 9В.
      Использовал только одну из них. Вторая - не подключена, в "воздухе"
      Реле - HLS-14F1D-DC12V-C. С обмотка на 12В, и одной группой переключающих контактов на 10А/240VAC.
      Устройство собрано в корпусе щитка для автоматов на 8 модулей. Производитель VIKO.
      Закреплена плата на щиток через резьбовые дистанционные втулки с резьбой М3.
      В качестве вентилятора - вытяжной вентилятор диаметром 125мм ВЕНТС 125С
      Устройство на данный момент отработало в гараже все лето, температура воздуха в тени доходила до 32 градусов.
      Перегревов элементов и зависаний контроллера пока не было.
       
      Несколько фото для общего представления о конструкции.

    • By Rusteka
      Продам микросхемы. Все микросхемы новые, в наличие.
      1. PIC18LF4550-I/P Microchip 65шт
      2. ATtiny85-20PU [DIP-8] Atmel 200шт
      3. PIC18LF452-I/L Microchip 50шт
      4. A29L040L-70F Amic 50шт
       
       

       



       
  • Сообщения

    • Что более чем разумно, но администрация предпочитает иной путь - ставить минусы неугодным, тем самым пытаясь выдавить их и из темы, и вообще с форума. Поэтому и получается, что ставя минусы кому-либо в этой теме, ты тем самым выражаешь поддержку такого поведения администрации. 
    • Способом который предложил fInn 32.картинку выложу позже.
    • Много букв  
    • Как считаю нужным на твоё высказывание,так и действую Если минусы не хорошо и не очень прилично, то давайте и плюсы отменим, будет более менее честно , я полностью поддержу это!!! Думаю многие это одобрят ,нет минусов,но и нет плюсов,а то друг другу плюсы за всякое гомно можно ставить ,а минусы нет..   Так они по этому же способу скорее всего закрылись и тут же открылись с изминением каких то там номеров окведов или инн.просто надо просмотреть почему именно в 2009 году это происходило и именно в начале года , мне кажется там и налоговая тоже чтото меняла типа кбк или счетов. Я помню когда то в те времена часто всё менялось в  платежах, хрен запомнишь. Как год кончится ,так жди изминений ,приходилось сверятся с ,,цыферами,, в этой конторе каждый январь,а иногда они сами не знали,но знали что старые платёжки не правильные и просили подождать пару недель. Кароче-они так всё запутали тогда,что сами не знали что и как.вспомни, в 2000х ,если чтото оформлял в собственность , у них данных не было, можно было купить,продать и налогообложения не было,вот скорее всего и прибирали базы данных к рукам , теперь только продал что,сразу гумаги идет-плати ,,ндфл,,
    • Действительно. Позже перезалью.
    • Каким из выше перечисленных способом справился и как теперь картинки?
    • Уже сказал: это такая коррекция. Она двухполюсная и немного недоделана автором.  
  • Покупай!

×
×
  • Create New...