rezident 0 18 мая, 2008 Опубликовано 18 мая, 2008 · Жалоба Пришлось скачать даташит. Угу. MCU 32-битный, но у него Гарвардская, а не фон Немановская архитектура. Так что нечетные адреса периферии вполне имеют право существовать. Но насколько правомочно при этом использовать 32-х битный int при обращении к 16-и битным периферийным регистрам? Это вопрос для меня не совсем ясный. Может все же 16-и битный unsigned char для этого корректнее было бы использовать? Думаю что при обращении с помощью int к нечетным 16-и битным адресам компилятор может автоматически оптимизировать, выравнивая их на границу 32-х битного слова. Поэтому и происходит промашка с адресацией регистров. Попробуйте все же char использовать. Про резервирование таймера. Везде указано, что только Timer2 зарезервирован для DSP/BIOS. Где вы про резервирование Timer1 увидели? Кстати, при внимательном рассматривании таблицы адресов видно, что все 32-х разрядные регистры таймеров расположены по четным адресам. По нечетным расположены только 16-и битные "половинки" этих регистров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 18 мая, 2008 Опубликовано 18 мая, 2008 · Жалоба Но насколько правомочно при этом использовать 32-х битный int при обращении к 16-и битным периферийным регистрам? Это вопрос для меня не совсем ясный. Может все же 16-и битный unsigned char для этого корректнее было бы использовать? Думаю что при обращении с помощью int к нечетным 16-и битным адресам компилятор может автоматически оптимизировать, выравнивая их на границу 32-х битного слова. Во первых, на скриншоте виден асм код. Адреса там именно те, которые нужно. Во вторых, unsigned int 16ти битный. А вот char обычно 8ми, это в CCS он 16ти битный, что тоже вписывается в стандарт. Везде указано, что только Timer2 зарезервирован для DSP/BIOS. Где вы про резервирование Timer1 увидели? Дока TMS320x2833x, 2823x System Control and Interrupts see page 132 Кстати, при внимательном рассматривании таблицы адресов видно, что все 32-х разрядные регистры таймеров расположены по четным адресам. По нечетным расположены только 16-и битные "половинки" этих регистров. Для объединения некоторых с их половинками, я и использовал unsigned long, который уже 32х битный. Проблема в том, что я пишу в TIMER2TCR с адресом 0x0C14(чётный!!!!)! Но почему-то значение TIMER2TPR с адресом 0x0C16(тоже чётный) получается равным тому-же TIMER2TCR! При присвоении TIMER2TPR=0 - ничего не происходит. А мне нужно, чтобы в нём был именно 0! Иначе ниего не работает. В этом и состоит суть проблемы. Пожалуйста внимательнее почитайте мой пост и посмотрите скриншот. По нему видно, что компилятор использует именно те адреса, которые нужно - но всё равно ничего не происходит и регистры дублируются!!!! Я считаю, что это либо ошибка документации, либо самого чипа..Хотя верить в это не хочется! Нужен взгляд со стороны. Может я действительно что-то упустил!?!?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PhX 0 19 мая, 2008 Опубликовано 19 мая, 2008 · Жалоба Если использовать #define аппарат, то документированное объявление регистров выглядит следующим образом (SPRAA85A): #define DEF_REG (volatile Unit16 *) 0x5A5A // 0x5A5A Def_reg register Да и вообще зачем этот #define аппарат, неужели в TI еще lib с битовыми полями под Ваш проц не выпустили? Нет. Посмотрел. Выпустили: sprc530 Качайте смотрите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PhX 0 19 мая, 2008 Опубликовано 19 мая, 2008 (изменено) · Жалоба Вообще-то у Вас вроде все легально (относительно C) написано. Однако смотрю пример из либов от TI там // Initialize timer period to maximum: CpuTimer1Regs.PRD.all = 0xFFFFFFFF; CpuTimer2Regs.PRD.all = 0xFFFFFFFF; // Make sure timers are stopped: CpuTimer1Regs.TCR.bit.TSS = 1; CpuTimer2Regs.TCR.bit.TSS = 1; // Reload all counter register with period value: CpuTimer1Regs.TCR.bit.TRB = 1; CpuTimer2Regs.TCR.bit.TRB = 1; Смотрите третью строчку снизу. Иными словами сначала уст. период, затем делаем релоад. Хотя, опять поторопился похоже... Все у Вас вроде тип топ. Смущает только то, что вы обращаетесь к PRD по 16 битным половинкам. Изменено 19 мая, 2008 пользователем PhX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PhX 0 19 мая, 2008 Опубликовано 19 мая, 2008 (изменено) · Жалоба Проверил. На 2812 все нормально работает. Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей. timers.zip Изменено 19 мая, 2008 пользователем PhX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 19 мая, 2008 Опубликовано 19 мая, 2008 · Жалоба Проверил. На 2812 все нормально работает. Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей. Всё дело в том, что timer0 работает отлично! И именно с таким-же подходом к нему! timers.c void _InitCpuTimer(int tmr) //Инициализирует соответствующий таймер { // CPU Timer 0 if(tmr==0){ // Период на максимум TIMER0PRD32 =0xFFFFFFFF; //Частоту SYSCLKOUT пока далить не на что не будем TIMER0TPR=0; TIMER0TPRH=0; //Таймер пока должен стоять! TIMER0TCR|=BIT4; //TSS в еденицу! //Перезагрузить регистры таймера(применить вышепроведенные настройки) TIMER0TCR|=BIT5; //TRB = 1 #ifdef DEBUGMD TIMER0TCR&=BIT10+BIT11 ^ 0xFFFF; //Поставим в HARD STOP режим #endif } if(tmr==1){ // Период на максимум TIMER1PRD32 =0xFFFFFFFF; //Частоту SYSCLKOUT пока далить не на что не будем TIMER1TPR=0; TIMER1TPRH=0; //Таймер пока должен стоять! TIMER1TCR|=BIT4; //TSS в еденицу! //Перезагрузить регистры таймера(применить вышепроведенные настройки) TIMER1TCR|=BIT5; //TRB = 1 #ifdef DEBUGMD TIMER1TCR&=BIT10+BIT11 ^ 0xFFFF; //HARD STOP #endif } if(tmr==2){ // Период на максимум TIMER2PRD32 =0xFFFFFFFF; // TIMER2PRDH=0xFFFF; //Частоту SYSCLKOUT пока далить не на что не будем TIMER2TPR=0; TIMER2TPRH=0; //Таймер пока должен стоять! TIMER2TCR|=BIT4; //TSS в еденицу! //Перезагрузить регистры таймера(применить вышепроведенные настройки) TIMER2TCR|=BIT5; //TRB = 1 TIMER2TPR=0; // [b]а это для проверки[/b] но он всё равно не хочет быть 0 #ifdef DEBUGMD TIMER2TCR&=BIT10+BIT11 ^ 0xFFFF; //HARD STOP #endif } } Битовые поля не использую, можно сказать, из религиозных соображений :) Ваш пример у меня работает. watch показывает, что всё хорошо. Странно всё это. Буду копать дальше...в чём может быть дело..... Просто я в #define делаю разименование указателя, а у вас по тексту * ставится. Разницы быть не должно никакой, но я попробую и так... Вроде асм код ведь нормальный генерится! Почему-же не работает-то?!?! Вот что напрягает! Все у Вас вроде тип топ. Смущает только то, что вы обращаетесь к PRD по 16 битным половинкам. Да нет же. Я PRD наоборот объявил как unsigned long и обозвал его TIMER2PRD32, чтоб не маяться с половинками. TIMER2TPR(TIMER2TPRH) мне не нужны - я их оставил int'ами.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Проверил. На 2812 все нормально работает. Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей. Я ничего не понимаю :05: ПОСМОТРИТЕ НА ЭТО БЕЗОБРАЗИЕ! Когда создаю новый проект(или открываю пример) - всё работает! Как только всё то-же самое проделываю в существующем проекте, то вообще ничего не фурычит )) Даже уже первым оператором в main() поставил присвоение - и всё равно результат потрясает! В других регистрах устойчиво наблюдаются значения, которые с ходом программы как-то магически меняются(но не часто). Результат воспроизводится - т.е. в одном и том-же месте в программе, значения регистров не меняются во время разных прогонов. HEEEELP!!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Скриншот окна симулятора или эмулятора? Т.е. это результат работы в железе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Конечно в железе! Причем я же говорю - это проявляется только на этом проекте. Я уже build options все перепроверил, codeStartBranch.asm стандартный, далее main() и на тебе! Нужно как-то разобраться со всем этим. Могу выложить доп. скрины, .map, исходники - всё, что нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Ну раз только в этом проекте, то ищите у себя в программе ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PhX 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба Да дался Вам этот нулевой бит в TIMERxTCR. В http://www.ti.com/litv/pdf/sprufb0a черным по белому написано: с 3-го по 0-й бит reserved, это значит тьфу на них пусть с ними железяка че хочет то и делает, нам на это наплевать, она же вам четвертый бит не меняет, таймер в стопе, что еще нужно-то. :) Анекдот в тему: Сын подходит к отцу програмеру. Отец находится в крутом дебаге. Сын - "Пап, а почему солнце встает всегда на востоке?". Папа - "Точно всегда...? Точно на востоке...?". Сын - "Да". Папа - "Значит все работает нормально, ничего сынок не трогай.". Изменено 20 мая, 2008 пользователем PhX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Анегдот классный. Про то, что с нулевого по третий reserved - я как-то не подумал. Значит на данный момент ситуация такая: если всё делать в самом начале, в main() - всё работает. Если в функции timerInit - не работает. В регистрах(через один) одинаковое значение, которое не выбить ничем. Конечно, я буду проверять, но какие могут быть ошибки? Сами регистры задефайнены в одном хидере и просто используются в разных местах... При этом timer0 работает нормально, а timer1 и 2 не хотят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PhX 0 21 мая, 2008 Опубликовано 21 мая, 2008 · Жалоба Значит на данный момент ситуация такая: если всё делать в самом начале, в main() - всё работает. Если в функции timerInit - не работает. В регистрах(через один) одинаковое значение, которое не выбить ничем. Конечно, я буду проверять, но какие могут быть ошибки? Сами регистры задефайнены в одном хидере и просто используются в разных местах... При этом timer0 работает нормально, а timer1 и 2 не хотят. Выложите все файлы проекта в архиве. Поглядим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба Разобрался. У меня в проекте, отключаются клоки ненужной переферии. В этот список попали и таймеры 1 и 2. Включил - всё заработало! ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться