Перейти к содержанию
    

Похоже баг CPU core ATTiny26

Добрый день.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Извиняюсь, не заметил. Но все-таки в Tiny2313, на асме, я пользовался всего одним регистром в качестве указателя, при этом в старших половинах указателей хранил глобальные переменные программы, и все работало на ура...

 

 

 

Я ожидаю, что при выполнении сл. действий:

 

X=0x380;

LD R16,X+;

 

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

 

Вообще-то ячейки SRAM с адресом 0x380 в ATtiny26 не существует, если уж подходить к этому вопросу принципиально, и МК имеет полное право заглючить с данным указателем. В даташите на рассматриваемый МК ничего не сказано по поводу обращений к несуществующим адресам. там сказано про 16-разрядные указатели при обращении к памяти, и что область памяти расположена с 0х0060 по 0х00DF. Вы пробовали обращаться к валидным адресам?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ожидаю, что при выполнении сл. действий:

 

X=0x380;

LD R16,X+;

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извиняюсь, не заметил. Но все-таки в Tiny2313, на асме, я пользовался всего одним регистром в качестве указателя, при этом в старших половинах указателей хранил глобальные переменные программы, и все работало на ура...

...

Вообще-то ячейки SRAM с адресом 0x380 в ATtiny26 не существует, если уж подходить к этому вопросу принципиально, и МК имеет полное право заглючить с данным указателем. В даташите на рассматриваемый МК ничего не сказано по поводу обращений к несуществующим адресам. там сказано про 16-разрядные указатели при обращении к памяти, и что область памяти расположена с 0х0060 по 0х00DF. Вы пробовали обращаться к валидным адресам?

 

Не я обращаюсь к невалидным адресам. ИАР С в старшем байте X хранит переменную (как Вы на Tiny2313). Когда он использует X+ (при этом в младшем байте валидный поинтер), старший байт (и соответственно, переменная) портится. На прошлых процах такого не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем так. Вытащил свежий 8-bit AVR Instruction Set от 11/05. В нем открытым текстом написано:

 

LD - Load Indirect from Data Space to Register using Index X

....

Регистр-указатель X может быть неизменен или может быть пост-икрементирован или пред-декрементирован .... Имейте в виду, что только младший байт X-указателя изменяется в устройствах с размером области данных не более 256 байт. Для этих устройств старший байт указателя НЕ ИСПОЛЬЗУЕТСЯ ПРИ ВЫПОЛНЕНИИ ИНСТРУКЦИИ И МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ДЛЯ ДРУГИХ ЦЕЛЕЙ (большие буквы - мои ;) Перевод тоже)...

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А портиться только после Х+/Х- ?

При обычном использовании порядок?

Не пробовали тот же фокус с Y и Z?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ожидаю, что при выполнении сл. действий:

 

X=0x380;

LD R16,X+;

 

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

 

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

 

По большому счету, скажите зачем использовать IAR для камня с 2kb Flash и 128 байт RAM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ожидаю, что при выполнении сл. действий:

 

X=0x380;

LD R16,X+;

 

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

 

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

 

Вы невнимательно читаете мои посты. Я уже привел перевод из документации Atmel, который черным по белому говорит, что то, что я ожидаю, должно произойти и не должно привести к каким-либо непредсказуемым последствиям.

 

По большому счету, скажите зачем использовать IAR для камня с 2kb Flash и 128 байт RAM?

 

Так надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы невнимательно читаете мои посты. Я уже привел перевод из документации 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: такой эксперимент я уже проделал, угадайте результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы невнимательно читаете мои посты. Я уже привел перевод из документации 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: такой эксперимент я уже проделал, угадайте результат.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Сделал нехитрый дивайс - разъем для 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже сделал код:

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...