PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : Dma



Caspian1361
06-06-2011, 19:40
کسی با DMA Controller کار کرده؟

t.o.e
07-06-2011, 01:02
سلام:
You can see links before reply

برای چه کاری می خواهید استفاده کنید تا دقیقتر بتونم راهنمایی کنم یا سایت معرفی کنم.

Caspian1361
09-06-2011, 12:15
من ADC ها رو تو مد Free Running گذاشتم (6 تا ADC)
می خوام 6 تا متغییر آرایه ای 1000 تایی تعریف کنم و با DMA اونا رو با مقدار ADC ها پر کنم و CPU مشغول این کار نشه، فقط محاسبات رو روی آرایه ها انجام بده.

ممنونم

microprocesor_2002
09-06-2011, 13:54
سلام دوست عزیز ... لطفا مطلب mini multi tasking تو مجله شماره 13 رو ببینید ... میتونید از اون روش خیلی بهتر از توانایی های میکرو استفاده کنید

pooriya
09-06-2011, 16:16
سلام.
تا جائی که من یادمه بخشی برای تنظیمات dma تو کدویژن ندیدم که خودتون باید بصورت مستقیم(کار با رجیستر ها) و با کد نویسی کارتون رو انجام بدید در ضمن کار با dma مستلزم مهارت کافی است.

در این زمینه بهترین راهنما همون کتابخونه های اماده atmel هستش که برای هر قسمت ارائه شده.(تو سایتش هست)

pooriya
12-06-2011, 20:45
سلام
یه نمونه کد برای راه اندازی adc وdma میزارم امیدوارم که کارتو راه بندازه و طرز عملکرد این قسمت دستت بیاد.کد مورد نظر در avrstudio 4 نوشته شده

void adca_init(void)
{

// Free Running mode: On
// Conversion mode: Unsigned
ADCA.CTRLB=(ADCA.CTRLB & (~(ADC_CONMODE_bm | ADC_FREERUN_bm | ADC_RESOLUTION_gm))) |
ADC_RESOLUTION_12BIT_gc | ADC_FREERUN_bm;

// Clock frequency: 62,500 kHz
ADCA.PRESCALER=(ADCA.PRESCALER & (~ADC_PRESCALER_gm)) | ADC_PRESCALER_DIV512_gc;

// Reference: AREF pin on PORTB
// Temperature reference: On
ADCA.REFCTRL=(ADCA.REFCTRL & ((~(ADC_REFSEL_gm | ADC_TEMPREF_bm)) | ADC_BANDGAP_bm)) |
ADC_REFSEL_AREFB_gc | ADC_TEMPREF_bm;

// Read and save the ADC offset using channel 0
// ADC0 pin connected to GND
ADCA.CH0.CTRL=(ADCA.CH0.CTRL & (~(ADC_CH_START_bm | ADC_CH_GAINFAC_gm | ADC_CH_INPUTMODE_gm))) |
ADC_CH_INPUTMODE_SINGLEENDED_gc;

ADCA.CH0.MUXCTRL=(ADCA.CH0.MUXCTRL & (~(ADC_CH_MUXPOS_gm | ADC_CH_MUXNEG_gm))) |
ADC_CH_MUXPOS_PIN0_gc;
// Enable the ADC in order to read the offset
ADCA.CTRLA|=ADC_ENABLE_bm;
// Insert a delay to allow the ADC common mode voltage to stabilize

delay_us(2);





}

void dma_init(void)
{
// DMA.CH0 aktivieren

DMA.CTRL = DMA_ENABLE_bm;

// reload source addr nach burst, incr src/des, reload dest end block
DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc |
DMA_CH_DESTRELOAD_BLOCK_gc | DMA_CH_DESTDIR_INC_gc;// 0x95

DMA.CH0.TRIGSRC = 0x10; // ADCA CH0 is trigger source
DMA.CH0.TRFCNT = 12; // buffer size
DMA.CH0.DESTADDR0 = (((uint16_t)samples)>>0*8) & 0xFF;
DMA.CH0.DESTADDR1 = (((uint16_t)samples)>>1*8) & 0xFF;
DMA.CH0.DESTADDR2 = 0;
DMA.CH0.SRCADDR0 = (((uint16_t)0x224)>>0*8) & 0xFF; //(uint16_t)0x24;"high-byte" ADCA.CH0.RESH;
DMA.CH0.SRCADDR1 = (((uint16_t)0x224)>>1*8) & 0xFF; //(uint16_t)0x02;"low-byte"
DMA.CH0.SRCADDR2 = 0;
// oder
// (uint16_t)0x24; "low-byte " oder (uint16_t) 0x10; ADCA.CH0.RESL;
// (uint16_t)0x02; "high-byte" oder (uint16_t) 0x02; ADCA.CH0.RESH;

// enable,repeat,single,2 byte burst
DMA.CH0.CTRLA = DMA_CH_ENABLE_bm | DMA_CH_REPEAT_bm | DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_2BYTE_gc;//0xa5

}