Перейти к содержанию
    

Программу нужно запустить и выполнить на железе.

плата TMS320C5515

Пробовали, в результате полная каша как в голове так и в коде. т.е метод проб изнурительно изучали 2.5 месяца в итоге тока 1 лаба.

 

Раз название демоплаты вам известно, то проще всего набрать в поисковой строке Google заветные слова "usbstk5515 UART" и готовые проекты к вашим услугам. Например, вот этот: Ezdsp 5515 Uart in EZDSP_Sample project - там вообще уже всё сделано. И это не единичная ссылка, Google так таких много даёт.

 

А может быть дело совсем в другом? Как бы это мне помягче выразиться, чтобы меня за это из модераторов не попёрли :). Может бы вы - человек с э... ограниченными возможностями? В смысле ума? И что за вас не напиши, то всё вам будет непонятно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как бы это мне помягче выразиться, чтобы меня за это из модераторов не попёрли :)

Можно методом внушения.

ТС, Вас легко загипнотизировать?

Пробовали, в результате полная каша как в голове так и в коде. т.е метод проб изнурительно изучали 2.5 месяца в итоге тока 1 лаба.

У Вас каша в голове только от того, что Вы одновременно пытаетесь двигать несколько дел. Надо просто послать всех и вся и в первой половине дня уделить внимание этому вопросу. Предварительно выспавшись, не принимая кофе,чай,слабительное и снотворное, чтоб не колбасило смотреть по сторонам. И всё.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз название демоплаты вам известно, то проще всего набрать в поисковой строке Google заветные слова "usbstk5515 UART" и готовые проекты к вашим услугам. Например, вот этот: Ezdsp 5515 Uart in EZDSP_Sample project - там вообще уже всё сделано. И это не единичная ссылка, Google так таких много даёт.

думаю, поисковиком человек умеет пользоваться, т.к. форум нашел.

А может быть дело совсем в другом?

дело в том, что конец зачетной недели как конец света (странно, но в этом году даже совпало :) ). все студенты судорожно пытаются сделать то, что не могли сделать за период обучения по причине лени или отсутствия знаний.

проконсультироваться с преподавателем было сложно. причин много: видели только на первом занятии, все было элементарно просто или преподаватель решил поиздеваться.

Может бы вы - человек с э... ограниченными возможностями? В смысле ума?

зачем так жестко. просто в данной области у него мало знаний и это не следствие ограниченности ума.

V.V.P.Net, где исходники, т.е. то что Вы пытались сделать? покажите что написано и где возникли вопросы, тогда начнем помогать. иначе предлагаю закрыть тему, т.к. здесь ничего нет по теме, только жалобы на жизнь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем так жестко. просто в данной области у него мало знаний и это не следствие ограниченности ума.

 

Начинающим задания программировать DSP-процессоры не дают. Т.е. задания, как школьникам, так и студентам, обычно выдаются с учётом ранее усвоенного материала. А точнее, того материала, который студент должен был усвоить, если ранее не отлынивал от занятий. А уж тем более речь идет о лабораторных работах, которые закрепляют пройденный материал практически.

 

Сам же листинг готового проекта, взятого из интернета, занимает всего 1-2 печатных странички (не считая хидеров). Чтобы разобраться с ним с нуля, достаточно часа два времени, а не два с половиной месяца. Больше времени может занять отладка и трассировка программы на железе. Это да. Но дело-то в том, что у данного лица вообще никаких заделов нет. Т.е. он даже ознакомиться не пожелал, как UART-регистры у процессора называются, а жаждет сдать от своего имени готовую программу, написанную чем-то другим за деньги. Да я бы, если бы мне такое задание в студенческую пору задали, была бы на 7-ом небе от счастья!

 

Соответственно этому, и мой совет был рассчитан на человека, желающего разобраться в проблеме, а не списать из чужой тетрадки. А когда поняла, в чем дело, от расстройства и сболтнула лишнего. Извиняюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос вот в чем. вектор прерывания немогу написать, чтобы как сработает прерывание, он перескочил по метке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вектор прерывания немогу написать, чтобы как сработает прерывание, он перескочил по метке.

зачем его писать? нужно в нем указать адрес обработчика.

 

Вы поменяли ник?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем его писать? нужно в нем указать адрес обработчика.

 

Вы поменяли ник?

НЕТ

Само задание по лабораторной.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

очень похоже на издевательство.

в задании сказано что-то про DMA? в файле с векторами задействовано прерывание от DMA.

 

не надо делать тупой "копи-паст". никто переводить комментарии не будет.

 

попробую на пальцах объяснить:

1. нужно сконфигурировать UART: скорость передачи, разрешить прерывания по опустошению буфера передатчика и по получению байта в приемнике.

2. написать обработчики прерываний для передатчика и приемника.

3. в векторе прерываний указать адреса обработчиков

4. разрешить общие прерывания.

 

в обработчиках прерываний нужно сделать кольцевой буфер.

вот как выглядит обработчик для передатчика:

1. прерывание

2. прерывание по опустошению буфера передатчика? если нет, то выход

3. в кольцевом буфере есть данные? если нет, то выход

4. вытащить байт из буфера и отправить на передачу

5. выход из прерывания

 

для того, что бы начать передачу, требуется вытащить первый байт из буфера и отправить на передачу, все остальное сделает обработчик

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вспоминаю как мы сдавали такой предмет, а было это не так давно, 4 года назад.

Из всей группы реально чёт понимали человека три, и то не всё.

Просто когда этим не занимаешься, очень сложно вникнуть в программирование таких контроллеров.

Особенно когда лекции читает человек, ничего не понимающий в программировании этих процов и не знающий язык Си, поэтому лекции посвящаются описанию регистров ядра типа регистров статуса, которые при программировании на Си помогают ничуть не больше чем знание истории отечества.

А лабы при этом вёл очень шарящий аспирант, которого понимали единицы.

 

Я помню что реальное осваивание проца пошло когда я в рамках своей бакалаврской стал целыми днями его программировать живьём, и это при том что на лабах был одним из "шарящих" и имел опыт программирования атмелок и 51х на ассемблере.

 

Так что не судите так жёстко студентов, может и вправду ситуация такая. :)

 

Даже на основе готового техасовского примера у студентов не всегда получается создать проект.

 

Ну к примеру чтобы сконфигурировать прерывания УАРТ, студенту помимо конфигурации УАРТа надо догадаться посмотреть структуру контроллера прерываний, определить в каких регистрах какие флаги поставить, посмотреть как это сделать, не забыть о защищённости некоторых регистров, масса всего, и информация часто разбросана по файлам документации, плюс надо рыться в разных примерах, смотреть в какой последовательности что конфигурировать, с первого раза мало кто справится без должного опыта. (сорри если ошибся и что-то из этого не надо делать, работаю с семейством C2000)

 

А когда всё это делается чтобы сдать и забыть, то это вообще жесть для студентов. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А когда всё это делается чтобы сдать и забыть, то это вообще жесть для студентов. :)

 

И отсюда, гениальное решение - если самому студенту всё фиолетово и специальность (т.е. знания) не нужны, то пусть на халяву посторонние дяди (которым этот студент ещё более фиолетов) повкалывают на этого студента. А эти дяди, в своё время, вкалывали самостоятельно. Не искали халявы.Теперь у них эти знания имеются. У этих дядей, своих задач и проблем полно и они продолжают решать эти проблемы, не надеясь на студента, который на халяву их решит.

 

У студента было достаточно времени, чтобы разобраться с задачей, но он пальцем о палец не ударил. Так зачем, если человеку знания не нужны, он пошёл учиться?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 
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 изменяется где-то еще, например, в прерывании, но по коду это не видно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

У меня проблема такого же характера(тоже 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

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 под каким номером?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хм..да действительно, не туда написал, но я пробовал в каждой строчке прописать "b UARTint"..я пробовал ставить точку остановки в векторе, и он на нее не попадает..такое чувство, что вектор не прописан..но в IVPD адрес прописал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...