Xenia 38 19 декабря, 2012 Опубликовано 19 декабря, 2012 · Жалоба Программу нужно запустить и выполнить на железе. плата TMS320C5515 Пробовали, в результате полная каша как в голове так и в коде. т.е метод проб изнурительно изучали 2.5 месяца в итоге тока 1 лаба. Раз название демоплаты вам известно, то проще всего набрать в поисковой строке Google заветные слова "usbstk5515 UART" и готовые проекты к вашим услугам. Например, вот этот: Ezdsp 5515 Uart in EZDSP_Sample project - там вообще уже всё сделано. И это не единичная ссылка, Google так таких много даёт. А может быть дело совсем в другом? Как бы это мне помягче выразиться, чтобы меня за это из модераторов не попёрли :). Может бы вы - человек с э... ограниченными возможностями? В смысле ума? И что за вас не напиши, то всё вам будет непонятно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 19 декабря, 2012 Опубликовано 19 декабря, 2012 (изменено) · Жалоба Как бы это мне помягче выразиться, чтобы меня за это из модераторов не попёрли :) Можно методом внушения. ТС, Вас легко загипнотизировать? Пробовали, в результате полная каша как в голове так и в коде. т.е метод проб изнурительно изучали 2.5 месяца в итоге тока 1 лаба. У Вас каша в голове только от того, что Вы одновременно пытаетесь двигать несколько дел. Надо просто послать всех и вся и в первой половине дня уделить внимание этому вопросу. Предварительно выспавшись, не принимая кофе,чай,слабительное и снотворное, чтоб не колбасило смотреть по сторонам. И всё. Изменено 19 декабря, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба Раз название демоплаты вам известно, то проще всего набрать в поисковой строке Google заветные слова "usbstk5515 UART" и готовые проекты к вашим услугам. Например, вот этот: Ezdsp 5515 Uart in EZDSP_Sample project - там вообще уже всё сделано. И это не единичная ссылка, Google так таких много даёт. думаю, поисковиком человек умеет пользоваться, т.к. форум нашел. А может быть дело совсем в другом? дело в том, что конец зачетной недели как конец света (странно, но в этом году даже совпало :) ). все студенты судорожно пытаются сделать то, что не могли сделать за период обучения по причине лени или отсутствия знаний. проконсультироваться с преподавателем было сложно. причин много: видели только на первом занятии, все было элементарно просто или преподаватель решил поиздеваться. Может бы вы - человек с э... ограниченными возможностями? В смысле ума? зачем так жестко. просто в данной области у него мало знаний и это не следствие ограниченности ума. V.V.P.Net, где исходники, т.е. то что Вы пытались сделать? покажите что написано и где возникли вопросы, тогда начнем помогать. иначе предлагаю закрыть тему, т.к. здесь ничего нет по теме, только жалобы на жизнь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба зачем так жестко. Этта ДЗЕН. :) Причем, видимо, со всех сторон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 38 20 декабря, 2012 Опубликовано 20 декабря, 2012 · Жалоба зачем так жестко. просто в данной области у него мало знаний и это не следствие ограниченности ума. Начинающим задания программировать DSP-процессоры не дают. Т.е. задания, как школьникам, так и студентам, обычно выдаются с учётом ранее усвоенного материала. А точнее, того материала, который студент должен был усвоить, если ранее не отлынивал от занятий. А уж тем более речь идет о лабораторных работах, которые закрепляют пройденный материал практически. Сам же листинг готового проекта, взятого из интернета, занимает всего 1-2 печатных странички (не считая хидеров). Чтобы разобраться с ним с нуля, достаточно часа два времени, а не два с половиной месяца. Больше времени может занять отладка и трассировка программы на железе. Это да. Но дело-то в том, что у данного лица вообще никаких заделов нет. Т.е. он даже ознакомиться не пожелал, как UART-регистры у процессора называются, а жаждет сдать от своего имени готовую программу, написанную чем-то другим за деньги. Да я бы, если бы мне такое задание в студенческую пору задали, была бы на 7-ом небе от счастья! Соответственно этому, и мой совет был рассчитан на человека, желающего разобраться в проблеме, а не списать из чужой тетрадки. А когда поняла, в чем дело, от расстройства и сболтнула лишнего. Извиняюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oligarh_93 0 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба Вопрос вот в чем. вектор прерывания немогу написать, чтобы как сработает прерывание, он перескочил по метке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 21 декабря, 2012 Опубликовано 21 декабря, 2012 · Жалоба вектор прерывания немогу написать, чтобы как сработает прерывание, он перескочил по метке. зачем его писать? нужно в нем указать адрес обработчика. Вы поменяли ник? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VVPNET 0 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба зачем его писать? нужно в нем указать адрес обработчика. Вы поменяли ник? НЕТ Само задание по лабораторной. 1) Реализуйте две процедуры обработки прерываний. Первая процедура должна вызываться, если пуст передающий буфер. Она должна проверить, есть ли данные для передачи, если есть – передать. Другая должна вызываться в случае, если в приемном буфере появилось определенное число принятых данных. Она должна переписать данные из буфера в специальный массив. 2) Напишите программу, которая инициализирует процедуры обработки прерываний на прием и передачу 40 байтов данных Вообщем что получилось добиться: Имеется универсальный исходник для 55и54х процессоров. Мне удалось его запустить на процессоре, но он не работоспособный, не выполняет поставленные задачи а зацикливается. main() { int i; volatile unsigned int *PMST=(volatile unsigned int*)0x1D; /* define the PMST reg */ *PMST=0x4020; /* IPTR=0x4000, OVLY=1, DROM=0, MP/MC=0 */ //InitPLL(); /* initialize the DSP Clock to 75MHz (with a 20MHz crystal) */ UARTInit(); /* initialize the McBSP and DMA for UART */ RxCharCnt=0; /* init received char count to 0 */ RxHeadPtr=RxCharBuf; /* init rx head pointer to start of buffer */ RxTailPtr=RxCharBuf; /* init rx tail pointer to start of buffer */ TxHeadPtr=TxCharBuf; /* init tx head pointer to start of buffer */ TxTailPtr=TxCharBuf; /* init tx tail pointer to start of buffer */ UARTStart(0); /* start UART Rx and Tx(begins receiving) */ for(;;) /* infinite loop */ { while(RxCharCnt<TXNUM) /* wait until TXNUM chars received */ for(i=0;i<TXNUM;i++) { *TxHeadPtr++=*RxTailPtr++; /* copy the TXNUM chars to transmit buffer В ЭТОМ МЕСТЕ ПРОИСХОДИТ ЗАЦИКЛИВАНИЕ */ if(RxTailPtr>=(RxCharBuf+BUFSIZE)) RxTailPtr=RxCharBuf; /* keep pointer in circular buffer */ if(TxHeadPtr>=(TxCharBuf+BUFSIZE)) TxHeadPtr=TxCharBuf; /* keep pointer in circular buffer */ } RxCharCnt-=TXNUM; /* reduce number of received chars */ UARTTxChar(*TxTailPtr++); /* kickstart: call UART routine to tx the char */ if(TxTailPtr>=(TxCharBuf+BUFSIZE)) TxTailPtr=TxCharBuf; /* keep pointer in circular buffer */ UARTTxChar(*TxTailPtr++); /* (put 2 chars in buf to get consecutive transmits) */ /* It will transmit these TXNUM chars and then stop */ if(TxTailPtr>=(TxCharBuf+BUFSIZE)) TxTailPtr=TxCharBuf; /* keep pointer in circular buffer */ } } Задача: 1.Проверить на логическую корректность настройки UART в UARTsetup.inc 2.И перевести, что в комментариях а то после электронного переводчика одна каша получается. Так же прикрепил сам проект там очень много всего и описание к нему на английском. ____.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба очень похоже на издевательство. в задании сказано что-то про DMA? в файле с векторами задействовано прерывание от DMA. не надо делать тупой "копи-паст". никто переводить комментарии не будет. попробую на пальцах объяснить: 1. нужно сконфигурировать UART: скорость передачи, разрешить прерывания по опустошению буфера передатчика и по получению байта в приемнике. 2. написать обработчики прерываний для передатчика и приемника. 3. в векторе прерываний указать адреса обработчиков 4. разрешить общие прерывания. в обработчиках прерываний нужно сделать кольцевой буфер. вот как выглядит обработчик для передатчика: 1. прерывание 2. прерывание по опустошению буфера передатчика? если нет, то выход 3. в кольцевом буфере есть данные? если нет, то выход 4. вытащить байт из буфера и отправить на передачу 5. выход из прерывания для того, что бы начать передачу, требуется вытащить первый байт из буфера и отправить на передачу, все остальное сделает обработчик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TSS 0 25 декабря, 2012 Опубликовано 25 декабря, 2012 · Жалоба Вспоминаю как мы сдавали такой предмет, а было это не так давно, 4 года назад. Из всей группы реально чёт понимали человека три, и то не всё. Просто когда этим не занимаешься, очень сложно вникнуть в программирование таких контроллеров. Особенно когда лекции читает человек, ничего не понимающий в программировании этих процов и не знающий язык Си, поэтому лекции посвящаются описанию регистров ядра типа регистров статуса, которые при программировании на Си помогают ничуть не больше чем знание истории отечества. А лабы при этом вёл очень шарящий аспирант, которого понимали единицы. Я помню что реальное осваивание проца пошло когда я в рамках своей бакалаврской стал целыми днями его программировать живьём, и это при том что на лабах был одним из "шарящих" и имел опыт программирования атмелок и 51х на ассемблере. Так что не судите так жёстко студентов, может и вправду ситуация такая. :) Даже на основе готового техасовского примера у студентов не всегда получается создать проект. Ну к примеру чтобы сконфигурировать прерывания УАРТ, студенту помимо конфигурации УАРТа надо догадаться посмотреть структуру контроллера прерываний, определить в каких регистрах какие флаги поставить, посмотреть как это сделать, не забыть о защищённости некоторых регистров, масса всего, и информация часто разбросана по файлам документации, плюс надо рыться в разных примерах, смотреть в какой последовательности что конфигурировать, с первого раза мало кто справится без должного опыта. (сорри если ошибся и что-то из этого не надо делать, работаю с семейством C2000) А когда всё это делается чтобы сдать и забыть, то это вообще жесть для студентов. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
massa 0 25 декабря, 2012 Опубликовано 25 декабря, 2012 · Жалоба А когда всё это делается чтобы сдать и забыть, то это вообще жесть для студентов. :) И отсюда, гениальное решение - если самому студенту всё фиолетово и специальность (т.е. знания) не нужны, то пусть на халяву посторонние дяди (которым этот студент ещё более фиолетов) повкалывают на этого студента. А эти дяди, в своё время, вкалывали самостоятельно. Не искали халявы.Теперь у них эти знания имеются. У этих дядей, своих задач и проблем полно и они продолжают решать эти проблемы, не надеясь на студента, который на халяву их решит. У студента было достаточно времени, чтобы разобраться с задачей, но он пальцем о палец не ударил. Так зачем, если человеку знания не нужны, он пошёл учиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 26 декабря, 2012 Опубликовано 26 декабря, 2012 · Жалоба while(RxCharCnt<TXNUM) /* wait until TXNUM chars received */ for(i=0;i<TXNUM;i++) { *TxHeadPtr++=*RxTailPtr++; /* copy the TXNUM chars to transmit buffer В ЭТОМ МЕСТЕ ПРОИСХОДИТ ЗАЦИКЛИВАНИЕ */ if(RxTailPtr>=(RxCharBuf+BUFSIZE)) RxTailPtr=RxCharBuf; /* keep pointer in circular buffer */ if(TxHeadPtr>=(TxCharBuf+BUFSIZE)) TxHeadPtr=TxCharBuf; /* keep pointer in circular buffer */ } Здесь получается два вложеных цикла, и в верхнем (while) есть такая переменная RxCharCnt, которая в теле цикла никак не изменяется - вот вам и зацикливание!! Видимо где-то что-то забыто - или изменение переменной или скобки или кавычки! Может быть RxCharCnt изменяется где-то еще, например, в прерывании, но по коду это не видно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetalzzz 0 26 декабря, 2012 Опубликовано 26 декабря, 2012 · Жалоба Здравствуйте. У меня проблема такого же характера(тоже TMS320C5515, тоже прерывания). нуждаюсь в консультации знающих людей. как я понимаю прерывание у меня срабатывает, однако прыгает непонять в какой адрес. как я понял перескакивает в зависимости от значения в регистре IVPH(указатель на вектор прерываний. судя по документации в случае прерывания он перескакивает именно по этому адресу, в поисках вектора прерываний. Однако как было сказано выше прописываю одно значение, переходит по другому)..в дисасемблере видно что он зацикливается перейдя по этому адресу..перелопатил пол интернета в поисках разъяснений, но так ничего и не нарыл..откликнувшимся буду благодарен. далее приведу фрагменты кода программы. ////-----------main.c-------------------- extern void initmac(void); interrupt void UARTint() /* функция обработки прерываний*/ { int i; if(UART_IIR==0xC4) { for(i=0;i<8;i++) { output[z+i]=UART_RBR; } } else if (UART_IIR==0xC2) { for(i=0;i<8;i++) { UART_THR=input[t+i]; } } } void clearreg() { IVPD=0x2000; //IVPH=0xffff; UART_LCR=0x0; UART_DLL=0x0; UART_LCR=0x00; UART_IIR=0x0; UART_FCR=0x00; UART_FCR=0x0; UART_MCR=0x00; UART_IER=0x00; UART_PWREMU_MGMT = 0x0; IFR0=0x0; DBIER0=0x00; } main() { int i; clearreg(); IER0=0x40; UART_LCR=0x80; UART_DLL=0x1; UART_LCR=0x03; UART_IIR=0xC1; UART_FCR=0x07; UART_FCR=0x41; UART_MCR=0x10; UART_IER=0x02; UART_PWREMU_MGMT = 0x6001; UART_FCR=0x07; initmac(); for(i=0;i<8;i++) {while(!(UART_LSR & 0x20)); UART_THR=input[i]; } for(;;) /* infinite loop */ {} } //-------------------------------------------------uart.asm .def _initmac _initmac: ;stm #SPCR2,SPSA BSET #9,ST1_55 ;disable overflow MOV #0,DP ;set dp MOV #55,AC0 ;set AC0 BCLR #11,ST1_55 ;enable ints return exit //---------------------------------------------------vector.asm .mmregs .sect "vecs" .ref _c_int00 .ref _UARTint ResetVector: ; Reset Vector b _c_int00 nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b _UARTint nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b $ nop nop b _interrupt_cpu nop nop b _interrupt_cpu nop nop b $ nop nop b $ nop nop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба 1. http://www.ti.com/lit/ug/sprufx5d/sprufx5d.pdf 2. Absolute addresses of the interrupt vector locations are determined by the contents of the IVPD and IVPH registers. Interrupt vectors for interrupts 0-15 and 24-31 are relative to IVPD. Interrupt vectors for interrupts 16-23 are relative to IVPH. (page 54) 3. Table 1-32. Interrupt Table для uart какой номер прерывания? а у Вас в asm под каким номером? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetalzzz 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба хм..да действительно, не туда написал, но я пробовал в каждой строчке прописать "b UARTint"..я пробовал ставить точку остановки в векторе, и он на нее не попадает..такое чувство, что вектор не прописан..но в IVPD адрес прописал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться