реклама на сайте
подробности

 
 
> Проблема с ADC ATTINY461
__nik__
сообщение Dec 24 2007, 18:13
Сообщение #1


Участник
*

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



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

если кто нибудь встречался с данной проблеммой, то посоветуйте как ее решить.
Условия работы и измерений:
Еще, скорость АЦП никак не влияет, синал 100% во время измерений присутствеут, контролировалось по осцилографу, макс сигнал составлял в пике ~2.3 вольта.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
__nik__
сообщение Dec 29 2007, 21:43
Сообщение #2


Участник
*

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



Место глюка нашел при помощи AVR Dragon, он оказался в умножении с точкой ( * 419.0)
на что умножать не важно, результат всегда равен 0. Если убрать запятую, то считает верно но для меня недостоточно точно. Столкнулся еще с тем что не могу скорость АЦП переключить, это как то похоже это как то связано с иаром 4.21А.
еще раз хочу обратить внимание что таже программа работает в тани26....
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 29 2007, 23:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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) прерывание в "нужном" месте
б) модификация "нужной переменной" или появление "нужного значения" переменной.

Всё это я к тому, что сама ошибка может находится совершенно не в том месте где вы её ищете, а проявляться в "давно вылизанной" части программы. И даже при внесении изменений в произвольное место менять своё поведение.
Go to the top of the page
 
+Quote Post
__nik__
сообщение Dec 30 2007, 15:25
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 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). пришлось исследования свернуть и заменить * на /, правда точность жутко упала почемуто.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- __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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.02149 секунд с 7
ELECTRONIX ©2004-2016