Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
ezDsp320F2812
CCS 3.1
JTAG нужен.. Эмулятор.. не помню встроен ли он в ezDsp320F2812
далее по хелпу: RTDX
насчет МатЛАБа: см. описание тузла: "Link for Code Composer Studio"
Цитата(Doka @ Nov 17 2006, 22:59)

JTAG нужен.. Эмулятор.. не помню встроен ли он в ezDsp320F2812
далее по хелпу: RTDX
насчет МатЛАБа: см. описание тузла: "Link for Code Composer Studio"
Ну вот опять общие фразы... Лучше бы кусочки кода... Эмулятор встроенный. Про RTDX я знаю, но для того, чтобы вывести переменную на график встроенный в CCS RTDX ведь не нужен.
28xmaster.chm -> Animating the Program and Graphs
28x_real.chm (demonstrates how to use Code Composer Studio's real-time debug features)
Цитата(PhX @ Nov 17 2006, 23:39)

Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
может просто через uart.
в компе разогнать до 921600. этого вполне хватит для передачи в реальном времени.
а если родной на такой скорости откажется работать, то через USB<->RS232.
да и matlab с компортом работать вроде умеет.
Цитата(PhX @ Nov 17 2006, 14:39)

Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
ezDsp320F2812
CCS 3.1
В принципе, вам Дока ответил уже, хочу просто дополнить.
Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться.
Чтобы сохранить с помощью CCS данные из программы, делаете так File-->Graph-->Save... Также можно и загружать некие данные в программу.
Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-).
Цитата(=GM= @ Nov 21 2006, 19:24)

Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться.
Ну до этого я конечно дошел, осталось 3 вопроса:
Дано: Каждые 1/20000 сек вызывается прервание, где результат преобразования записывается в переменную int16 myadcresult.
Вопросы:
1. Что писать в Start Address?
В хелпе пишется, что это адрес буфера с данными которые будем изображать, т.е. что надо делать этот самый буфер?
2. Acquisition Buffer Size это что такое?
Видимо размер этого буфера.
3. Display Data Size а это что такое?
Видимо размер буфера из которого данные выводяться на график, т.е. из Acquisition Buffer данные постоянно валятся в Display Buffer из которого и выводятся на экран.
Так-то все вроде понятно, но как создать этот самый Acquisition Buffer без дополнительного кода в функции прерывания (а если с ним, то набросайте please).
Если ответить на эти вопросы я думаю проблема будет частично решена.
Цитата(=GM= @ Nov 21 2006, 19:24)

Чтобы сохранить с помощью CCS данные из программы, делаете так File-->Graph-->Save... Также можно и загружать некие данные в программу.
Не знал спасибо!
Цитата(=GM= @ Nov 21 2006, 19:24)

Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-).
Ну а это знает каждый advanced user (:-).
Цитата(PhX @ Nov 21 2006, 18:15)

Цитата(=GM= @ Nov 21 2006, 19:24)

Чтобы график отображался в CCS, делаете так View-->Graph-->Time/Frequency... Если хотите динамически, поставьте breakPoint где-нибудь в программе и нажмите кнопку Animate, по мере выполнения программы график будет обновляться.
Ну до этого я конечно дошел, осталось 3 вопроса:
Дано: Каждые 1/20000 сек вызывается прервание, где результат преобразования записывается в переменную int16 myadcresult.
Вопросы:
1. Что писать в Start Address?
В хелпе пишется, что это адрес буфера с данными которые будем изображать, т.е. что надо делать этот самый буфер?
Задаете начала массива (Start Address) для графика, поскольку отрисовать можно только массив (или буфер, тот же мтс-символ, только вид сбоку). Сам массив (буфер) должен быть у вас в программе.
Цитата(PhX @ Nov 21 2006, 18:15)

2. Acquisition Buffer Size это что такое? Видимо размер этого буфера.
Это размер вашего массива, она может не совпадать с длиной буфера отображения, хитрость в том, что возможна нормализация всех элементов буфера, ну или у вас буфер со смешанными сигналами, значит рисовать надо через слово. Много чего там можно придумать.
Цитата(PhX @ Nov 21 2006, 18:15)

3. Display Data Size а это что такое?
Видимо размер буфера из которого данные выводяться на график, т.е. из Acquisition Buffer данные постоянно валятся в Display Buffer из которого и выводятся на экран.
Так-то все вроде понятно, но как создать этот самый Acquisition Buffer без дополнительного кода в функции прерывания (а если с ним, то набросайте please).
Если ответить на эти вопросы я думаю проблема будет частично решена.
Обычный буфер для отображения, находится на писюке. Сколько надо точек отобразить, таков и буфер
Цитата(PhX @ Nov 21 2006, 18:15)

Цитата(=GM= @ Nov 21 2006, 19:24)

Еще простой вариант. Графики из окошек CCS удобно заносить в буфер обмена (clipboard) с помощью клавиш Alt+PrtSc, а потом в ворд-документ с помощью копи-пейст (или Ctrl+V). Иногда здорово помогает(:-).
Ну а это знает каждый advanced user (:-).
Ну раз вы advanced user(:-), вот так сделать можете (ех1) или так (ех2)?
Большое спасибо за доходчивый ответ. Однако программы на ассемблере мне понятны немногим более чем китайская грамата. Я на С то еще не асс, так что буду разбираться.
Кстати нарвыл такую штуку DataLog из DMCLib, вроде работает, если кто в асме разбирается и будет время и желание глянте.
Применяется так:
main()
{
dlog1.iptr1 = &Q15_var1; // Pass input to DATALOG module
dlog1.iptr2 = &Q15_var2; // Pass input to DATALOG module
dlog1.iptr3 = &Q15_var3; // Pass input to DATALOG module
dlog1.iptr4 = &Q15_var4; // Pass input to DATALOG module
dlog1.trig_value = 0x0; // Pass input to DATALOG module
dlog1.size = 0x400; // Pass input to DATALOG module
dlog1.prescalar = 1; // Pass input to DATALOG module
dlog1.init(dlog1); // Call init function for dlog1
}
void interrupt periodic_interrupt_isr()
{
dlog1.update(&dlog1); // Call update function for dlog1
}
и вроде работает.
Вопросы:
1. Почему один раз буфер забился и все одна и та-же картинка это так должно быть?
2. Что такое dlog1.trig_value?
; File name : DLOG4CHC.ASM
;
; Originator : Advanced Embeeded Control (AEC)
; Texas Instruments Inc.
;
; Description : 4-Channel Data logging module
;
; Date : 02/01/2002 (DD/MM/YYYY)
; Routine Name: data_log_update
;
; C prototype : void DLOG_4CH_update(DLOG_4CH_handle);
; void DLOG_4CH_init(DLOG_4CH_handle);
;
; The struct object is defined in the header file "dlog_4ch.h" as follows:
;
; typedef struct {
; long task; /* Variable: Task address pointer */
; int *iptr1; /* Input: First input pointer (Q15) */
; int *iptr2; /* Input: Second input pointer (Q15) */
; int *iptr3; /* Input: Third input pointer (Q15) */
; int *iptr4; /* Input: Fourth input pointer (Q15) */
; int trig_value; /* Input: Trigger point (Q15) */
; int prescalar; /* Parameter: Data log prescale */
; int skip_cntr; /* Variable: Data log skip counter */
; int cntr; /* Variable: Data log counter */
; long write_ptr; /* Variable: Graph address pointer */
; int size; /* Parameter: Maximum data DLOG_4CH_buffer */
; int (*init)(); /* Pointer to init function */
; int (*update)(); /* Pointer to update function */
; } DLOG_4CH;
;
; External Reference
.def _DLOG_4CH_update
.def _DLOG_4CH_init
; Data log buffer definition
BUFF_SIZE .set 400h
DLOG_4CH_buff1 .usect "DLOG", BUFF_SIZE
DLOG_4CH_buff2 .usect "DLOG", BUFF_SIZE
DLOG_4CH_buff3 .usect "DLOG", BUFF_SIZE
DLOG_4CH_buff4 .usect "DLOG", BUFF_SIZE
;==============================================================================
; Initialization Function
;==============================================================================
_DLOG_4CH_init:
MOVL XAR5,#POS_TRIG_S1
MOVL *XAR4,XAR5 ; task=#POS_TRIG_S1
ADDB XAR4,#10 ; XAR4->trig_value
MOV *+XAR4[2],#0
MOVL XAR5,#DLOG_4CH_buff1
MOVL *+XAR4[4],XAR5 ; write_ptr=DLOG_4CH_buff1
MOV AL,*+XAR4[6] ; ACC=size
MOV *+XAR4[3],AL ; cntr=size
LRETR
;==============================================================================
; Datalog Update Function
;==============================================================================
_DLOG_4CH_update:
SETC SXM
MOVL XAR5,XAR4 ; XAR4->task
MOVL XAR7,*XAR4++ ; XAR4->iptr1, XAR7=task
ADDB XAR5,#10 ; XAR5->trig_value
LB *XAR7 ; Branch to TASK
POS_TRIG_S1:
MOV ACC,*XAR5 ; ACC=trig_value
MOVL XAR6,*XAR4 ; XAR6=iptr1
SUB ACC,*XAR6 ; ACC=(trig_value - *iptr1)
BF DL_EXIT,LEQ ; Exit if ACC <= 0
MOVL XAR6,#POS_TRIG_S2
MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2
LRETR
POS_TRIG_S2:
MOV ACC,*XAR5 ; ACC=trig_value
MOVL XAR6,*XAR4 ; XAR6=iptr1
SUB ACC,*XAR6 ; ACC=(trig_value - *iptr1)
BF DL_EXIT,GEQ ; Exit if ACC >= 0
MOVL XAR6,#DL_TRIGGERED
MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2
LRETR
DL_TRIGGERED:
INC *+XAR5[2] ; skip_cntr=skip_cntr+1
MOV ACC,*+XAR5[2] ; ACC=skip_cntr
SUB ACC,*+XAR5[1] ; ACC=skip_cntr-prescalar
SBF DL_EXIT,NEQ ; if (skip_cntr+1) < prescalar, then exit
MOV *+XAR5[2],#0 ; skip_cntr=0
MOV ACC,*+XAR5[3] ; ACC=cntr
SBF DLOG_END,EQ
DEC *+XAR5[3] ; cntr=cntr-1
ADDB XAR5,#4 ; XAR5->write_ptr
MOVL XAR6,*XAR5 ; XAR6=write_ptr
ADDB XAR6,#1 ; XAR6=write_ptr+1
MOVL *XAR5,XAR6 ; write_ptr=write_ptr + 1
SUBB XAR6,#1 ; XAR6=write_ptr
MOV AR0,#BUFF_SIZE ; AR0=BUFF_SIZE
; Log sample pointed by IPTR1
MOVL XAR7,*XAR4++ ; XAR7=iptr1
MOV AL,*XAR7 ; AL=*iptr1
NOP *,ARP6
MOV *0++,AL ; *write_ptr=*iptr1, XAR6=write_ptr+size
; Log sample pointed by IPTR2
MOVL XAR7,*XAR4++ ; XAR7=iptr2
MOV AL,*XAR7 ; AL=*iptr2
NOP *,ARP6
MOV *0++,AL ; *write_ptr=*iptr2, XAR6=write_ptr+size
; Log sample pointed by IPTR3
MOVL XAR7,*XAR4++ ; XAR7=iptr3
MOV AL,*XAR7 ; AL=*iptr3
NOP *,ARP6
MOV *0++,AL ; *write_ptr=*iptr3, XAR6=write_ptr+size
; Log sample pointed by IPTR4
MOVL XAR7,*XAR4++ ; XAR7=iptr4
MOV AL,*XAR7 ; AL=*iptr4
NOP *,ARP6
MOV *0++,AL ; *write_ptr=*iptr4, XAR6=write_ptr+size
LRETR
; Reinitialise the module to log the data when the logging is triggered next
DLOG_END:
MOVL XAR6,#DLOG_4CH_buff1
MOVL *+XAR5[4],XAR6 ; write_ptr=DLOG_4CH_buff1
MOVL XAR6,#POS_TRIG_S1
MOVL *--XAR4,XAR6 ; task=POS_TRIG_S2
MOV AL,*+XAR5[6] ; ACC=size
MOV *+XAR5[3],AL ; cntr=size
DL_EXIT:
LRETR
После упорной борьбы с собственным ламерством я со всем разобрался. Однако появилась новая проблема: скачки на графике если Display Data Size > Acquisition Buffer Size. Это видимо из-за того, что пересылка данных из Acquisition Buffer на комп занимает некоторое время, за которое этот самый Acquisition Buffer перезаписывается много раз. Что нужно сделать, чтобы преодолеть эту неприятность?
Цитата(PhX @ Dec 4 2006, 16:44)

...новая проблема: скачки на графике если Display Data Size > Acquisition Buffer Size. Это видимо из-за того, что пересылка данных из Acquisition Buffer на комп занимает некоторое время, за которое этот самый Acquisition Buffer перезаписывается много раз. Что нужно сделать, чтобы преодолеть эту неприятность?
Самое простое сделать Display Data Size =< Acquisition Buffer Size. Зачем вам нужно, чтобы DisplayBuffer елозил по всему Acquisition Buffer? Что за задача?
Задача наблюдения за переходными процессами при пуске двигателя постоянного тока. Требуется снимать ток якоря (АЦП), угол поворота вала, скорость вращения вала (энкодер). Управление двигателем осуществляется при помощи ШИМ (широтно импульсной модуляции) питающего напряжения частотой 20 кГЦ.
Переходные процессы в электродвигателе длятся отностительно долго (около 1 сек.), то есть необходимо отобразить на графике 20000*3=60000 точек * 2 = 120000 байт (в крайнем случае отбросив скорость вращения 20000*2=40000 = 80000 байт). Естественно создать буфер такого размера в памяти контроллера не реально.
Цитата(PhX @ Dec 6 2006, 09:28)

Задача наблюдения за переходными процессами при пуске двигателя постоянного тока. Требуется снимать ток якоря (АЦП), угол поворота вала, скорость вращения вала (энкодер). Управление двигателем осуществляется при помощи ШИМ (широтно импульсной модуляции) питающего напряжения частотой 20 кГЦ.
Переходные процессы в электродвигателе длятся отностительно долго (около 1 сек.), то есть необходимо отобразить на графике 20000*3=60000 точек * 2 = 120000 байт (в крайнем случае отбросив скорость вращения 20000*2=40000 = 80000 байт). Естественно создать буфер такого размера в памяти контроллера не реально.
Вижу комбинацию двух путей, как помочь горю.
1) Уменьшить размер буфера в 2-4 раза, если записывать в буфер разности текущего и предыдущего значений. Тогда вам потребуется минимум 20Кбайт. В процессоре есть 18Кслов озу, т.е. 36 Кбайт. Ну пусть 3 Кслова на программу, останется 30 Кбайт.
2) Использовать кольцевой буфер и передачу не через отладочный джей-таг, а через рс232 или спи. Ну примерно так, пишите в буфер 30 кбайт за секунду, а выдаете 10 кбайт за секунду (скорость 115кбод), значит вам должно хватить буфера на 20 кбайт, который вы передадите уже после завершения односекундного переходного процесса.
Цифры примерные, просто для начала разговора, главное, чтобы была понятна идея.
Цитата(PhX @ Nov 17 2006, 14:39)

Аналогово цифровое преобразование выполняется с частотой 20 кГц. Очень хочется чтобы результат оптображался на графике хотя бы встроенном в CCS, кроме того желательно передавать данные в MatLab для дальнейшей обработки. Как такое осуществить?
ezDsp320F2812
CCS 3.1
Фу-ты, не обратил внимания, что вы используете ezDsp320F2812, там же внешняя память прицеплена 128 Кбайт! Не надо ничего делать, просто используйте эту память, записываете туда ваши данные, а потом хоть 5 минут качайте в писюк, времени у вас вагон(:-).
Цитата(=GM= @ Dec 6 2006, 19:04)

Фу-ты, не обратил внимания, что вы используете ezDsp320F2812, там же внешняя память прицеплена 128 Кбайт! Не надо ничего делать, просто используйте эту память, записываете туда ваши данные, а потом хоть 5 минут качайте в писюк, времени у вас вагон(:-).
Это конечно выход, однако это частное решение проблемы. Неужели через этот JTAG нельзя передать данные со скоростью большей чем 20000*16/1024=312.5 кбит/сек. Чего они там кичатся RTDXом, который также осуществляется через JTAG, букву R тогда в кавычки надо ставить. Вообще где есть инфа по характеристикам предачи через JTAG?
Получается относительно неплохо :-) Спасибо!
Однако, хочется передачи данных в реальном времени.
Цитата(PhX @ Dec 7 2006, 06:18)

Цитата(=GM= @ Dec 6 2006, 19:04)

Фу-ты, не обратил внимания, что вы используете ezDsp320F2812, там же внешняя память прицеплена 128 Кбайт! Не надо ничего делать, просто используйте эту память, записываете туда ваши данные, а потом хоть 5 минут качайте в писюк, времени у вас вагон(:-).
Это конечно выход, однако это частное решение проблемы. Неужели через этот JTAG нельзя передать данные со скоростью большей чем 20000*16/1024=312.5 кбит/сек. Чего они там кичатся RTDXом, который также осуществляется через JTAG, букву R тогда в кавычки надо ставить. Вообще где есть инфа по характеристикам предачи через JTAG?
Ну так вы кладите ваши данные в указазанную вам внешнюю озу, а композеру укажите, откуда рисовать графики, и будет вам щастье. Если совсем невмочь, попробуйте передавать через спи, там по-моему до 20 мбит/с.
И не надо возмущаться джейтагом, JTAG предназначен для отладки (хотя изначально он был разработан для тестирования микросхем и плат). Инфа по нему есть, но не все допущены(:-).