|
Как переслать результат АЦП на комп. |
|
|
|
 |
Ответов
|
Nov 21 2006, 17:24
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(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). Иногда здорово помогает(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 21 2006, 21:15
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(=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 (:-).
--------------------
Если все, то не я...
|
|
|
|
|
Nov 22 2006, 17:33
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(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)?
Эскизы прикрепленных изображений
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 23 2006, 21:01
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Большое спасибо за доходчивый ответ. Однако программы на ассемблере мне понятны немногим более чем китайская грамата. Я на С то еще не асс, так что буду разбираться. Кстати нарвыл такую штуку 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
--------------------
Если все, то не я...
|
|
|
|
Сообщений в этой теме
PhX Как переслать результат АЦП на комп. Nov 17 2006, 17:39 Doka JTAG нужен.. Эмулятор.. не помню встроен ли он в ... Nov 17 2006, 17:59 PhX Цитата(Doka @ Nov 17 2006, 22:59) JTAG ну... Nov 18 2006, 07:27 Doka 28xmaster.chm -> Animating the Program and Grap... Nov 18 2006, 17:22 _pv Цитата(PhX @ Nov 17 2006, 23:39) Аналогов... Nov 18 2006, 17:54   PhX После упорной борьбы с собственным ламерством я со... Dec 4 2006, 19:44    =GM= Цитата(PhX @ Dec 4 2006, 16:44) ...новая ... Dec 5 2006, 13:19     PhX Задача наблюдения за переходными процессами при пу... Dec 6 2006, 12:28      =GM= Цитата(PhX @ Dec 6 2006, 09:28) Задача на... Dec 6 2006, 16:52 =GM= Цитата(PhX @ Nov 17 2006, 14:39) Аналогов... Dec 6 2006, 17:04 PhX Цитата(=GM= @ Dec 6 2006, 19:04) Фу-ты, н... Dec 7 2006, 09:18  PhX Получается относительно неплохо :-) Спасибо!
О... Dec 7 2006, 13:28  =GM= Цитата(PhX @ Dec 7 2006, 06:18) Цитата(=G... Dec 7 2006, 13:55
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|