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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ADC c PDC и программным запуском, sam7x
xelax
сообщение May 13 2008, 10:22
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Я думал у Вас без таймера работает, а с таймером и так всё понятно. Да и пример defunct уже выложил.

Считаю вопрос исчерпанным. Спасибо всем поучаствовавшим в обсуждении.
Go to the top of the page
 
+Quote Post
nicks80
сообщение Jun 9 2008, 21:18
Сообщение #17


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

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



Вот как надо и все работает непрерывно в два буффера попеременно


#include "cpu.h"


volatile unsigned short *adc_buffers;
volatile unsigned char adc_current_buffer=0; ///
volatile unsigned char adc_samples=0;
volatile unsigned char adc_num_channels=0;


char s[32];
void adc_interupt_irq(void) __irq
{
unsigned int status = AT91C_BASE_ADC->ADC_SR;
int i;
int k=0;
int flg=0;
AT91F_PDC_SetNextRx(AT91C_BASE_PDC_ADC, (char *)&adc_buffers[adc_current_buffer*adc_samples/2], adc_samples*sizeof(unsigned short)/4); // çàðÿæàåì âòîðîé áóôåð
if(adc_current_buffer==0)
adc_current_buffer = 1;
else
adc_current_buffer=0;
// Delay(10);
// lsd_clear_screen() ;


sprintf(s,"%d",adc_buffers[0]);

for(i=0;i<128;i++)
{
// if(adc_buffers2[i]>120 || adc_buffers2[i]<132)
// if(adc_buffers2[i]<adc_buffers2[i+1])
// flg=1;
// if(flg)
lcd_set_pixel(i,(adc_buffers[i])/8,0x0000);
}

// lcd_set_str(s,32,32,0,0xFFFFFF, 0x000000) ;




AT91C_BASE_AIC->AIC_EOICR = status;
//âàø êîä
}


/// Èíèöèàëèçàöèÿ ÀÖÏ
void adc_init(volatile unsigned short *buffers,unsigned short samples,unsigned char channels)

{
adc_buffers = buffers;
adc_samples = samples/2;
adc_current_buffer = 0;
AT91C_BASE_ADC->ADC_MR = 0;

/// Ìàòåìàòèêà êðàñèâî ïîëó÷èëàñü

//adc_num_channels = channels;

AT91C_BASE_ADC->ADC_CHER = AT91C_ADC_CH7;//channels;

/// ADCClock = 47.9232 / (7+1)*2 = 2.9952 Mhz
AT91C_BASE_ADC->ADC_MR =(AT91C_ADC_SHTIM & (3<<24)) | (AT91C_ADC_STARTUP & (8 << 16)) | (AT91C_ADC_PRESCAL & (7<<8)) //3F
| AT91C_ADC_SLEEP_NORMAL_MODE | AT91C_ADC_LOWRES_8_BIT | AT91C_ADC_TRGSEL_TIOA0 | AT91C_ADC_TRGEN_EN;

// çàðÿæàåì ïåðâûé áóôåð
AT91F_PDC_SetRx(AT91C_BASE_PDC_ADC, (char*)&adc_buffers[adc_current_buffer*adc_samples], (adc_samples*sizeof(unsigned short)) );
adc_current_buffer = 1;

// çàðÿæàåì âòîðîé áóôåð
AT91F_PDC_SetNextRx(AT91C_BASE_PDC_ADC, (char*)&adc_buffers[(adc_current_buffer*adc_samples)/2], (adc_samples*sizeof(unsigned short)) );

AT91F_PDC_EnableRx(AT91C_BASE_PDC_ADC);
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0; // Enable clock to TC0 // 47.9232/AT91C_TC_CLKS_TIMER_DIV1_CLOCK[/2] = 23.9616 Mhz
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK|AT91C_TC_WAVESEL_UP_AUTO|AT91C_TC_WAVE|AT91C_TC_A
CPA_SET|AT91C_TC_ACPC_CLEAR;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN; // Enable timer
AT91C_BASE_TC0->TC_RC = 768;
AT91C_BASE_TC0->TC_RA = AT91C_BASE_TC0->TC_RC>>1; ///meander

AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_ADC, AT91C_AIC_PRIOR_HIGHEST, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE , (void *)adc_interupt_irq);
AT91C_BASE_ADC->ADC_IER = AT91C_ADC_ENDRX; // IRQ enable, end of receive buffer
AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_ADC; // Enable interrupt in AIC
AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; // Start timer
};
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 9 2008, 21:37
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(nicks80 @ Jun 10 2008, 01:18) *
Вот как надо и все работает непрерывно в два буффера попеременно

Нет, так не надо:
Во-первых, ознакомьтесь с темой - про запуск АЦП от таймера все уже давно все поняли; во-вторых, если уж выкладываете исходник, то приведите его в человеческий вид; в-третьих, пользуйтесь тегами [сode][/сode].
Go to the top of the page
 
+Quote Post
nicks80
сообщение Jun 9 2008, 22:19
Сообщение #19


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

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



Цитата(aaarrr @ Jun 10 2008, 00:37) *
Нет, так не надо:
Во-первых, ознакомьтесь с темой - про запуск АЦП от таймера все уже давно все поняли; во-вторых, если уж выкладываете исходник, то приведите его в человеческий вид; в-третьих, пользуйтесь тегами [сode][/сode].


Спасибо.
Я уже понял что здесь пытались запустить не от таймера.
Но в этом примере есть плюс один, для частоты 23.9616 мгц и периода 768 тиков
имеем целую (без дроби частоту преобразования для разного набора каналов меняя только период тиков 128..256...512....768....).

PLL_DIV = 5
PLL_MUL = 25

PLL_LOCK_COUNT = 28
PRESCAL_MCK = 2
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 11:19
Рейтинг@Mail.ru


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