Easyelectronics.ru

Электроника для всех
Текущее время: 18 фев 2019, 17:39

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: ATSAM4SD32C что происходит
СообщениеДобавлено: 10 авг 2015, 13:46 
Здравствуйте!

Зарегистрирован: 13 фев 2014, 22:43
Сообщения: 2
Здравствуйте. Пытаюсь освоить ATSAM4SD32C установленный на плате SAM4S-EK2, но возникла проблема. Приведу код
Код:
#include "sam.h"

int dout[8] = {300, 800, 1300, 1800, 2300, 2800, 3300, 0};
int n = 0;

void DACC_Handler( void );

int main(void)
{
   
   /* Initialize the SAM system */
    SystemInit();

   __enable_irq ();
   
   // --------------- Enable Interrupts in NVIC ----------------------------
   NVIC_EnableIRQ(DACC_IRQn);
   
   //------------------- Disable Watchdog Timer ---------------------------
   WDT -> WDT_MR = WDT_MR_WDDIS; // disable Watchdog Timer
   //----------------------------------------------------------------------

   //----------------- Switch to fast RC oscillator ----------------------
   // Enable Fast RC oscillator but DO NOT switch to RC now
   PMC-> CKGR_MOR |= (CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCRCEN);

   // Wait the Fast RC to stabilize
   while (!(PMC -> PMC_SR & PMC_SR_MOSCRCS)){};

   // Change Fast RC oscillator frequency
   PMC-> CKGR_MOR = (PMC-> CKGR_MOR & ~CKGR_MOR_MOSCRCF_Msk) | CKGR_MOR_KEY_PASSWD |  CKGR_MOR_MOSCRCF_4_MHz;

   // Wait the Fast RC to stabilize
   while (!(PMC-> PMC_SR & PMC_SR_MOSCRCS)){};

   // Switch to Fast RC
   PMC-> CKGR_MOR = (PMC -> CKGR_MOR & ~CKGR_MOR_MOSCSEL) | CKGR_MOR_KEY_PASSWD;
   //---------------------------------------------------------------------------------------------------------------

   //-------------------------- Switch to Main Clock ---------------------------------------------------------------
   // Switch to Main Clock
   PMC -> PMC_MCKR |= PMC_MCKR_CSS_MAIN_CLK;

   // Wait the Fast RC to stabilize
   while (!(PMC-> PMC_SR & PMC_SR_MOSCRCS)){};
   //---------------------------------------------------------------------------------------------------------------

   //-------------------------- PLLA enable ------------------------------------------------------------------------

   // Number Wait States Required to Access the Embedded Flash Memory (page 366 and 1183 datasheet)
   EFC0 -> EEFC_FMR = (EFC0 -> EEFC_FMR & ~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6);

   // Always stop PLL first!
   PMC-> CKGR_PLLAR = CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(0);

   // Adjustment of the Multiplier and Divider
   PMC-> CKGR_PLLAR = CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(24) | CKGR_PLLAR_DIVA(1) | CKGR_PLLAR_PLLACOUNT(100) | PMC_MCKR_PLLADIV2;

   // Wait the PLL Lock
   while (!(PMC-> PMC_SR & PMC_SR_LOCKA)){};

   // Switch to PLLA Clock
   PMC -> PMC_MCKR = (PMC -> PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_PLLA_CLK;

   // Wait Master Clock is Ready
   while(!(PMC -> PMC_SR & PMC_SR_MCKRDY)){};
   
   // --------- Enables the corresponding peripheral clock   ----------------
   // ------------------------ Enable PIOA --------------------------------
   PMC -> PMC_PCER0 = (1 << ID_PIOA);
   
   // ---------------------- Enable DACC clock ----------------------------
   PMC -> PMC_PCER0 = (1 << ID_DACC);
   PMC -> PMC_PCER0 = (1 << ID_ADC);

   // --------- Enable corresponding pins ---------------------------------
   PIOA -> PIO_PER = PIO_PER_P19 | PIO_PER_P20;
   
   // ---- Enable output corresponding pins in PORTA-----------------------
   PIOA -> PIO_OER = PIO_OER_P19|PIO_OER_P20;
   
   
   // -- DAC SET
   // --------------------- DACC Software Reset ---------------------------
   DACC -> DACC_CR = DACC_CR_SWRST;
   
   // ----------------------- DACC Mode Register --------------------------
   DACC -> DACC_MR = DACC_MR_WORD_HALF | DACC_MR_USER_SEL_CHANNEL1;

   // ----------------------- Channel 1 Enable ----------------------------
   DACC -> DACC_CHER = DACC_CHER_CH1;

   // ------------------- End of conversion interrupt ---------------------
   DACC -> DACC_IER = DACC_IER_TXRDY;

   // ---------------------- Start of conversion --------------------------
   //DACC -> DACC_CDR = DACC_CDR_DATA(dout);

    while (1)
   {
      if(n == 7) // если последний элемент буфера
      {n = 0;} // сбрасываем его номер
      if(DACC -> DACC_IMR == 0) // если прерывание отключено
      {DACC -> DACC_IER = DACC_IER_TXRDY;} // включаем прерывание
      
   }
   return 0;
}

void DACC_Handler( void )
{    
   DACC -> DACC_ISR; // сбрасываем флаги прерываний
   DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]); // передаём данные в цап
   n = n + 1; // увеличиваем номер элемента буфера dout[n]
   DACC -> DACC_IDR = DACC_IDR_TXRDY; // отключаем прерывание
   return;
}

Программа передаёт в ЦАП последовательность значений хранящихся в буфере dout[]. Всё бы ничего но если я пытаюсь обнулить переменную n в цикле while(1) функции mein происходит какая то дрянь. Программа работает несколько секунд, но потом уходит в функцию "void Dummy_Handler(void)" которая находится в файле startup_sam4s.c. При этом значение n составляет 1048576.
Работаю в AtmelStudio 6.2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATSAM4SD32C что происходит
СообщениеДобавлено: 12 авг 2015, 11:23 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 27 янв 2010, 18:55
Сообщения: 163
Откуда: Томск
А вас не смущает что переменная n используется как в прерывании так и в основной программе? При этом в основной программе при чтении и записи переменной n прерывания не отключаются.
Так-же рекомендуется такие переменные объявлять volatile, что-бы компилятор не оптимизировал доступ к такой переменной. Неплохо-бы было еще сбрасывать прерывание в NVIC.
Почитайте так-же про барьеры (DAI0321A programming guide memory barriers for m profile).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB