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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Похоже баг CPU core ATTiny26
Rst7
сообщение Jan 18 2006, 09:20
Сообщение #1


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Наступил на неприятность:

char TestR26(void)
{
asm("CLI");
asm("PUSH R26 ");
asm("PUSH R27 ");
asm("LDI R26,0x80");
asm("LDI R27,0x03"); //Обратите внимание на значение!!!
asm("LD R16,X+");
asm("MOV R16,R27");
asm("POP R27 ");
asm("POP R26 ");
asm("SEI");
}

Результат должен быть 3, а получается 0. Странно.

Наступил, когда у меня начало запарывать R27, в котором IAR положил переменную, а при вызове функций не сохранял (как собственно и должно быть) - модель ведь tiny.

Вообщем в Атмел я уже отписал, посмотрим, как среагируют.

PS Все таки сомнения гложут, посмотрите всE, вроде 3 - должно получиться на выходе (R16), а выходит 0


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Rash
сообщение Jan 18 2006, 09:28
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Попробуй вначале записать адрес r27, а потом r26
Код
...
asm("LDI R27,0x03");
asm("LDI R26,0x80");
...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 18 2006, 09:36
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Rash @ Jan 18 2006, 11:28) *
Попробуй вначале записать адрес r27, а потом r26
Код
...
asm("LDI R27,0x03");
asm("LDI R26,0x80");
...


Во-первых без разницы.

Во-вторых, просто LD ...,X+ запарывает R27, даже если в R26 не 0xFF. Вот и все.

В-третьих, это тестовый кусок. А как компилятор положит - я не могу контролировать. Сам то код я починил, руками R27 сохраняю и восстанавливаю, но дело не в этом, а в том, что в ядре глюк.

ЗЫ Прерывания запрещены.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
solidreg
сообщение Jan 18 2006, 09:58
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056



У иеня всё равотает. ищите проблемы в друой месте програмы (IAR оптимизасия и подробнее)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 18 2006, 10:17
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(solidreg @ Jan 18 2006, 11:58) *
У иеня всё равотает. ищите проблемы в друой месте програмы (IAR оптимизасия и подробнее)


Оптимизация не влияет. Написана руками тестовая функция, которую я и привел в первом посте. Как видно, она запрещает прерывания, грузит в X 0x380, грузит в R16 по X с автоникрементом (что приводит к попаданию в R16 содержимого ячейки SRAM с адресом 0x80), и возвращает значение ст. байта X. Результат далее не важен в этом месте, он передается на мастер прибор для отображения. В этом месте (в выводе) все замечательно передается - это я, чтобы не было дурных идей, типа не работает дальше, говорю. Факт в том, что результат = 0. А с разрешенными прерываниями (правда, при этом мой код в другое место ложится) результат = 1.

Конкретно в иаровском коде идея следующая:

main()
{

...
//здесь R27 используется как локальная переменная
...
foo1();
....
//И здесь R27 - таже лок. переменная, ее значение используется

}


foo1()
{


p=txbuf;
// 00000008 .... LDI R26, txbuf //Это присвоение указателя

...
c=*p++; //Для p используется X, p - точно не 255
//Код соответственно
// 00000014 916D LD R22, X+ //ЗДЕСЬ ЗАПАРЫВАЕТСЯ R27
...
}

На входе foo1 сохраняется только R26, как и должно быть, на выходе - восстанавливается. А в R27 - дупло.

Когда я все это выяснил - была написана тестовая процедура, как видите - на асме и с запрещенными прерываниями, для локализации эффекта. Эффект есть. Не может не есть wink.gif

Вот такая фигня.

А например в 4433 (у меня на нем давно прибор один сделан) c этим все в порядке, я там на асме все написал, но старшие байты указателей (XH, YH, ZH) в полный рост как глобальные переменные использую - и все в порядке.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Георгий
сообщение Jan 18 2006, 10:31
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Ошибка мне кажется в написании самой тестовой функции
Цитата
char TestR26(void)
{
asm("CLI");
asm("PUSH R26 ");
asm("PUSH R27 ");
asm("LDI R26,0x80");
asm("LDI R27,0x03"); //Обратите внимание на значение!!!
asm("LD R16,X+");
asm("MOV R16,R27");
asm("POP R27 ");
asm("POP R26 ");
asm("SEI");
}

В R16 возвращается результат (char), а так как ты ничего не возвращаешь - у тебя в R16 будет писаться 0.
Нужно явно вернуть значение.

P.S. При проуверке не подтвердилось.

Сообщение отредактировал Георгий - Jan 18 2006, 10:42


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
solidreg
сообщение Jan 18 2006, 10:31
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056



Попробуйте вобще без IAR'a. Только ASM. Интересно какие результаты будут.
Go to the top of the page
 
+Quote Post
Maxim
сообщение Jan 18 2006, 10:38
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 24-06-04
Пользователь №: 165



В Attiny26 всего 128 байт памяти (RAM) и контролер имеет полное право портить R27 в соответствии со своим ядром.
Go to the top of the page
 
+Quote Post
Георгий
сообщение Jan 18 2006, 10:40
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



Проверил этот кусок у себя - нормально. Так что даже мое предположение не срабатывает. Глюк где то не тут.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 18 2006, 10:53
Сообщение #10


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Maxim @ Jan 18 2006, 12:38) *
В Attiny26 всего 128 байт памяти (RAM) и контролер имеет полное право портить R27 в соответствии со своим ядром.


Не имеет он права IMHO. И ИАР придерживается тогоже мнения - не сохраняет R27 при модели tiny. А ИАРовцы в плотную с Atmel'ом работают, так что я думаю - не имеет правов он таких. Кстати, например, LD ...,Z в Tiny15 портит ZH - об этом напрямик в даташите написанно.

Щас нашел другой проц. Правда Tiny26L. Тот же эффект.

Вопрос к тем, кто писал "У меня все работает" - вы что, уже на камне проверили?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
solidreg
сообщение Jan 18 2006, 11:10
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056



>> Вопрос к тем, кто писал "У меня все работает" - вы что, уже на камне проверили?

Я на ATmega16 запустил т с JTAG'ом смотрел. (нет у меня tiny26).
Видимо, надо было на tiny26 смотреть...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 18 2006, 11:24
Сообщение #12


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(solidreg @ Jan 18 2006, 13:10) *
>> Вопрос к тем, кто писал "У меня все работает" - вы что, уже на камне проверили?

Я на ATmega16 запустил т с JTAG'ом смотрел. (нет у меня tiny26).
Видимо, надо было на tiny26 смотреть...


Ха, если бы оно в ядре, которое small, не работало, уже бы Atmel гнилыми помидорами закидали. В том то и дело, что на камне надо на T26 смотреть.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 18 2006, 12:27
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Зачем, при памяти в 128 байт грузить указатель 16-разрядным числом? Хватит и младшего байта. С помощью его (к примеру R26 - XL) можно адресовать до 256 ячеек памяти, для тех кто не знает :-). При этом, какой бы ни был старший байт адреса все равно мы попадает по нужному адресу. Это проверено мной, правда на ATtiny2313. Там все прекрасно адресуется при загрузке адреса в один регистр. Написано все было на асме в АВРСтудио, при чем в качестве указателей использовались все три регистра, способные, в данном случае быть указателями - XL, YL и ZL. Ни каких глюков в прошитом МК и готовом устройстве не было...

И с какой стати Вы взяли, что результат должен быть 3? Вы грузите в R16 число из ячейки по адресу 0х80 !!!

Запарывать старший регистр будет когда в младшем регистре 0xFF, и применяется команда с инкрементом регистра-указателя, или когда в младшем регистре 0x00, и применяется команда с декрементом регистра-указателя


--------------------
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 18 2006, 13:19
Сообщение #14


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(prottoss @ Jan 18 2006, 14:27) *
Зачем, при памяти в 128 байт грузить указатель 16-разрядным числом? Хватит и младшего байта. С помощью его (к примеру R26 - XL) можно адресовать до 256 ячеек памяти, для тех кто не знает :-). При этом, какой бы ни был старший байт адреса все равно мы попадает по нужному адресу. Это проверено мной, правда на ATtiny2313. Там все прекрасно адресуется при загрузке адреса в один регистр. Написано все было на асме в АВРСтудио, при чем в качестве указателей использовались все три регистра, способные, в данном случае быть указателями - XL, YL и ZL. Ни каких глюков в прошитом МК и готовом устройстве не было...

И с какой стати Вы взяли, что результат должен быть 3? Вы грузите в R16 число из ячейки по адресу 0х80 !!!


Вы не заметили, что после использования X, следующей коммандой я переношу R27 в R16, ведь меня интересует именно состояние XH!!!!!! И оно должно быть 3, а в камне - 0.

Цитата
Запарывать старший регистр будет когда в младшем регистре 0xFF, и применяется команда с инкрементом регистра-указателя, или когда в младшем регистре 0x00, и применяется команда с декрементом регистра-указателя


Именно этого я и ожидаю. А нет, запарывает R27 (XH).

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Jan 18 2006, 13:22
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133



Добрый день.
Вы гденибудь читали в документации, что обращение к памяти SRAM по адресу 0x0380 будет обрабатываться также как обращение по адресу 0х0080 ? Я такого там не видел, думаю, что претензии в этом случае неправомерны.

Зато, и это уже обсуждалось на другом форуме, в Tiny26 есть другие грабли:
1. напряжение встроенного опорного источника имеет очень широкий разброс от экземпляра к экземпляру до 2,8 в
2. в документации написано:
Цитата
If a different data channel is selected while
a conversion is in progress, the ADC will finish the current conversion before performing
the channel change.

Так вот, у меня при попытке сменить канал сразу или через 2-3 команды после запуска АЦП на однократное преобразование результат преобразования был испорчен. Пришлось отказаться от переключения канала до окончания преобразования. Было это год назад.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 04:44
Рейтинг@Mail.ru


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