|
Похоже баг CPU core ATTiny26 |
|
|
|
Jan 18 2006, 09:20
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Jan 18 2006, 13:39
|

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

|
Цитата(Gennadiy_ @ Jan 18 2006, 15:22)  Добрый день. Вы гденибудь читали в документации, что обращение к памяти SRAM по адресу 0x0380 будет обрабатываться также как обращение по адресу 0х0080 ? Я такого там не видел, думаю, что претензии в этом случае неправомерны. Я ожидаю, что при выполнении сл. действий: X=0x380; LD R16,X+; будет в регистровой паре X число 0x381. Этого не происходит. Цитата Зато, и это уже обсуждалось на другом форуме, в 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 команды после запуска АЦП на однократное преобразование результат преобразования был испорчен. Пришлось отказаться от переключения канала до окончания преобразования. Было это год назад. Это не имеет отношения к обсуждаемому вопросу.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 18 2006, 13:52
|

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

|
Цитата(Rst7 @ Jan 18 2006, 20:19)  Цитата(prottoss @ Jan 18 2006, 14:27)  И с какой стати Вы взяли, что результат должен быть 3? Вы грузите в R16 число из ячейки по адресу 0х80 !!!
Вы не заметили, что после использования X, следующей коммандой я переношу R27 в R16, ведь меня интересует именно состояние XH!!!!!! И оно должно быть 3, а в камне - 0. Извиняюсь, не заметил. Но все-таки в Tiny2313, на асме, я пользовался всего одним регистром в качестве указателя, при этом в старших половинах указателей хранил глобальные переменные программы, и все работало на ура... Цитата(Rst7 @ Jan 18 2006, 20:39)  Я ожидаю, что при выполнении сл. действий:
X=0x380; LD R16,X+;
будет в регистровой паре X число 0x381. Этого не происходит. Вообще-то ячейки SRAM с адресом 0x380 в ATtiny26 не существует, если уж подходить к этому вопросу принципиально, и МК имеет полное право заглючить с данным указателем. В даташите на рассматриваемый МК ничего не сказано по поводу обращений к несуществующим адресам. там сказано про 16-разрядные указатели при обращении к памяти, и что область памяти расположена с 0х0060 по 0х00DF. Вы пробовали обращаться к валидным адресам?
--------------------
|
|
|
|
|
Jan 18 2006, 14:10
|

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

|
Цитата(prottoss @ Jan 18 2006, 15:52)  Извиняюсь, не заметил. Но все-таки в Tiny2313, на асме, я пользовался всего одним регистром в качестве указателя, при этом в старших половинах указателей хранил глобальные переменные программы, и все работало на ура... ... Вообще-то ячейки SRAM с адресом 0x380 в ATtiny26 не существует, если уж подходить к этому вопросу принципиально, и МК имеет полное право заглючить с данным указателем. В даташите на рассматриваемый МК ничего не сказано по поводу обращений к несуществующим адресам. там сказано про 16-разрядные указатели при обращении к памяти, и что область памяти расположена с 0х0060 по 0х00DF. Вы пробовали обращаться к валидным адресам? Не я обращаюсь к невалидным адресам. ИАР С в старшем байте X хранит переменную (как Вы на Tiny2313). Когда он использует X+ (при этом в младшем байте валидный поинтер), старший байт (и соответственно, переменная) портится. На прошлых процах такого не было.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 18 2006, 15:14
|

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

|
Вообщем так. Вытащил свежий 8-bit AVR Instruction Set от 11/05. В нем открытым текстом написано: LD - Load Indirect from Data Space to Register using Index X .... Регистр-указатель X может быть неизменен или может быть пост-икрементирован или пред-декрементирован .... Имейте в виду, что только младший байт X-указателя изменяется в устройствах с размером области данных не более 256 байт. Для этих устройств старший байт указателя НЕ ИСПОЛЬЗУЕТСЯ ПРИ ВЫПОЛНЕНИИ ИНСТРУКЦИИ И МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ДЛЯ ДРУГИХ ЦЕЛЕЙ (большие буквы - мои  Перевод тоже)... ЧТД. Значит таки глюк в ядре. Обидно.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 19 2006, 06:35
|

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

|
Цитата(defunct @ Jan 18 2006, 21:10)  Цитата(Rst7 @ Jan 18 2006, 15:39)  Я ожидаю, что при выполнении сл. действий:
X=0x380; LD R16,X+;
будет в регистровой паре X число 0x381. Этого не происходит.
В эмуляторе все так и есть, но ведь в реальном чипе вполне возможна загрузка константы 0 при выходе за границу максимального адреса. Вы же читаете с несуществующего адреса, что уже само по себе неправильно и может привести к любым непредсказуемым последствиям. Вы невнимательно читаете мои посты. Я уже привел перевод из документации Atmel, который черным по белому говорит, что то, что я ожидаю, должно произойти и не должно привести к каким-либо непредсказуемым последствиям. Цитата По большому счету, скажите зачем использовать IAR для камня с 2kb Flash и 128 байт RAM? Так надо.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 19 2006, 08:28
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Rst7 @ Jan 19 2006, 08:35)  Вы невнимательно читаете мои посты. Я уже привел перевод из документации Atmel, который черным по белому говорит, что то, что я ожидаю, должно произойти и не должно привести к каким-либо непредсказуемым последствиям. Понимаете, доверие к фирме Atmel у меня будет чуть-чуть повыше чем к Вам и намного выше чем к глючному IAR. Тема поднятая Вами достаточно серьезная. Либо Вы обнаружили баг ядра, который впоследствии появится в errata, либо баг IAR, либо третий наиболее неприятный вариант - вам померещилось. В том самом даташите имеется допущение: Not all variants of this instruction is available in all devices. Refer to the device specific instruction set summary. Полагаю оно относится к Tiny15, но кто знает, может быть и к tiny26 оно тоже относится. Хотя буду откровенен, считаю, что оно не относится к tiny26. Для чистоты эксперимента, предлагаю Вам скомпилировать Ваш код в AVR Studio, и проверить на реальном чипе. Если XH точно также затрется, тогда это явно баг ядра, если нет, тогда это явный баг IAR'а, и тогда следует писать в IAR, а не в Atmel. PS: такой эксперимент я уже проделал, угадайте результат.
|
|
|
|
|
Jan 19 2006, 08:39
|

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

|
Цитата(defunct @ Jan 19 2006, 10:28)  Цитата(Rst7 @ Jan 19 2006, 08:35)  Вы невнимательно читаете мои посты. Я уже привел перевод из документации Atmel, который черным по белому говорит, что то, что я ожидаю, должно произойти и не должно привести к каким-либо непредсказуемым последствиям.
Понимаете, доверие к фирме Atmel у меня будет чуть-чуть повыше чем к Вам и намного выше чем к глючному IAR. Тема поднятая Вами достаточно серьезная. Либо Вы обнаружили баг ядра, который впоследствии появится в errata, либо баг IAR, либо третий наиболее неприятный вариант - вам померещилось. В том самом даташите имеется допущение: Not all variants of this instruction is available in all devices. Refer to the device specific instruction set summary. Полагаю оно относится к Tiny15, но кто знает, может быть и к tiny26 оно тоже относится. Хотя буду откровенен, считаю, что оно не относится к tiny26. Перевожу то, что вы процитировали: Не все варианты этой инструкции доступны во всех устройтвах. Все описаные варианты данной инструкции доступны в Tiny26. Памяти данных у нее не более 256 байт, следовательно, старший байт игнорируется (см. посты выше). Все очень прозрачно написано. Цитата Для чистоты эксперимента, предлагаю Вам скомпилировать Ваш код в AVR Studio, и проверить на реальном чипе. Если XH точно также затрется, тогда это явно баг ядра, если нет, тогда это явный баг IAR'а, и тогда следует писать в IAR, а не в Atmel.
PS: такой эксперимент я уже проделал, угадайте результат. Как Вы думаете, я не на живом камне третий день е....сь?  Про код, который я написал - это проверочная вставка, для того, чтобы убедится, что именно камень. Код компилирован правильно, т.е. так, как я написал - один к одному, без всяких изменений.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 19 2006, 09:37
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Rst7 @ Jan 19 2006, 10:39)  Как Вы думаете, я не на живом камне третий день е....сь?  Про код, который я написал - это проверочная вставка, для того, чтобы убедится, что именно камень. Код компилирован правильно, т.е. так, как я написал - один к одному, без всяких изменений. Сделал нехитрый дивайс - разъем для ISP и 2 светодиода. Воткнул tiny26, написал такой код: Код .include "tn26def.inc"
START: ldi YL, $FF out DDRA, YL ldi XH, $3 ldi XL, $81 ldi YL, $50 st X+, YL inc YL st X+, YL
ldi XH, $3 ldi XL, $81 ld YL, X+
cpi XH, 3 brne _show_red_led
_show_green_led: sbi PortA, 1 rjmp _halt
_show_red_led: sbi PortA, 0
_halt: rjmp _halt скомпилировал в AVR-Studio, светится зеленый... Что я делаю не так? Чип маркирован ATMEL 0442 ATTINY26-16PI, с обратной стороны - 4H2020 35570C 1-U0442
|
|
|
|
|
Jan 19 2006, 10:57
|

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

|
Я тоже сделал код: Код #include "iotiny26.h" NAME main
PUBLIC main
ORG $0 RJMP main
RSEG CODE main ldi r16,0xFF out DDRA,r16 ldi r16,0 out PORTA,r16 ldi r26,0x60 ldi r27,0x55 ld r16,x+ out PORTA,r27 dead_loop rjmp dead_loop
END main Что должно быть на порту А? Правильно - 01010101. Смотрим на лапы - 00000000. Убираем "ld r16,x+". На порту A - 01010101. Что я делаю неправильно? 2 камня, с L и без L
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 19 2006, 11:55
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-07-05
Пользователь №: 7 043

|
Бинарники смотрели ? Может криво компилятор генерит...
|
|
|
|
|
Jan 19 2006, 13:07
|

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

|
Цитата(Rst7 @ Jan 19 2006, 19:07)  Цитата(ObitJr @ Jan 19 2006, 13:55)  Бинарники смотрели ? Может криво компилятор генерит...
Грузил в AVRStudio, смотрел на дизасм, трассировал, сравнивал код с даташитом. Все правильно. А если пойти другим путем, тестовый Ваш код запустить на другом камне, вернее другого типа - тини13,14, 15 или любом другом тини? Какие там будут результаты?
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|