Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с ADC ATTINY461
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
__nik__
Столкнулся с тем, что часть программы, работавшая на M8, ATTINY26, m8535 отказывается работать на тани461, а именно п/п измерения фазы(полпериуда).
При изучении выяснилось проблема кроется в работе АЦП.
Проблема:
Как оказалось, АЦП работает как хочет, хочет в середине фазы выдаст значение =0, или, при отсутствии сигнала может выдать большое значение(выше обычного шума) из-за чего происходит ошибка в показании прибора.
но вышесказанное это вообще ничто, по сравнению с тем, что иногда (всегда по разному) за определенное количество ацп преабразований выдает их сумма равняется 0, что вообще не понятно.
Во время работы ацп, прерывания запрещаются и сканирование каналов не происходит, на время тестов это отключено, таким образом измеряем только один канал с внешним опорником на 4.096в.

если кто нибудь встречался с данной проблеммой, то посоветуйте как ее решить.
Условия работы и измерений:
Еще, скорость АЦП никак не влияет, синал 100% во время измерений присутствеут, контролировалось по осцилографу, макс сигнал составлял в пике ~2.3 вольта.
GDI
Эррата ничего на эту тему не говорит?
smk
Первое, что приходит на ум так это посмотреть как соединены земли ИОН, АЦП и источника сигнала. А что, например, будет если закороить вход (сигнал всегда = 0)? А на AREF конденсатор цеплять не пробовали?

Попробуйте еще вход АЦП соединить с землей через резистор 10 мОм.
ArtemKAD
А какие уровни сигналов на остальных ногах по отношению к напряжению питания?
__nik__
to GDI
ерата молчит. там по идее проблемм не должно быть

to smk
земли у всех общие.

to ArtemKAD
все остальное питается от одного стабилизатора, напряжения на всех портах не выходит за 5в
__nik__
Результаты проверки:
Программа заливалась в ATTINY26(откуда изначально и была взята) работает стабильно и без проблем, заливка происходила как с перекомпиляцией и настройкой под нее так и в тупую скомпилированная под ATTINY261 и ATTINY461 работала во всех 3х случаях стабильно.
Таже программа без изменений заливалась в ATTINY461 начинала сходить с ума, что еще более загадочно, на другом компиляторе сделали только часть измерения с выводом в уарт(без изменения схемы) все работает вроде нормально. родилось предположение, что возможно компилятор, но я как то сомниваюсь, прога бы не смогла отработь даже одного цикла.
AlexG_changed
Цитата(__nik__ @ Dec 25 2007, 22:58) *


Думаю, вам надо внимательно изучить этот документ:
AVR504: Migrating from ATtiny26 to ATtiny261/461/861

Перенос на другой контроллер обычно не ограничивается простой перекомпиляцией, что-то вы не учли.
__nik__
to AlexG
Цитата
часть программы, работавшая на M8, ATTINY26, m8535

часть программы, не обозначает что именно эту часть нужно исправлять, я извиняюсь, но иар не даст вам просто так перекомпилить программу TINY26 на TINY461, хотябы без малейшего изменения имени регистров, что как следствие несет за собой хотябы поверхностное чтение даташита. В указанном вами документе нет ничего путного кроме переименования регистров, указания на размер стека, и некоторого отличия регистров АЦП, которое в даташите и так описано намного лучше, там смотреть нечего. Разница в АЦП не используется, автотриггер мне не нужен, он придуман для медленно изменяющихся сигналов, тк переключение канала возможно только при не измеряющем АЦП (до его запуска) и после этого нужно делать 4 NOP иначе наизмеряет полный бред.
повторяю, измеряется 1 канал, есть прерывание по которому данные передают на другую плату.
товарищи, те которые всевремя пишут смотри даташит, такое ощущение что вы сами их не читаете, так что перестанте писать такую ахинею или цитируйте конкретное место, ссылка на сам документ на мой взгляд является отпиской.

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

появилось предположение что что то с контроллером прерываний не так, но это я проверю завтра...
__nik__
На данный момент обнаружил глюк иара, по какой причине выяснить не смог, пока что.
Суть примерно такая,
long Summ;
unsigned int acvant;
return (Summ/acvant*419.0/468.0);
ошибка возникает при умножении, почему-то при умножении числа на константу на выходе получаем 0 глазам не верил когда смотрел на это, подставлял данные в софт дебугер, все правлильно считает.
при дкбуге через dWare видел все тоже что описывал выше, единстевнное, один раз получилось сей глюк обойти простым переносом acvant в голбальные переменные, все исчезло и работало как положено в течении 2х часов, сегодня все теже глюки...
mdmitry
Цитата(__nik__ @ Dec 27 2007, 20:37) *
Суть примерно такая,
long Summ;
unsigned int acvant;
return (Summ/acvant*419.0/468.0);
ошибка возникает при умножении, почему-то при умножении числа на константу на выходе получаем 0 глазам не верил когда смотрел на это, подставлял данные в софт дебугер, все правлильно

return какого типа?
Подумайте, пожалуйста, о преобразовании типов при расчете.
sergik_vrn
Цитата(__nik__ @ Dec 27 2007, 20:37) *
На данный момент обнаружил глюк иара, по какой причине выяснить не смог, пока что.
Суть примерно такая,
long Summ;
unsigned int acvant;
return (Summ/acvant*419.0/468.0);
ошибка возникает при умножении, почему-то при умножении числа на константу на выходе получаем 0 глазам не верил когда смотрел на это, подставлял данные в софт дебугер, все правлильно считает.
при дкбуге через dWare видел все тоже что описывал выше, единстевнное, один раз получилось сей глюк обойти простым переносом acvant в голбальные переменные, все исчезло и работало как положено в течении 2х часов, сегодня все теже глюки...

чтобы что-то конкретное сказать нужна цитата из кода, а не примерный пересказ
__nik__
Место глюка нашел при помощи AVR Dragon, он оказался в умножении с точкой ( * 419.0)
на что умножать не важно, результат всегда равен 0. Если убрать запятую, то считает верно но для меня недостоточно точно. Столкнулся еще с тем что не могу скорость АЦП переключить, это как то похоже это как то связано с иаром 4.21А.
еще раз хочу обратить внимание что таже программа работает в тани26....
SasaVitebsk
Цитата(__nik__ @ Dec 30 2007, 01:43) *
еще раз хочу обратить внимание что таже программа работает в тани26....

Вы сами себе противоречите, уважаемый. Значит не та же программа. Если бы ошибка, которая у вас явно присутствует и которую вы вначале списали на камень, а потом на IAR, происходила при обращении к оборудованию, то я бы поверил. Возможно файл объявлений ошибочный или даже проблемы с оборудованием каким то. Но ошибка, возникающая при умножении с использованием плавающей запятой (то есть данный кусок раскладывается в 2 десятка простых комманд) - не поверю.

Настораживает также упоминание вами прерывания и "случайности" ошибки.

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

Для ясности приведу два примера.

1) Пример с регистрами I/O
В голове находится следующая строчка
PORTL |= 1;
Компильнётся примерно в следующее
lds r16,portl
ori r16,1
sts portl,r16

В прерывании следующая строчка
PORTL |= 2;

А теперь посмотрите внимательно. Если прерывание придёт во время исполнения команды ori при этом бит D1 порта L в это время будет равен 0, то произойдёт следующее. В прерывании бит 1 будет установлен в 1, но сразу по выходу из прерывания он опять сбросится в 0. И вы будете в непонятках так как в голове вы с этим битом не работаете.

2) Пример с переменными
В голове находится следующие строчки
volatile uint16_t i,j;
if(i<j)...
Представим себе что i=0x1f, а j=0x23. Очевидно, что условие должно выполниться. Учитывая что переменные 16 бит, то сама операция пройдёт в 2 этапа

В прерывании следующая строчка
i++;

Представим, что прерывание произойдёт м/у сравнениями младших и старших байтов. Тогда первое сравнение будет F c 3. Потом идёт прерывание где i становится 0x20 и идёт сравнение 2 с 1. Результат - условие выполняться не будет. У вас возникнет ошибка.

Примечание: IAR пытается бороться с такими ситуациями путём предварительной пересылки регистровой пары, а потом уж самой операции. Но это я так для примера привёл. Так как если операнд 4 байта, то и это уже не спасает от потенциальной ошибки.


Проявляться такая ошибка будет крайне нерегулярно, так как необходимо:
a) прерывание в "нужном" месте
б) модификация "нужной переменной" или появление "нужного значения" переменной.

Всё это я к тому, что сама ошибка может находится совершенно не в том месте где вы её ищете, а проявляться в "давно вылизанной" части программы. И даже при внесении изменений в произвольное место менять своё поведение.
__nik__
Цитата(SasaVitebsk @ Dec 30 2007, 02:09) *
Вы сами себе противоречите, уважаемый. Значит не та же программа. Если бы ошибка, которая у вас явно присутствует и которую вы вначале списали на камень, а потом на IAR, происходила при обращении к оборудованию, то я бы поверил. Возможно файл объявлений ошибочный или даже проблемы с оборудованием каким то. Но ошибка, возникающая при умножении с использованием плавающей запятой (то есть данный кусок раскладывается в 2 десятка простых комманд) - не поверю.

Настораживает также упоминание вами прерывания и "случайности" ошибки.

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

Уважаемый, я кажется раз 5 уже писал что прерывания запрещены, да и происходят они ~7 раз в секунду, только в нужныж мне местах, и только для передачи информации на второй процессор.
Цитата
Для ясности приведу два примера.
1) Пример с регистрами I/O
В голове находится следующая строчка
PORTL |= 1;
Компильнётся примерно в следующее
lds r16,portl
ori r16,1
sts portl,r16

извиняюсь, я пользуюсь
PORTX_BitY=1;
что интерпритируется как:
SBI PORTX,Y
и если вы будете использовать (X<<Y), то это облегчит жизнь компилятору и программу на пару байт так как будет использовать лишь одну мнемонику вместо 3х
Цитата
В прерывании следующая строчка
PORTL |= 2;

А теперь посмотрите внимательно. Если прерывание придёт во время исполнения команды ori при этом бит D1 порта L в это время будет равен 0, то произойдёт следующее. В прерывании бит 1 будет установлен в 1, но сразу по выходу из прерывания он опять сбросится в 0. И вы будете в непонятках так как в голове вы с этим битом не работаете.

поверьте, в голове я могу разобратся с многим, ибо 6 лет проработал без отладчиков и разбирался с проблеммани такими какие вам и не снились и по теории работы электроники быть просто не могут, не нужно судить о других по собственным знаниям.
Цитата
2) Пример с переменными
В голове находится следующие строчки
volatile uint16_t i,j;
if(i<j)...
Представим себе что i=0x1f, а j=0x23. Очевидно, что условие должно выполниться. Учитывая что переменные 16 бит, то сама операция пройдёт в 2 этапа

В прерывании следующая строчка
i++;

Представим, что прерывание произойдёт м/у сравнениями младших и старших байтов. Тогда первое сравнение будет F c 3. Потом идёт прерывание где i становится 0x20 и идёт сравнение 2 с 1. Результат - условие выполняться не будет. У вас возникнет ошибка.

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

Цитата
Примечание: IAR пытается бороться с такими ситуациями путём предварительной пересылки регистровой пары, а потом уж самой операции. Но это я так для примера привёл. Так как если операнд 4 байта, то и это уже не спасает от потенциальной ошибки.
Проявляться такая ошибка будет крайне нерегулярно, так как необходимо:
a) прерывание в "нужном" месте
б) модификация "нужной переменной" или появление "нужного значения" переменной.

ИАР может и пытается, но при максимальном уровне оптимизации он на все плюет, и если вы посмотрите на код который он сгенерил, то обнаружите что половина того что вы написали он попросту либо соединил в одну строчку, либо удалилю Вот такой он загадочный, и чтобы писать на С а не на АСМ время зависимые подпрограммы, приходится его порядком поубеждать чтобы он не своевольничал и не удалял то что его не просят, и тем более не уменьшал разрядность в математике, именно для этого и вводилось чтобы он использовал математику с точкой принудительно, не знаю это его ошибка или нет, но при float = Long/conct он не использует математику с точкой при максимальной оптимизации.

Цитата
Всё это я к тому, что сама ошибка может находится совершенно не в том месте где вы её ищете, а проявляться в "давно вылизанной" части программы. И даже при внесении изменений в произвольное место менять своё поведение.

Вот с этим я пожалуй пока не соглашусь, и даже думаю выложу либо скрины либо видео с экрана того что происходит, но вот только как дракон нам по гарантии поменяют. Ошибка именно в * , я думаю не в самом умножении а гдето при пересылки данных, потому как начальные действия делает верно.
Утверждения на данный момент были сделаны при помощи АВР Дракон, правда он отработал всего сутки потом начал сажать питание испытуемой платы с нагревом 8ногой микрухи рядом с Мега128 на ней написано AHT). пришлось исследования свернуть и заменить * на /, правда точность жутко упала почемуто.
SasaVitebsk
Цитата(__nik__ @ Dec 30 2007, 19:25) *
извиняюсь, я пользуюсь
PORTX_BitY=1;
что интерпритируется как:
SBI PORTX,Y
и если вы будете использовать (X<<Y), то это облегчит жизнь компилятору и программу на пару байт так как будет использовать лишь одну мнемонику вместо 3х

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


Если бы вы были внимательнее, то учитывая ваши 6 лет, вы бы заметили, что я специально применил PORTL, а не PORTA к примеру. Компилятор не сможет компильнуть SBI, так как для этого порта данная инструкция недопустима. Я, естественно, использую (X<<Y). А пример - есть пример. Я его максимально упростил для вас. Я имел ввиду саму проблему. А примеры использовал максимально доступные для понимания. Совершенно очевидно, что такая ошибка может возникать на любых портах в верхней части.

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

С другой стороны объясните мне тупому, следующий момент. Представим что код скомпилированный компилятором ошибочен. (Вернее сказать вы получили не совсем то, что хотели получить). Так вот вопрос. Как ошибочный результирующий код может выдавать ошибку не каждый раз?


Я пользуюсь IAR. Использую практически всегда максимальную оптимизацию по скорости. Пока не сталкивался с глюками, по вине компилятора. Очень многие вам сообщат то же самое. Хотя, врать не буду, по роду деятельности флоат практически не применяю.
__nik__
to SasaVitebsk
извиняюсь за резкий то, но насамом деле про то что все начнут говорить о прерываниях я заранее учел и написал в самом оглавлении темы.
Некая огрессивность связана с тем что некая часть людей, толи для набора постов , толи просто от желания поумничать ссылаются на разные вещи, вечьма и весьма очевидные, которые к делу отношения не имеют, как то:
-перывания-- они запрещены
-переполнения стека-- его размер был достаточен для тн26 и был увеличен для 461
-перехваат регистров-- при запрете прерываний это весьма проблепатично, так как никто кроме исполняемого кода не имеет доступа к ним
-переполнение регистра-- число long и в начале делится, а затем умножается и в момент умножения получается 0, что дальше не важно, с нулем что не делай все одно 0.
это естественно перед написанием я проверил и, если честно не один раз, там устройство пакостное, потребители оспользуют его где попало, при этом ссылаясь на других производителей и говорят что все у других работает, к нам приносили пару устройств, зами же заказчики, разбирался, выяснялось что у них ну не все так как они пишут. Я искал то с чем я столкнулся и с чем я старательно боролся в своих, у всех по разному, кто то сразу вешался, кто то маскировал ошибки.
прибор работает в жутких условиях, пользователи слово фильтр даже не знают и то что его нужно применять темболее, ну ко всему еще порой просто убитый пускатель стоит, который порой работает тоже не плохим генератором шума, и тп. Проблем много, те что можем предположить стараемся учесть, те что не можем, работаем с потребителем, чтоб прибор мог работать практически в любых условиях.
Вот и в данный раз, тн26 забита под завязку, а исправить то что вылезло у единственного заказчика не вышло, и странно то, что 4 шт стоит рябом и работет, а 5й вылетает, что только не делали...
вот и перешли с тн26 на тн461.

уважаемый SasaVitebsk спасибо за желание помочь, буду рад любой помощи, тк глюк неординарен.
а ситуация примерно такая, АДЦ работает, прерывания идут, но глюкует все именно при умножении.
если что то конкретное интерисует спрашивайте, если кому-то интересен этот глюк могу, дать чтонть для проверки, но при запросе, так выкладывать не могу.
рс: если честно, я не помню сколько времени я пишу программы, начинал еще с z80...
__nik__
Вот я тут записал файлик, Это запись с экрана того что происходит.
Вырезал из проэкта ту подпрограмму и убрал лишнее для того чтоб не смотреть на прочую лабуду.
Запись сделана в AVRStudio при связи с аврДракон, в режиме dWare отладки.
В кратце о программе, что там происходит:
-как то настроен таймер на шим выход, может и не шим, главное что он что-то генерит, чтоб значение в АЦП было не всегда 1023 а иногда было =0.
-прерываний нет...
-Ацп работает в принципе так как я настраивал в проэкте, думаю тоже не важно, сумму дает вполне адекватную, просто ее подогнал, для простоты.
суть неизменилась, все как я говорил.

Значится жду предложений ну или того, что я не так делаю.

Нажмите для просмотра прикрепленного файла
запакованный ехе файл сделанный одной программкой копии моего экрана, так что не пугайтесь
SasaVitebsk
Простите за прямоту, но давайте без сумбура и по порядку прочитаем перечисленные вами проблемы.
Цитата(__nik__ @ Dec 24 2007, 22:13) *
При изучении выяснилось проблема кроется в работе АЦП.
Проблема:
Как оказалось, АЦП работает как хочет, хочет в середине фазы выдаст значение =0, или, при отсутствии сигнала может выдать большое значение(выше обычного шума) из-за чего происходит ошибка в показании прибора.
но вышесказанное это вообще ничто, по сравнению с тем, что иногда (всегда по разному) за определенное количество ацп преабразований выдает их сумма равняется 0, что вообще не понятно.

Здесь не понятно проблема в АЦП или суммировании, или и там и там? Суммирование, на сколько я понимаю программное и причину хомута можно однозначно вычислить.
Цитата
На данный момент обнаружил глюк иара, по какой причине выяснить не смог, пока что.
Суть примерно такая,
long Summ;
unsigned int acvant;
return (Summ/acvant*419.0/468.0);
ошибка возникает при умножении, почему-то при умножении числа на константу на выходе получаем 0

???
Цитата
Столкнулся еще с тем что не могу скорость АЦП переключить, это как то похоже это как то связано с иаром 4.21А.


Так у вас одна ошибка или целый ряд ошибок непонятных. Что значит "не могу скорость АЦП переключить"? Это для меня непереводимая игра слов. Напишите конкретно что происходит. Не меняется значение регистра или что???

На резонный вопрос о типе return вы так и не ответили. Приведите хотябы всю подпрограмму с возвратом. Ваш exe файл с экрана читать очень сложно. Не успеваешь его просматривать. Можно перейти на ассемблерный листинг в отладчике и выяснить где именно у вас прокол. Что именно IAR сделал не так. Там сразу всё понятно становится. То же и с суммированием.

Короче пока недостаточно данных.
__nik__
Не могу изменить скорость ацп, значит то, что при любых настройках которые я ему даю, он мерит на полной скорости, если честно то и фиг с ним, постараюсь разобратся, мож и правда что не так делается.
только что посмотрел, одна из ошибок в умножении, файл с доказательством как пологается прикладываю, програмка проще некуда
float fSumm,summ;
__C_task void main( void )
{
// InitMCU();
// while(!(PINB_Bit5)){;}
while (1)
{
fSumm=234.123;
fSumm=fSumm*2; --- вот тут у меня выдает 0 но только на кристалле!!!
fSumm = fSumm / 2;
summ=Mesure();
PORTB=summ+2;
}
}
на лишний хлам внимания не обращайте, для честности дал как она есть в программе. Он написан в надежде что компилятор его оптимизировал и не передал значение, но надежда не оправдалась, увы.

То что в файле:
показываю то как считает ИАР в его родном дебугере и на кристалле, через дракон.
ошибка сразу видна..

Через дракон, в асме лазить трудно, все переменные пишет, Not in scope, согласитесь оч тяжело понять где что, да и дракон все время при хождении по асму просто падает. Я смог найти только место, где вроде как затирает значение которое должен считать, но не уверен, так долеко дракон зашел лиш раз, теперь просто падает.
Нажмите для просмотра прикрепленного файла
извиняюсь за скорость, старался чтобы места занимало поменьше

to SasaVitebsk
1. На данный момент, 2 ошибки с умножением и с квантованием АЦП.
2. Найдена ошибка, в ней я уверен на 90%, при умножении чисел с точкой (для непонятливых это 2.0 или 123.123) long, float, int, char. Любое умножение даже на 2.0 даст результат 0, хотя в его дебугере виртуальном, дает правильный результат.
3. Запись в регистры АЦП производится, но действия не оказывает никакого, начинаю подозревать в этом ИАР, в тани461 изменили модууль АЦП, а они видимо это не учли.

тип return unsigned int
хотя не думаю что это важно
SasaVitebsk
smile.gif Красиво.

Цитата
Через дракон, в асме лазить трудно, все переменные пишет, Not in scope, согласитесь оч тяжело понять где что, да и дракон все время при хождении по асму просто падает.


То что Дракон падает - это плохо. Попробуй укоротить кабелёк. У меня правда JTAG ICE2. Вроде работает устойчиво. Особенно на DBW.

Хрен с ними - с переменными. Войди в режим асма и пройди по шагам отмечая как модифицируются регистры. Потом тоже самое на изделии. Увидишь команду, откуда разница прёт. Может 461 какие то команды арифметики не выполняет, а IAR-овцы об этом не знают. smile.gif И ещё один момент. Ты симулятором IARовским пользуешься, а ты попробуй симулятором Studio. Он по идее должен точнее железо симулировать.
__nik__
кабелек у меня около 15 см, куда меньше.
А у Вса случаем тани461 нет? может проверите на жтаг исе2, своего, шефа, я так и не уломал на него, особенно когда он узнал, что он стоит около 10тр., но думаю скоро купит, если так дальше все пойдет.
в принципе, я придумал как все проверить, у меня есть еще ноут, запущу на одном Астудию, на другом иар, и по шагу буду долбится об стол, искать причину глюка.
надеюсь к вечеру дам результат, только скорее всего без видео, так что придется поверить на слово.
__nik__
короче, я нашел.... вот только что делать.
у тани 461 нет MUL инструкций, а иар их использует в математике, по этому и глюк.
знающие может подскажут как это обойти?
SasaVitebsk
Цитата(__nik__ @ Dec 31 2007, 22:49) *
короче, я нашел.... вот только что делать.
у тани 461 нет MUL инструкций, а иар их использует в математике, по этому и глюк.
знающие может подскажут как это обойти?

Самое забавное, что в tiny26 тоже нет данной инструкции - я уже посмотрел. Обойти можно выбрав вместо прямого камня проверенный, но подменив и переписав файл конфига. Или посмотреть - может новый config появился под эту микруху у IARа

PS:Искать. Где-то объявлены определения __HAS_MUL__ и __HAS_ENHANCED_CORE__.

Очевидно, что этого быть объявлено не должно быть. Искать во всех файлах связанных с 461
__nik__
А знаете что настараживает, а ведь программа скомпилированная под тани26 в процессоре не работала, а в ней нет команд аппаратного умножения и регистры ацп у них совподают, я тупо хекс в нее заливал от тани26.
я вспомнил, еще кое что, скомпилированную программу под 261 я заливал в тани26 и мне кажется она работала исправно.
что то мне говорит что разница в них более глобальна и еще не описана до конца.
в таком случае я продолжаю поиск...
как то все это загадисто.
за подсказки спасибо, попробую просмотреть файлы от тани 26 и тани 461.
Иар при выборе проца Tiny26 снимает галку на "Enhanced core" и "No MUL instruction" и наоборот их ставит при выборе Tiny461, что весьма странно, у них нет MUL инструкций у обоих.

Указанных определений __HAS_MUL__ и __HAS_ENHANCED_CORE__ я не нашел в файлах.
SasaVitebsk
Цитата(__nik__ @ Jan 1 2008, 03:22) *
Иар при выборе проца Tiny26 снимает галку на "Enhanced core" и "No MUL instruction" и наоборот их ставит при выборе Tiny461, что весьма странно, у них нет MUL инструкций у обоих.

Указанных определений __HAS_MUL__ и __HAS_ENHANCED_CORE__ я не нашел в файлах.


Так выбрать 461 и убрать галки! Я вообще этих галок не нашёл. Как не нашёл и файла конфигурационного, который определяет на каких процах эти галки ставятся. А файл такой сто процентов где-то есть. Не компилируют же они после добавления каждого нового проца.
__nik__
Галки есть при выборе процессора, в свойствах проэкта, на закладке Target.
Короче не помог ни выбор проца -v1 с описанием без МУЛ и Энхансед коре.
всетаки подозреваю, что они всетаки перекомпилируют.
Припоминаю что на версии ИАР 2.28, там еще небыло тн26, использовал -v1 или -v0, с h файлом для 26, но такой фокус не прокатил для 461, всеравно умнодение не прокатило.
Ума не приложу, как быть если нужно умножение с точкой, а при делении ощибка слишком велика...
SasaVitebsk
Цитата(__nik__ @ Jan 1 2008, 22:01) *
Галки есть при выборе процессора, в свойствах проэкта, на закладке Target.
Короче не помог ни выбор проца -v1 с описанием без МУЛ и Энхансед коре.
всетаки подозреваю, что они всетаки перекомпилируют.
Припоминаю что на версии ИАР 2.28, там еще небыло тн26, использовал -v1 или -v0, с h файлом для 26, но такой фокус не прокатил для 461, всеравно умнодение не прокатило.
Ума не приложу, как быть если нужно умножение с точкой, а при делении ощибка слишком велика...

Задай вопрос на форуме по IAR. Там есть спецы типа Сергея Борщ или Zltigo. Они ответят. У меня тоже вкл. ENHANCED_CORE на 461.

IAR C/C++ Compiler for AVR
4.12A/W32 [Evaluation] (4.12.1.3)
__nik__
Похоже, что математика это чистая проблема иара, осталось еще с прескалером ацп разобратся.
пока так и не смог заставить его считать медленнее.
Rst7
Все правильно. У T461 действительно расширенное ядро без умножителя. Надо бы посмотреть, ту ли библиотеку он подключает - Project/Options/General Options/Library Configuration/Library File должен быть cl1s-ec_nomul.r90.
__nik__
Посмотрел, в оригинале cl1t-ec_nomul.r90.
Я там в файлах его покопался, он теперь подключает cl0t-ec_nomul.r90, но всеравно не помогает.
посмотрел что он подключает к тани26 ... порадовало cl0t.r90 , а различия то у них в плане инструкций не очень большие.
Я проверил, 01.gif , cl1t-ec_nomul.r90 использует MUL, 07.gif нафига она называется номул, не понятно.
Я так подозреваю, что такой трабл будет со всеми процами которые используют эту библиотеку в совокупности с десятичной дробью, не факт, что в других этого глюка нет. Видимо это подарок от ирара, проверял версии
EW IAR 4.21A Ev
EW IAR 4.30A Ev
Народ осторожнее, тем кто использует эту библиотеку.
Само существование такого глюка мне бы и в голову не пришло.

Осталось с ацп разобратся....
ПС: Напишу ИАРу, стебану их, пусть дергаются. Жалко им картинки не отправить, но я чтонть придумаю.
Rst7
Да и черт с ним, расширенным ядром. Подключите cl1s.r90 и все.
__nik__
Да дело не только в расширенном ядре, хотя я думаю это способствовало бы уменьшению кода, а в работоспособности программы в целом, но это я смогу проверить только после праздников, по нескольким причинам:
1. Устройство на работе.
2. на работе сгорел дракон, таня осталась залочена на dWare, было куплено 10 шт для пробы одна загадочно стала сажать Reset в 0, хотя если ей чем-нибудь его закоротит на 5В, то она программируется исправно по SPI. Другая после переключения с кварца на внутренний рц, тоже погибла, остальные не помню, осталось не тронутых 4, на одной из них и проверял математику.
Есть подозрение, что библиотека расширенного ядра, как то влияет на настройку конфигурации ацп и вешала его так, что он переставал реагировать на дальнейшие изменения.
ПС:отлаживал я на домашнем драконе.
Подключить ничего кроме cl1t.r90 не удастся, но с ним математика проходит, что еще вылезет, пока не знаю.
Rst7
Цитата
Подключить ничего кроме cl1t.r90 не удастся, но с ним математика проходит, что еще вылезет, пока не знаю.


А Вы поставьте модель памяти small, а не tiny. Ведь в T461 256 байт ОЗУ, значит указатели - двухбайтные.
__nik__
Нашел что у ATtiny461 всетаки есть, глюк не глюк, но помоему глюк, потому как у других такого не наблюдалось.
ATtiny461 не сбрасывает флаг ADIF после его чтения, приходится сбрасывать в ручную.
странно как то это все...
SasaVitebsk
Цитата(__nik__ @ Jan 10 2008, 20:48) *
Нашел что у ATtiny461 всетаки есть, глюк не глюк, но помоему глюк, потому как у других такого не наблюдалось.
ATtiny461 не сбрасывает флаг ADIF после его чтения, приходится сбрасывать в ручную.
странно как то это все...

Мы уже всё и так поняли. smile.gif
Данную микруху закладывать пока рановато.
ReAl
Цитата(__nik__ @ Jan 10 2008, 18:48) *
Нашел что у ATtiny461 всетаки есть, глюк не глюк, но помоему глюк, потому как у других такого не наблюдалось.
ATtiny461 не сбрасывает флаг ADIF после его чтения, приходится сбрасывать в ручную.
странно как то это все...
Ой, тут у меня малость "Hard Day's Night" wassat.gif , торможу что-то, можно для меня персонально списочек AVR-ок, у которых флаг ADIF сбрасывается чтением 07.gif ?
Это помню:
Цитата
ADIF is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag.

Это (для старых чипов, у которых sbi/cbi были RMW-операцией со всем регистром в целом и по sbi ADCSRA, ADSC в бит ADIF писалось назад его содержимое и тем самым он автоматически сбрасывался "by writing a logical one") тоже понмю:
Цитата
Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled.
This also applies if the SBI and CBI instructions are used.
А вот чтобы прямо так чтением и сбрасывался... Ну не помню...
__nik__
Цитата
можно для меня персонально списочек AVR-ок, у которых флаг ADIF сбрасывается чтением ?

Да конечно можно, вот у которых точно сбрасывается:
ATtiny26,25,15; AMmega48,8,16,32,8535,8515.
это те которые я помню.
Я проверил, в м8 написано тоже самое...
А причем тут SBI и CBI если используются SBIS и SBIC??
как я понимаю они читают регистр или бит(как реализовали) в любом случае....
Rst7
Цитата
Да конечно можно, вот у которых точно сбрасывается:ATtiny26,25,15; AMmega48,8,16,32,8535,8515.это те которые я помню.Я проверил, в м8 написано тоже самое...


Гм. Прямо из PDF по Mega8

Цитата
Bit 4 – ADIF: ADC Interrupt Flag
This bit is set when an ADC conversion completes and the Data Registers are updated.
The ADC Conversion Complete Interrupt is executed if the ADIE bit and the I-bit in
SREG are set. ADIF is cleared by hardware when executing the corresponding interrupt
Handling Vector. Alternatively, ADIF is cleared by writing a logical one to the flag.
Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled.
This also applies if the SBI and CBI instructions are used.


Где тут про сброс чтением? И везде так.
ReAl
Цитата(__nik__ @ Jan 11 2008, 00:38) *
Да конечно можно, вот у которых точно сбрасывается:
ATtiny26,25,15; AMmega48,8,16,32,8535,8515.
это те которые я помню.
Я проверил, в м8 написано тоже самое...
А причем тут SBI и CBI если используются SBIS и SBIC??
как я понимаю они читают регистр или бит(как реализовали) в любом случае....
Мда...
"У всей Дерибасовской не сбрасывается, а у него сбрасывается"
Мой намёк внимательнее вчитаться в документацию и проанализировать собственный код был слишком тонок. А сказать толще не получается почему-то, какие-то шутчки мешают, пойти, чтоли, на курсы повышения квалификации к AVR ?
У меня в 90s4433, mega8, tiny26, tiny15, tiny13, mega64/128 ADIF по чтению не сбрасывался (кстати, в 8515 АЦП нет).
Возможно, телепат из меня плохой, но я думаю, что и у (как там положено правильно обращаться - сначала в ФИДО меня долго переучивали на "ты", так как "обращение на Вы есть состояние, промежуточное между словесной перепалкой и мордобоем", теперь, оказывается, для этого сначала на брудершафт нужно - это потому, что теперь "промежуточное" состояние является основным?) тебя/Вас в тини26 тоже ничегошеньки не сбрасывается по
Код
   sbis ADCSRA, ADIF
   rjmp .-2

и флаг ADIF продолжает стоять как у молодого бычка до последующего запуска АЦП командой
Код
   sbi  ADCSRA, ADSC

А вот тут то флаг ADIF и сбрасывался у более старых кристаллов (согласно "непонятно при чём тут" процитированному фрагменту даташита), а у tinyX61 не сбрасывается, так как у них команды sbi/cbi уже не RMW с байтом, а работают только с указанным битом.
__nik__
На счет ты или вы, все очень просто.
Ты - обращение к знакомому; личное общение; и тп
Вы - обращение к не знакомому человеку либо стершему по возрасту или рангу, кстати, в ответ он должен также обращаться на вы.
Сходить на курсы повышения к Атмел ... если это такие курсы после которых к нам приходят и терморезистор измеряют компаратором, чтобы постоянно не переключать каналы ацп, или делают ляпы как в AVRDragon, или как замалчивание температурных разбросов, в частности к WDT, а при указании на это: 1й раз отвечать, что его нет либо он мал, а при сборе статистики в диапазоне -70 ... +100 и отправке им с просьбой все-таки его указать. 2й раз ответить, что разброс такой и есть.
Для скептиков, при ~ -70 процессор работал исправно.
Спасибо конечно, но думаю, такие курсы у нас уже есть в каждом институте.
Я не претендую на ноухау, к тому же, это новшество Атмела отняло не так много времени, как недосмотр ИАРа, я вот забыл проверить, но вроде, я заливал прошивку скомпилированную под Тани461/261, в Тани26, при этом она исправно работала, как нибудь уточню.
Ацп чуть хуже Тани26, пришлось вновь подбирать параметры, чтобы показания не "прыгали" больше чем 1.
Да в 8515, ацп нет, написал на автомате, извиняюсь.
AlexG_changed
Цитата(__nik__ @ Jan 12 2008, 00:21) *
На счет ты или вы, все очень просто.
Ты - обращение к знакомому; личное общение; и тп
Вы - обращение к не знакомому человеку либо стершему по возрасту или рангу, кстати, в ответ он должен также обращаться на вы.


Смотря где как принято, возможны варианты.

Цитата
Сходить на курсы повышения к Атмел


Да не к Atmel, есть тут один особо прямолинейный товарищ с таким ником cool.gif
ReAl
bb-offtopic.gif
Цитата(__nik__ @ Jan 11 2008, 20:21) *
На счет ты или вы, все очень просто.
Ты - обращение к знакомому; личное общение; и тп
Вы - обращение к не знакомому человеку либо стершему по возрасту или рангу, кстати, в ответ он должен также обращаться на вы.
Если уж на то пошло, то на письме на "вы" нужно обращаться к нескольким людям одновремённо, а к одному таки на "Вы". Это первое. А второе - в течении многих лет вот как раз незнакомые люди в эхах/на форумах обижались на "Вы" и требовали "ты". Объяснется просто - и применяя слово "Вы" столько хамят и оскорбляют, что это слово признаком уважительного отношения ну никак не является. И на применение "Вы" многие смотрели косо, а на требование его применения к себе смотрели исключительно как на заявочку "я выше рангом". И сами переходили на "Вы" только для того, чтобы показать отчуждение.
Так что обижаться за "ты" на людей, которые провели на разных форумах уже 10-15 лет, нет никакого смысла. Привычки-с.

Цитата(__nik__ @ Jan 11 2008, 20:21) *
Сходить на курсы повышения к Атмел ...
Вообще говоря, мы тут все немножко программисты и должны понимать важность точности формулировок (а любой текст - это своего рода программа, предназначенная для интерпретации в мозгу принимающего этот текст, кажется, у Лема в "Сумме Технологии" про это неплохо написано). И если я написал "сходить на курсы к AVR", то это никак не может означать "сходить к Атмел на курсы по AVR".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.