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

 
 
> Похоже баг 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
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
Rst7
сообщение Jan 18 2006, 13:39
Сообщение #16


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

Группа: Модераторы
Сообщений: 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 команды после запуска АЦП на однократное преобразование результат преобразования был испорчен. Пришлось отказаться от переключения канала до окончания преобразования. Было это год назад.


Это не имеет отношения к обсуждаемому вопросу. angry.gif


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


Гуру
******

Группа: Свой
Сообщений: 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. Вы пробовали обращаться к валидным адресам?


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


Гуру
******

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



Цитата(Rst7 @ Jan 18 2006, 20:39) *
Я ожидаю, что при выполнении сл. действий:

X=0x380;
LD R16,X+;

будет в регистровой паре X число 0x381. Этого не происходит.


А Вы пробовали обращаться по валидному адресу (0х0000 - 0х00DF)? В даташите ничего не сказано об обращении по несуществующим адресам, соответсвенно МК имеет полное право глючить. Зато там сказано про формировании адреса с помощью регистровой пары.


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


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

Группа: Модераторы
Сообщений: 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+ (при этом в младшем байте валидный поинтер), старший байт (и соответственно, переменная) портится. На прошлых процах такого не было.


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


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

Группа: Модераторы
Сообщений: 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 байт. Для этих устройств старший байт указателя НЕ ИСПОЛЬЗУЕТСЯ ПРИ ВЫПОЛНЕНИИ ИНСТРУКЦИИ И МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ДЛЯ ДРУГИХ ЦЕЛЕЙ (большие буквы - мои wink.gif Перевод тоже)...


ЧТД. Значит таки глюк в ядре. Обидно.


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


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



А портиться только после Х+/Х- ?
При обычном использовании порядок?
Не пробовали тот же фокус с Y и Z?

Попробую завтра поиграться.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 18 2006, 19:10
Сообщение #22


кекс
******

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



Цитата(Rst7 @ Jan 18 2006, 15:39) *
Я ожидаю, что при выполнении сл. действий:

X=0x380;
LD R16,X+;

будет в регистровой паре X число 0x381. Этого не происходит.


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

По большому счету, скажите зачем использовать IAR для камня с 2kb Flash и 128 байт RAM?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2006, 06:35
Сообщение #23


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

Группа: Модераторы
Сообщений: 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?


Так надо.


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


кекс
******

Группа: Свой
Сообщений: 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: такой эксперимент я уже проделал, угадайте результат.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2006, 08:39
Сообщение #25


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

Группа: Модераторы
Сообщений: 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: такой эксперимент я уже проделал, угадайте результат.


Как Вы думаете, я не на живом камне третий день е....сь? angry.gif Про код, который я написал - это проверочная вставка, для того, чтобы убедится, что именно камень. Код компилирован правильно, т.е. так, как я написал - один к одному, без всяких изменений.


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


кекс
******

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



Цитата(Rst7 @ Jan 19 2006, 10:39) *
Как Вы думаете, я не на живом камне третий день е....сь? angry.gif Про код, который я написал - это проверочная вставка, для того, чтобы убедится, что именно камень. Код компилирован правильно, т.е. так, как я написал - один к одному, без всяких изменений.


Сделал нехитрый дивайс - разъем для 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
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2006, 10:57
Сообщение #27


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

Группа: Модераторы
Сообщений: 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


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


Участник
*

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



Бинарники смотрели ? Может криво компилятор генерит...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 19 2006, 12:07
Сообщение #29


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

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



Цитата(ObitJr @ Jan 19 2006, 13:55) *
Бинарники смотрели ? Может криво компилятор генерит...


Грузил в AVRStudio, смотрел на дизасм, трассировал, сравнивал код с даташитом. Все правильно.


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


Гуру
******

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



Цитата(Rst7 @ Jan 19 2006, 19:07) *
Цитата(ObitJr @ Jan 19 2006, 13:55) *

Бинарники смотрели ? Может криво компилятор генерит...


Грузил в AVRStudio, смотрел на дизасм, трассировал, сравнивал код с даташитом. Все правильно.



А если пойти другим путем, тестовый Ваш код запустить на другом камне, вернее другого типа - тини13,14, 15 или любом другом тини? Какие там будут результаты?


--------------------
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 Текстовая версия Сейчас: 19th July 2025 - 11:59
Рейтинг@Mail.ru


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