реклама на сайте
подробности

 
 
> PWM в LPC2378 работает только под отладчиком
richie
сообщение Feb 27 2008, 14:42
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



Добрый день, Многоуважаемый All!

Пытаюсь на чипе LPC2378 запустить генерацию частоты (меандр, 50%, ~1,2 МГц)
ШИМом на канале 4.

И наблюдаю такую картину:
Под отладчиком частота генерится, все нормально.
Однако, если запускаю программу не в отладчке, то частоты нет...

При этом светодид, кнопки и UART0 обслуживаются.

Дамп регистров PWM:
1. При работе под отладчиком:
PWM1TC=00000001 (счетчик таймера изменяется от 0 до 9, что и нужно)
PWM1TCR=00000009
PWM1MR0=00000009 (период выходной последовательности PWM)
PWM1MR4=00000004 (смещение для нисходящего фронта)
PWM1PCR=00001000
PWM1MCR=00000002
PWM1LER=00000000
PCLKSEL0=AAAA8A2A (тактовая частота для PWM 12МГц, понизил для отладки)

2. Без отладчика:
PWM1TC=AE849F4C (счетчик изменяется циклически во всем диапазоне)
PWM1TCR=00000009
PWM1MR0=00000000 (период выходной последовательности PWM НЕ ЗАДАН)
PWM1MR4=00000000 (смещение для нисходящего фронта НЕ ЗАДАНО)
PWM1PCR=00001000
PWM1MCR=00000002
PWM1LER=00000000
PCLKSEL0=AAAA8A2A

Мысли иссякли и у меня и у электронщика...
В чем разникца исполнения программы под отладчикам и без?
Куда смотреть и что делать?

P.S. ARM только начали изучать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
KRS
сообщение Feb 27 2008, 14:55
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(richie @ Feb 27 2008, 17:42) *
2. Без отладчика:
PWM1TC=AE849F4C (счетчик изменяется циклически во всем диапазоне)
....

А откуда вы знаете что в регистрах, без отладчика?
Макросы случайно никакие не используются при старте отладки?(какая среда, отладчик)
И еще хорошо бы исходник посмотреть
Go to the top of the page
 
+Quote Post
richie
сообщение Feb 27 2008, 15:09
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



Цитата(KRS @ Feb 27 2008, 17:55) *
А откуда вы знаете что в регистрах, без отладчика?
Макросы случайно никакие не используются при старте отладки?(какая среда, отладчик)
И еще хорошо бы исходник посмотреть


1. Через УАРТ запрашию содержимое регистров.
2. Среда ИАР 4.41A, его отладчик через RDI и MT-Link.
3. Исходники:

Цитата
#define LER0_EN ( 1 << 0 )
#define LER1_EN ( 1 << 1 )
#define LER2_EN ( 1 << 2 )
#define LER3_EN ( 1 << 3 )
#define LER4_EN ( 1 << 4 )
#define LER5_EN ( 1 << 5 )
#define LER6_EN ( 1 << 6 )

#define TCR_CNT_EN 0x00000001
#define TCR_RESET 0x00000002
#define TCR_PWM_EN 0x00000008

#define PWMSEL2 ( 1 << 2 )
#define PWMSEL3 ( 1 << 3 )
#define PWMSEL4 ( 1 << 4 )
#define PWMSEL5 ( 1 << 5 )
#define PWMSEL6 ( 1 << 6 )
#define PWMENA1 ( 1 << 9 )
#define PWMENA2 ( 1 << 10 )
#define PWMENA3 ( 1 << 11 )
#define PWMENA4 ( 1 << 12 )
#define PWMENA5 ( 1 << 13 )
#define PWMENA6 ( 1 << 14 )

static void PWM_Init( void )
{
PWM1PR = 0x00000000;
PWM1TCR = TCR_RESET;
PWM1MCR = 0x00000002;
}

static void PWM_Set( INT32U freq )
{ int i = 3;
INT32U period;

lPWMSET:
i--;
if ( i < 0 ) {
goto lEND;
}
period = BSP_CPU_PclkFreq( PCLK_PWM1 );
period = period / freq;

PWM1MR0 = period;
PWM1MR4 = period / 2;
PWM1LER = LER0_EN | LER4_EN;

for ( period = 0; period <= 1000; period++ ) {}; // DEBUG: wait PWM1MRx apply
if ( PWM1LER != 0 ) {
goto lPWMSET;
}
lEND:;
}

static void PWM_Start( void )
{
PWM1PCR |= PWMENA4;
PWM1TCR = TCR_CNT_EN | TCR_PWM_EN;
}

static void PWM_Stop( void )
{
PWM1PCR &= ~PWMENA4;
PWM1TCR = 0x00;
}

void main (void)
{
CPU_INT08U err;

BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */

#if ( PWM_FREQ_OUT == DEF_ENABLED )
PWM_Stop();
PWM_Init();
PWM_Set( 1228800 );
PWM_Start();
#endif //PWM_FREQ_OUT
....


4. Из МАКРОСов только LPC2378_Flash.mac:
Цитата
execUserPreload()
{
__writeMemory32(0x00000001, 0xE01FC040, "Memory"); // MEMMAP = 1;
}
Go to the top of the page
 
+Quote Post
richie
сообщение Feb 29 2008, 09:27
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



help.gif help.gif help.gif

Други! Ну, направте в нужную сторону мысль!

help.gif help.gif help.gif
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 29 2008, 18:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Могу только свой точно работающий код предложить. Писалось наспех, в нарущении всех правил, ну хоть работает и ладно.
Код
    PWMPCR = (1 << 13);// PWM 5 enabled
    PWMPR = 0;// pckl
    PWMPC = 0;// pckl

    PWMMR0 = 0x4000;
    PWMMR5 = 0x3800;

    PWMMCR = (1 << 1); // reset on pwmmr0
    PWMTCR = (1 << 3) | (1 << 0);// PWM and counter enable
    PWMLER = 0xFF;

Ну и PINSEL1 не забыть настроить на работу пина как PWM а не GPIO
Еще раз - не ругайте за дурной код, сам знаю :-)
Go to the top of the page
 
+Quote Post
eu_point
сообщение Mar 3 2008, 08:07
Сообщение #6





Группа: Новичок
Сообщений: 2
Регистрация: 19-10-07
Пользователь №: 31 505



вот только написал... работает на 4-х различных платах

/* ШИМ инициализация */
PINSEL3 = 0x00200000; // 21:20 P1.26 GPIO Port 1.26 PWM1.6 (10)
PWM1PR = 12; // предделитель 1MГц на 12МГц
PWM1PCR = 0x00004000; // разрешить PWM6 в однофронтовом режиме
PWM1MCR = 0x00000002; // сброс при совпадении по 0-му каналу (т.е. период)
PWM1MR0 = 200; // период 200 тактов

vol_pwm = 100;
PWM1MR6 = vol_pwm; // спад на 8й такт

PWM1LER = 0x00000040; // разр. теневой рег. защелку для PWM6
PWM1TCR = 0x00000002; // сброс счетчика и предделителя
PWM1TCR = 0x00000009; // разреш. счетчика и PWM6
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 3 2008, 09:15
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(richie @ Feb 27 2008, 18:09) *
period = BSP_CPU_PclkFreq( PCLK_PWM1 );
period = period / freq;
PWM1MR0 = period;
PWM1MR4 = period / 2;

А period через UART посмотреть?
Go to the top of the page
 
+Quote Post
richie
сообщение Mar 18 2008, 13:42
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



Други, спасибо!

Проблема найдена и решена.
На caxape натолкнули на верное направление.
Есть такой чудесный регистр PINSEL10 в котором есть БИТ-3 (GPIO/TRACE),
состояние которого при старте зависит от внешних условий (состояние ноги RTCK).

Если этот бит не обнулить, то наблюдается описанная проблема с программированием PWMа.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016