Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4472275#p4472275"]если что-то закажут, тогда новый модуль использую в мк, а иначе никак :)
Поэтому, MCCP, USART, ADC, DAC, Vref, PWM, Timers, ну и тому подобное использую.
Более новое - нет, потому как никто пока ничего не заказывал.
..[/uquote]
Модули не заказывают. Заказывают функционал изделия. А как он реализован и на каких модулях - дело разработчика.
Поэтому, например, при реализации генератора с высоким разрешением один ставит внешний DDS, а другой использует внутренний NCO в сочетании с PWM.
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

Уважаемые спецы, помогите разрешить непонятку.
вот этот код все делает верно:

Код: Выделить всё

//xc8
const uint8_t R1 @0x18D0=0xAA;
EEADR=(uint8_t)&R1;
EEADRH=((uint16_t)&R1)>>8;
но без абсолютного размещения:

Код: Выделить всё

const uint8_t R1=0xAA;
пишется мусор. Что я упускаю?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Константа глобальная?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

Да, определена вне всего.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Нужны подробности.
1. Куда линкер размешает константу без абсолютного адреса?
2. Какой контроллер?
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

Сейчас переместил определение в основной цикл - ничего не изменилось, даже хэш тот же. В принципе оно и справедливо. Это же const. Как его видимость может на что-то влиять.......

Вообще, на этот феномен натолкнулся случайно. Решил немножко подмодифицировать старый код и в числе прочего перенести всё из eeprom во flash ..... и вот на копировании в EEADR остановился. Разумеется, пробовал разное, что в голову приходило, попутно делал и другие изменения, адреса менялись, но проблема оставалась.......
На данный момент, например, компилятор эту константу разместил по 0x7C5

вот такой код в начале основного цикла:

Код: Выделить всё

IMP=(uint16_t)&R1;
EEADR=(uint8_t)&R1;
EEADRH=((uint16_t)&R1)>>8;
дает в итоге:
IMP== 0x8006 // иногда бывает 0x8005, как-то зависит от других изменений в коде
EEADR==0xC5 //что правильно, но бывает и 0x05||0x06
в EEADRH нули // что не правильно, но бывало и 0x80

чип 16f886

Но стоит только зафиксировать адрес, скажем на 0x7D0, то сразу получаю в тех регистрах 0x87D0, что абсолютно верно.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4473213#p4473213"]Как его видимость может на что-то влиять...[/uquote]
Легко. Он может вообще перекочевать в ОЗУ, если не будет квалификатора static.
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пт мар 29, 2013 23:53:14

Сообщение ALEKS1102X »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4473159#p4473159"]Уважаемые спецы, помогите разрешить непонятку.
вот этот код все делает верно:

Код: Выделить всё

//xc8
const uint8_t R1 @0x18D0=0xAA;
EEADR=(uint8_t)&R1;
EEADRH=((uint16_t)&R1)>>8;
но без абсолютного размещения:

Код: Выделить всё

const uint8_t R1=0xAA;
пишется мусор. Что я упускаю?[/uquote]

Может лучше вот так:

volatile const R1 __at(0x18D0) = 0x00AA;

EEADR = (uint8_t)(R1);
EEADRH = (uint8_t)(R1 >> 8);

Только для Родэрик:
https://disk.yandex.ru/d/qeZEpqHLQdg1cw

Добавлено after 36 minutes 3 seconds:
[uquote="Родэрик",url="/forum/viewtopic.php?p=4471651#p4471651"][uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4471619#p4471619"]Ладно, не нравиться правда, больше не буду приходить в течение года :)[/uquote]
Не впадай в крайности. Мне вот лично нравится правда. Создай свою тему и рули там. Что-то в стиле "советы мастера ", "правда о блоках"...... итд. Уверен, мало кто пройдёт мимо.[/uquote]

Нет времени темы возглавлять.
Проще - зайти пару раз в неделю/месяц, и помочь кому-то, ну, если есть возможность помочь ...
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475279#p4475279"]volatile const R1 __at(0x18D0) = 0x00AA;[/uquote]
Ты же ничего не изменил... :)))
У него и без volatile все нормально работает.
Вопрос был про отсутствие абсолютного адреса.
А ты просто заменил символ @ на __at.
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пт мар 29, 2013 23:53:14

Сообщение ALEKS1102X »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4475327#p4475327"][uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475279#p4475279"]volatile const R1 __at(0x18D0) = 0x00AA;[/uquote]
Ты же ничего не изменил... :)))
У него и без volatile все нормально работает.
Вопрос был про отсутствие абсолютного адреса.
А ты просто заменил символ @ на __at.[/uquote]

В адресе _ почти ничего : :))) если не считать что там была ошибка - адрес для пик16-18 в любом случае это не "uint8_t", и значение он собирался сохранить 16-ти значное ...
А вот после ... человек обращается к значению того адреса - младшего, ну в принципе - нормально ...
А вот дальше !!! :)
Он пытается считать старший байт ВОСЬМИ-битного регистра :) Даже не так ! Там написана БЕЛЕБЕРДА :)
Есть желание (КРАМ), то расшифруйте - что там написано :)

А в остальном - ДА! - одно и то же :)

const uint8_t R1 @0x18D0=0xAA; - вот это ЧТО? По адресу 0x18D0 записать значение 0хАА ? правильно ?

ну понятно, что:
следующая команда будет корректной - будет считано 0хАА,
а вот следующая команда - это НЕЧТО!
В восьмибитный байт "ADRESH" загрузить 16-ти битную пародию .... константы, которая уже закончилась (она была восьмибитной) ... да там вообще не читаемо ....

Немного может не в тему, но чем отличается "@" и "__at() :
Я не уверен, что просто объявив адрес напрямую "@" - после компиляции - проц запустится ?!?
Просто к примеру, в том месте ПЗУ на данный момент находилась уже прошивка (некий код, который туда кинул ХС8) ...
Вот через "__at" я точно уверен, что МПЛАБ подвинется, а через прямую вставку адреса ... да хер его знает ...
Последний раз редактировалось ALEKS1102X Вс сен 10, 2023 16:47:20, всего редактировалось 1 раз.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475279#p4475279"]Может лучше вот так:

volatile const R1 __at(0x18D0) = 0x00AA;

EEADR = (uint8_t)(R1);
EEADRH = (uint8_t)(R1 >> 8);[/uquote]

а что здесь "лучше"....... volatile? - это никак не влияет. Что касается следующих строк...... речь же не шла о содержимом....

Ну это ладно ..... я же в принципе обратился, думал что с таким давно уже народ сталкивался ....... и есть какое-то объяснение такого поведения, но ......


А что касается результатов моих исследований, почему именно так себя ведет 1.33 с 16f88x (с 12F1572 например все нормально в аналогичной ситуации) я не знаю, да и честно говоря не хочу тратить слишком много времени выясняя это, поскольку эта "проблема" легко обходится - достаточно просто чтобы была хоть одна константа с абсолютным размещением, скажем по последнему адресу (для 886)

Код: Выделить всё

const uint8_t R1 @0x1FFF;
и тогда феномен исчезает.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пт мар 29, 2013 23:53:14

Сообщение ALEKS1102X »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4475340#p4475340"][uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475279#p4475279"]Может лучше вот так:

volatile const R1 __at(0x18D0) = 0x00AA;

EEADR = (uint8_t)(R1);
EEADRH = (uint8_t)(R1 >> 8);[/uquote]

а что здесь "лучше"....... volatile? - это никак не влияет. Что касается следующих строк...... речь же не шла о содержимом....

Ну это ладно ..... я же в принципе обратился, думал что с таким давно уже народ сталкивался ....... и есть какое-то объяснение такого поведения, но ......


А что касается результатов моих исследований, почему именно так себя ведет 1.33 с 16f88x (с 12F1572 например все нормально в аналогичной ситуации) я не знаю, да и честно говоря не хочу тратить слишком много времени выясняя это, поскольку эта "проблема" легко обходится - достаточно просто чтобы была хоть одна константа с абсолютным размещением, скажем по последнему адресу (для 886)

Код: Выделить всё

const uint8_t R1 @0x1FFF;
и тогда феномен исчезает.[/uquote]

volatile влияет на то, что если ты не используешь данный регистр, то при оптимизации 3, и при НЕиспользовании - ХС8 его просто проигнорирует :) не включит в проект.

Для остальных оптимизаций - это не имеет значения.

Так а в чём проблема ?

До сих пор значения адреса EEPROM не соответствуют той константе ?
Последний раз редактировалось ALEKS1102X Вс сен 10, 2023 17:00:25, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475336#p4475336"]а вот следующая команда - это НЕЧТО!
В восьмибитный байт "ADRESH" загрузить 16-ти битную пародию .... константы, которая уже закончилась (она была восьмибитной) ... да там вообще не читаемо ....[/uquote]
:))) Вообще то в ADRESH грузится старший байт АДРЕСА константы, а не константа... Ты в курсе что означает в Си амперсанд?
[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475336#p4475336"]Немного может не в тему, но чем отличается "@" и "__at() :
Я не уверен, что просто объявив адрес напрямую "@" - после компиляции - проц запустится ?!?
Просто к примеру, в том месте ПЗУ на данный момент находилась уже прошивка (некий код, который туда кинул ХС8) ...
Вот через "__at" я точно уверен, что МПЛАБ подвинется, а через прямую вставку адреса ... да хер его знает ...[/uquote]
@ и __at ничем друг от друга не отличаются. Символ @ по английски звучит как at.
:tea: :)))
Не надоело писать пургу?
[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475352#p4475352"]если ты не используешь данный регистр[/uquote]
Вообще то он его использует.
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пт мар 29, 2013 23:53:14

Сообщение ALEKS1102X »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4475354#p4475354"][uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475336#p4475336"]а вот следующая команда - это НЕЧТО!
В восьмибитный байт "ADRESH" загрузить 16-ти битную пародию .... константы, которая уже закончилась (она была восьмибитной) ... да там вообще не читаемо ....[/uquote]
:))) Вообще то в ADRESH грузится старший байт АДРЕСА константы, а не константа... Ты в курсе что означает в Си амперсанд?
[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475336#p4475336"]Немного может не в тему, но чем отличается "@" и "__at() :
Я не уверен, что просто объявив адрес напрямую "@" - после компиляции - проц запустится ?!?
Просто к примеру, в том месте ПЗУ на данный момент находилась уже прошивка (некий код, который туда кинул ХС8) ...
Вот через "__at" я точно уверен, что МПЛАБ подвинется, а через прямую вставку адреса ... да хер его знает ...[/uquote]
@ и __at ничем друг от друга не отличаются. Символ @ по английски звучит как at.
:tea: :)))
Не надоело писать пургу?
[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475352#p4475352"]если ты не используешь данный регистр[/uquote]
Вообще то он его использует.[/uquote]


__at ... вообще-то у Микрочип -это : "attribute", и можно посмотреть это в справочнике по MPLABX, а значёк @ по системе ASCII = 0x40.
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475360#p4475360"]__at ... вообще-то у Микрочип -это : "attribute"[/uquote]
Это твоя разнузданная фантазия. Спецификатор attribute никакого отношения к at не имеет.
[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4475360#p4475360"]а значёк @ по системе ASCII = 0x40.[/uquote]
И что из этого следует? Причем тут ASCII код символа?
ЗЫ. В русском языке слово "значок" пишется через "о". Учи русский язык, прежде чем писать всякую пургу... :)))
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

:))) :))) :)))
скажем так, прошлые страницы тоже нехило так позабавили, но нынче прям до слёз......
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пт мар 29, 2013 23:53:14

Сообщение ALEKS1102X »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4475365#p4475365"]:))) :))) :)))
скажем так, прошлые страницы тоже нехило так позабавили, но нынче прям до слёз......[/uquote]

Ну что? вдоволь позабавились по поводу "Ё" и "о" ?
Ну тогда давайте разберём - что такое в пик16 - программная память :)
Адресация команд урезанная, всего 14 бит из 16-ти, полноценного перехода (линейного) по адресу нету :)
Табличного чтения НЕТ, а значит - можно уйти по некоему адресу, и вернуться оттуда - только если там будет команда "RETLW".
Обычно - это и выполняется в этих процах.
Естестевенно - ни ПИСАТЬ, ни ЧИТАТЬ таблично FLASH - этих процев невозможно!

Теперь давай посмотрим на запись:

//xc8
const uint8_t R1 @0x18D0=0xAA;
EEADR=(uint8_t)&R1;
EEADRH=((uint16_t)&R1)>>8;

константа адреса, которая равна 0xAA, ну ладно, с этим можно смириться, как и с тем, что САМ указав константу адреса - после (во второй строке) хочет её считать :) ...
Но третья строка: от значения 8 бит - сделать 16-надцать бит (ДОЛБНЮ понятно - что это НОЛЬ). что бы потом разместить в старший адрес :)

Здесь на форуме есть кто-нибудь, кто скажет - что такое пишут только после третьего тазика водки? или всем всё нравится ?

Ну и наконец последнее: а стесняюсь спросить - а что эти действия дают в плане прошивки?
ПОЛНОЕ значение из ПЗУ не считаешь - возможности данной серии камней не позволяют, записать тоже нельзя ...
Зачем знать адрес той ячейки, в которой разместил команду:
RETLW 0xxx ???
Ты её и так сохранил в качестве:
const uint8_t R1 &(0x18D0) = 0xAA;

Сам говорил что предпочитаешь правду, но ведёшься на другие правды :)
Поставщик валерьянки для Кота
Сообщения: 1974
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

В других компиляторах (CCS), в другом языке (C) есть доступ для чтения и записи в память программы. Не знаю как делает, но функции есть и за рассматриваемого МК.

Из Help:

Код: Выделить всё

write_program_memory( address, dataptr, count);
Function: Writes count bytes to program memory from dataptr to address.

read_program_memory( )
Function: Reads count bytes from program memory at address to RAM at dataptr.
---
Если поможет, фрагмент из файла .lst:
(для меня ASM: незнакомая часть)

Код: Выделить всё

.. write_program_memory(0x18D0, 0xAA, 1);
0089:  MOVLW  18
008A:  MOVWF  0F
008B:  MOVLW  D0
008C:  MOVWF  0D
008D:  MOVLW  AA
008E:  MOVWF  04
008F:  BCF    03.7
0090:  MOVLW  01
0091:  BCF    03.6
0092:  MOVWF  21
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25862
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4478412#p4478412"]ЧИТАТЬ таблично FLASH - этих процев невозможно![/uquote]
:))) :))) :)))
Я чувствую, что тебе не надоело быть клоуном...
Открываем даташит и внезапно видим:

Изображение Изображение
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

[uquote="ALEKS1102X",url="/forum/viewtopic.php?p=4478412#p4478412"]Теперь давай посмотрим на запись:

//xc8
const uint8_t R1 @0x18D0=0xAA;
EEADR=(uint8_t)&R1;
EEADRH=((uint16_t)&R1)>>8;

константа адреса, которая равна 0xAA, ну ладно, с этим можно смириться, как и с тем, что САМ указав константу адреса - после (во второй строке) хочет её считать :) ...
Но третья строка: от значения 8 бит - сделать 16-надцать бит (ДОЛБНЮ понятно - что это НОЛЬ). что бы потом разместить в старший адрес :)[/uquote]
2023-09-19_221528.jpg
(53.86 КБ) 128 скачиваний
Контактная информация:
Ответить

Вернуться в «PIC»