|
Проблема с ADC ATTINY461 |
|
|
|
Dec 24 2007, 18:13
|
Участник

Группа: Свой
Сообщений: 52
Регистрация: 30-11-05
Из: С-Пб
Пользователь №: 11 619

|
Столкнулся с тем, что часть программы, работавшая на M8, ATTINY26, m8535 отказывается работать на тани461, а именно п/п измерения фазы(полпериуда). При изучении выяснилось проблема кроется в работе АЦП. Проблема: Как оказалось, АЦП работает как хочет, хочет в середине фазы выдаст значение =0, или, при отсутствии сигнала может выдать большое значение(выше обычного шума) из-за чего происходит ошибка в показании прибора. но вышесказанное это вообще ничто, по сравнению с тем, что иногда (всегда по разному) за определенное количество ацп преабразований выдает их сумма равняется 0, что вообще не понятно. Во время работы ацп, прерывания запрещаются и сканирование каналов не происходит, на время тестов это отключено, таким образом измеряем только один канал с внешним опорником на 4.096в.
если кто нибудь встречался с данной проблеммой, то посоветуйте как ее решить. Условия работы и измерений: Еще, скорость АЦП никак не влияет, синал 100% во время измерений присутствеут, контролировалось по осцилографу, макс сигнал составлял в пике ~2.3 вольта.
|
|
|
|
|
 |
Ответов
|
Dec 29 2007, 21:43
|
Участник

Группа: Свой
Сообщений: 52
Регистрация: 30-11-05
Из: С-Пб
Пользователь №: 11 619

|
Место глюка нашел при помощи AVR Dragon, он оказался в умножении с точкой ( * 419.0) на что умножать не важно, результат всегда равен 0. Если убрать запятую, то считает верно но для меня недостоточно точно. Столкнулся еще с тем что не могу скорость АЦП переключить, это как то похоже это как то связано с иаром 4.21А. еще раз хочу обратить внимание что таже программа работает в тани26....
|
|
|
|
|
Dec 29 2007, 23:09
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(__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) прерывание в "нужном" месте б) модификация "нужной переменной" или появление "нужного значения" переменной. Всё это я к тому, что сама ошибка может находится совершенно не в том месте где вы её ищете, а проявляться в "давно вылизанной" части программы. И даже при внесении изменений в произвольное место менять своё поведение.
|
|
|
|
|
Dec 30 2007, 15:25
|
Участник

Группа: Свой
Сообщений: 52
Регистрация: 30-11-05
Из: С-Пб
Пользователь №: 11 619

|
Цитата(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). пришлось исследования свернуть и заменить * на /, правда точность жутко упала почемуто.
|
|
|
|
Сообщений в этой теме
__nik__ Проблема с ADC ATTINY461 Dec 24 2007, 18:13 GDI Эррата ничего на эту тему не говорит? Dec 25 2007, 07:13 smk Первое, что приходит на ум так это посмотреть как ... Dec 25 2007, 08:50 ArtemKAD А какие уровни сигналов на остальных ногах по отно... Dec 25 2007, 09:55 __nik__ to GDI
ерата молчит. там по идее проблемм не должн... Dec 25 2007, 12:46 __nik__ Результаты проверки:
Программа заливалась в ATTINY... Dec 25 2007, 16:58 AlexG Цитата(__nik__ @ Dec 25 2007, 22:58)
Ду... Dec 25 2007, 19:27 __nik__ to AlexG
Цитатачасть программы, работавшая на M8, ... Dec 25 2007, 21:36 __nik__ На данный момент обнаружил глюк иара, по какой при... Dec 27 2007, 17:37 mdmitry Цитата(__nik__ @ Dec 27 2007, 20:37) Суть... Dec 28 2007, 19:59 sergik_vrn Цитата(__nik__ @ Dec 27 2007, 20:37) На д... Dec 29 2007, 07:10   SasaVitebsk Цитата(__nik__ @ Dec 30 2007, 19:25) изви... Dec 30 2007, 16:06 __nik__ to SasaVitebsk
извиняюсь за резкий то, но насамом ... Dec 30 2007, 21:16 __nik__ Вот я тут записал файлик, Это запись с экрана того... Dec 30 2007, 23:13 SasaVitebsk Простите за прямоту, но давайте без сумбура и по п... Dec 31 2007, 00:09 __nik__ Не могу изменить скорость ацп, значит то, что при ... Dec 31 2007, 01:35 SasaVitebsk Красиво.
ЦитатаЧерез дракон, в асме лазить трудно... Dec 31 2007, 15:48 __nik__ кабелек у меня около 15 см, куда меньше.
А у Вса с... Dec 31 2007, 16:51 __nik__ короче, я нашел.... вот только что делать.
у тани ... Dec 31 2007, 18:49 SasaVitebsk Цитата(__nik__ @ Dec 31 2007, 22:49) коро... Dec 31 2007, 22:07 __nik__ А знаете что настараживает, а ведь программа скомп... Dec 31 2007, 23:22 SasaVitebsk Цитата(__nik__ @ Jan 1 2008, 03:22) Иар п... Jan 1 2008, 14:40 __nik__ Галки есть при выборе процессора, в свойствах проэ... Jan 1 2008, 18:01 SasaVitebsk Цитата(__nik__ @ Jan 1 2008, 22:01) Галки... Jan 1 2008, 18:27 __nik__ Похоже, что математика это чистая проблема иара, о... Jan 1 2008, 20:41 Rst7 Все правильно. У T461 действительно расширенное яд... Jan 1 2008, 20:58 __nik__ Посмотрел, в оригинале cl1t-ec_nomul.r90.
Я там в ... Jan 1 2008, 23:24 Rst7 Да и черт с ним, расширенным ядром. Подключите cl1... Jan 2 2008, 20:57 __nik__ Да дело не только в расширенном ядре, хотя я думаю... Jan 3 2008, 00:38 Rst7 ЦитатаПодключить ничего кроме cl1t.r90 не удастся,... Jan 4 2008, 08:00 __nik__ Нашел что у ATtiny461 всетаки есть, глюк не глюк, ... Jan 10 2008, 16:48 SasaVitebsk Цитата(__nik__ @ Jan 10 2008, 20:48) Наше... Jan 10 2008, 19:43 ReAl Цитата(__nik__ @ Jan 10 2008, 18:48) Наше... Jan 10 2008, 21:50 __nik__ Цитатаможно для меня персонально списочек AVR-ок, ... Jan 10 2008, 22:38 ReAl Цитата(__nik__ @ Jan 11 2008, 00:38) Да к... Jan 11 2008, 08:43 Rst7 ЦитатаДа конечно можно, вот у которых точно сбрасы... Jan 11 2008, 06:16 __nik__ На счет ты или вы, все очень просто.
Ты - обращени... Jan 11 2008, 18:21 AlexG Цитата(__nik__ @ Jan 12 2008, 00:21) На с... Jan 11 2008, 20:29 ReAl Цитата(__nik__ @ Jan 11 2008, 20:21) На с... Jan 11 2008, 21:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|