Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Какая максимальная частоты вых MATCH0.0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
asen
Вообщем настроил проц работает на 64 МГц таймер на той же частоте (APBDIV |=0x01; и T0PR = 0; ) частота совпадений стоит 8МГц а нога которая отвечает за матч дергаеться с частотой 3.25МГц что к чему прерывание по совподенияю не настроенно и вообще все прерывания запрещены ! Что это придел чтоль ?? не гуд силгал на ноге нужен чтобы в фоне тактировать внешню микросхемму smile.gif) Про дрыганье софтовое я читал и вкурсе но мне нужно чтоб это не кушала все ресурсы проца ! Что такое не возможно ответьтте плиззsmile.gif
meister
Цитата(asen @ Jun 26 2009, 18:00) *
Вообщем настроил


Покажите настройку таймера.
asen
Вот код
/**************************CORE ARM7TDMI***********************************
#define OSCILLATOR_CLOCK_FREQUENCY 16000000
#define max_F_MUL 4
#define max_F_DIV 1
//**************************IO_PORT*****************************************
#define SCK_OUT 1<<4
#define MOSI 1<<6
#define MISO 1<<5
#define CLK_OUT 1<<17
#define LED 1<<18


//*****************SPI0*************************
#define SPI0_EN 1
#define SPI0_FCLK 10000
#define SPI0_MASTER 1

//*****************UART0************************
#define UART0_EN 1
#define UART0_BAUND 9600
#define VIC_UART0_bit (1 << VIC_UART0)

//***************TIMER0************************
#define TIMER0_EN 1
#define OVR_TMR0_F 8000000
#define VIC_TIMER0_bit (1 << VIC_TIMER0)


unsigned int processorClockFrequency(void){ //CCLK=14768000
//return real processor clock speed
return OSCILLATOR_CLOCK_FREQUENCY * (PLLCON & 1 ? (PLLCFG & 0xF) + 1 : 1);
//если (PLLCON & 1)=1 то возвращаем (OSCILLATOR_CLOCK_FREQUENCY*(PLLCFG & 0xf)+1) если PLL подключен
//иначе возвращаем (OSCILLATOR_CLOCK_FREQUENCY * 1)
//PLLCFG.0 - PLLCFG.4 - значения умножителя
}
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
unsigned int peripheralClockFrequency(void){
//VPBDIV - determines the relationship between the processor clock (cclk)
//and the clock used by peripheral devices (pclk)=3 686250
unsigned int divider;
switch (APBDIV & 3)
{
case 0: divider = 4; break;
case 1: divider = 1; break;
case 2: divider = 2; break;
}
return processorClockFrequency() / divider;
}
void F_Init(unsigned char f_mul) //ф-я рассчёта умножителя частоты ядра и делителя частоты периферии
{
//devide or multiplier
//here is calculate frecuence
PLLCFG_bit.MSEL = (f_mul)-1; //M - multiplier=fmul
PLLCFG_bit.PSEL = 0x0; //P - devider default =1
//set changes (require from architecture)
PLLFEED_bit.FEED = 0xAA;
PLLFEED_bit.FEED = 0x55;


//enable or connect PLL
//enable PLL
PLLCON_bit.PLLE = 1;
//set changes (require from architecture)
PLLFEED_bit.FEED = 0xAA;
PLLFEED_bit.FEED = 0x55;

//wait for PLOK (correct freq)
while(PLLSTAT_bit.PLOCK == 0){}

//connect PLL
PLLCON_bit.PLLC = 1;
//set changes (require from architecture)
PLLFEED_bit.FEED = 0xAA;
PLLFEED_bit.FEED = 0x55;
APBDIV |=0x01;
}
void PortInit(void) {
PINSEL0 = 0x0; //set first functionality of this pin
PINSEL1 = 0x0; //set first functionality of this pin
PINSEL0_bit.P0_3 = 2;
IODIR |= SCK_OUT;
IODIR |=MOSI;
IODIR |=MISO;
IODIR |=LED;
IODIR |=CLK_OUT;
IOCLR |=LED;

}
void InitTimer_0()
{
T0TCR = 0; // Disable timer 0.
T0TCR = 2; // Reset timer 0.
T0TCR = 0;
T0IR = 0xff; // Clear timer 0 interrupt line.
T0PR = 0; // :7
T0CTCR = 0;
T0MR0 = peripheralClockFrequency()/(2*OVR_TMR0_F);
T0MCR = 2; // Reset, stop and interrupt on MR0 (match register 0).

T0CCR = 0; // Capture is disabled.
T0EMR = 49; // No external match output.
T0TCR = 1; //запускаем таймер
}

void set_led (void)
{
// IODIR |= LED;
IOCLR |= LED;
// IOCLR |= CLK_OUT;
}

void clr_led (void)
{
IOSET |= LED;
// IOSET |= CLK_OUT;
}

int main()
{
setup_sys();
while (1)
{
set_led();
__delay_cycles(1000000);
clr_led();
__delay_cycles(1000000);
};
return 0;
}
Ниче не понимаю он вообще по своему созданию изночально может дергать с такой скоростью нет ??
meister
Цитата(asen @ Jun 27 2009, 05:20) *
T0MR0 = peripheralClockFrequency()/(2*OVR_TMR0_F);


Надо так:
Код
T0MR0 = peripheralClockFrequency()/(2*OVR_TMR0_F) - 1;


Цитата(asen @ Jun 27 2009, 05:20) *
Ниче не понимаю он вообще по своему созданию изночально может дергать с такой скоростью нет ??


Настройте дергание ноги на 10кгц (чтобы точно), как настроите, настройте на 8мгц и узнаете.
asen
Так с частотой до мегагерца все просто супер он максимальное что может нормально дергать это 3.25МГц так что то что предделитель не тот не обьясняет частота должна быть 3.8 примерно smile.gif ктото пробывал дергать этим выводом быстрей ?
SanvaldYV
asen, вы пробовали посмотреть форму сигнала на ножке осциллографом? На что у вас нагружен этот выход?
etoja
Для генерации выходного тактового сигнала можно использовать таймер в режиме ШИМ.
При этом максимальная выходная частота равна частоте процессорного ядра, делённой на четыре.

void initPWM(void)
{
PINSEL1 |= 0x00000400; //set pin P0.21 (PWM5)

PWMTCR = 0x0000002; //counter reset
PWMPR = 0x00000000; //prescaler - run at full speed (60MHz)
PWMMCR = 0x00000002; //Match Control - reset on PWMMR0 match
PWMPCR = 0x00002000; //Enable PWM5 pin (single edge)
}


void processCommand(void)
{
int tempInt;
tempInt = 2;
PWMTCR = 0x0000002; //counter reset
PWMMR0 = tempInt; //set period
PWMMR5 = tempInt / 2; //set PWM5 (P0.21) duty to 50%
PWMTCR = 0x00000009; //Enable counter and PWM
}

int main (void)
{
initPWM();
processCommand(); //if a command is ready, process the command
}
asen
Да с ШИМ попробую а в данный момент нагружен на резистор сопротивлением 1кОм фронты оч плохенькие сигнал почти пила получаеться sad.gif это не гуд ??
SanvaldYV
Цитата(asen @ Jun 29 2009, 15:43) *
Да с ШИМ попробую а в данный момент нагружен на резистор сопротивлением 1кОм фронты оч плохенькие сигнал почти пила получаеться sad.gif это не гуд ??


Ну раз "почти пила" то конечно не гуд laughing.gif
Если есть такая возможность - я бы попробовал поставить какой нибудь быстродействующий буфер между ножкой и нагрузкой, или просто транзистор полевой быстродействующий в виде ключа, и посмотреть сигнал уже после него.
asen
Врятли это мне кажеться эффект так как если бы имело место сказавшаяся емкость короткой линии ножки (если предположить ) то повышение входного сопротивления нагрузки еще более затянет фронт спад мне кажеться ! А с какой скоростью тактируеться защелка порта выходного кто нить знает у ЛПС ???
Abo
Я вот так половину тактовой частоты периферии подаю на вывод 46
Код
  // Настраиваем входные и выходные сигналы
  PINSEL0 = (PINSEL0 & ~(0)) | 0x0;
  // Вывод 46-P0.16 как MAT0.2
  // Вывод 3-P0.21 как МАТ3.0
  PINSEL1 = (PINSEL1 & ~((3<<0)|(3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10))) | ((2<<0)|(2<<6)|(2<<8)|(2<<10));

  // Настраиваем таймер 0 на выдачу сигнала SCK частотой 12,8 МГц - половина тактовой
  PCONP |= PCONP_PCTIM0;                // Подаем питание на таймер
  T0TCR   = 2;                          // Остановим и сбросим таймер
  T0CTCR  = 0;                          // Работа в режиме таймера
  T0PR    = 0;                          // Предделитель не используется - на таймер подается CCLK 25,6 МГц
  T0MR0   = 1;                          // Определяет период выходного сигнала
  T0MR2   = 1;                          // Определяет период выходного сигнала
  T0MCR   = T0MCR_MR0R;                 // Сброс по совпадению с MR0
  T0EMR   = 0;              
  T0CCR   = 0;                          // Запретить режим захвата по всем входам
  PWM0CON = 1<<2;                       // Разрешим генерацию PWM на выходе MAT0.2
SanvaldYV
Цитата(asen @ Jun 29 2009, 17:10) *
Врятли это мне кажеться эффект так как если бы имело место сказавшаяся емкость короткой линии ножки (если предположить ) то повышение входного сопротивления нагрузки еще более затянет фронт спад мне кажеться ! А с какой скоростью тактируеться защелка порта выходного кто нить знает у ЛПС ???


asen, при использовании FastGPIO и программном ногодрыгании можно получить на ножке частоту, от которой тактируется переферия - в том же мануале на LPC2103 есть пример с осциллограмой, где на ножку выводиться 15 МГц. Так что 8 МГц при аппаратном ногодрыгании от таймера я думаю он должен выдавать спокойно. Вот и Abo поделился примером с выводом достаточно высокой частоты.
asen
Незнаю почему но не на том способе с шим не на способе с МАТСH добиться нормальной амплетуды и и скорости нарастания сигнала не удалось незна почему smile.gif) Вы пробывали смотреть качество сигнала на ноге ??
meister
Цитата(asen @ Jul 1 2009, 11:25) *
Вы пробывали смотреть качество сигнала на ноге ??


LPC2366, частота на таймер = 72мгц, частота на ногу = 8мгц, нагрузка - щуп осциллографа. в высокоомном режиме сигнал получается почти прямоуголный, с выбросами, в "низкоомном" режиме (1М) - круглая пила, период такой же. Кстати, для 8мгц, toggle должен идти на частоте 16мгц.
asen
А полосу осцила сказать можете ?? у нас toggle идет на частоте 8 МГц !
meister
Цитата(asen @ Jul 1 2009, 14:38) *
А полосу осцила сказать можете ?? у нас toggle идет на частоте 8 МГц !


GW Instek GOS-620, 20MHz.
asen
У меня TDS1002 60МГц ниче не пойму может потому что матч использу нулевой на нем почемуто открытый коллектор выход похоже !! Вы на каком матче пробуете ??
meister
Цитата(asen @ Jul 2 2009, 06:10) *
матч использу нулевой на нем почемуто открытый коллектор выход похоже


Какие ноги open drain написано в user manual.

Цитата(asen @ Jul 2 2009, 06:10) *
Вы на каком матче пробуете ??


MAT1.0, 36 нога у LPC2366.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.