обращусь к спецам по i51 Решил скрестить ужа и ежа: STC8H1K08 на bascom-51 Осилил режимы портов , резистор-подтяжку устанавливаю, кнопку опрашиваю, светодиодом управляю, Int0/Int1 работают и режим реакции задаю. Работа uart 1 и 2 (через регистры, а не через встроенную команду PRINT)
Смутил факт: не могу в компиляторе создать переменные суммарно больше 30 байт - компилятор выдаёт ошибку нехватки памяти. Переменные в IRAM. Попробовал перенести некоторые в XRAM (она есть в МК) - объём кода программы резко растёт, почти на треть! До этого с i51 не работал. Но в описании к МК указано:
SRAM • 128 bytes internal direct access RAM (DATA, use keyword data to declare in C language program) • 128 bytes internal indirect access RAM (IDATA, use keyword idata to declare in C language program) • 1024 bytes internal extended RAM (internal XDATA, use keyword xdata to declare in C language program)
что я не так делаю и где рыть?... Переходить в Кейл очень не хочется по множеству причин...
Последний раз редактировалось aleksandr-zh Пт янв 05, 2024 15:00:34, всего редактировалось 1 раз.
Насчет basocm-51ничего сказать не могу - работаю с mcs51 под ассемблером (c51asm от атмел). Относительно распределения ОЗУ... Для 51й актуальны первые 128 байт(0х00 - 0х7F DATA ) - доступ как для прямой, так и для косвенной адресации. Расширенная область 0х80 - 0хFF IDATA используется только командами косвенной адресации (чаще для стека). Для доступа к встроенной дополнительной ОЗУ помимо команд доступа к внешней памяти может использоваться и специальный механизм из нескольких команд (естественно увеличивает объем программы). Кристаллы с такой начинкой редкость - надо детально документацию на конкретный кристалл изучать. Доступ к XDATA обычно подразумевает доступ к Внешней Памяти Данных, а расширенное встроенное ОЗУ может именоваться как ESEG (internal extended data memory). Так по крайней мере у моего юзерс мануал по компилятору (аналогичен кейловскому за некоторыми отличиями). Ну и помимо того может быть встроена не ОЗУ, а ЕЕПРОМ ... Тогда имеем дело с FDATA (internal non volatile data memory) и соответственно наиболее "навороченный" способ доступа в этом случае будет.
Ну и изучить детально документ из 1502 страниц на китайском... Дабы чего-то в том STC8H1K08-36I-TSSOP20 понимать можно было... Это таки весьма напряжно...
Последний раз редактировалось BOB51 Пт янв 05, 2024 15:01:05, всего редактировалось 1 раз.
А посоветуете disassembler? Глянуть, что генерирует компилятор...
На просторах нашел комментарий про данный компилятор: Внутренне используется максимум 32 байта. Это зависит от используемых операторов. Стек также использует некоторое пространство. Таким образом, количество переменных, которые вы можете использовать, зависит от используемых операторов. В худшем случае используется (32+16+8) = 56 байт.
A maximum of 32 bytes is used internally. This depends on the used statements. The stack uses some space too. So it depends on the used statements how much variables you can use. In the worst case (32+16+8) = 56 bytes are used.
STC8H-en.pdf
Встроенное расширенное ОЗУ В дополнение к 256 байтам внутренней оперативной памяти в микроконтроллерах серии STC8H интегрировано встроенное расширенное ОЗУ. Метод доступа к встроенной расширенной оперативной памяти такой же, как и у традиционного микроконтроллера 8051, обращающегося к внешней расширенной оперативной памяти. Однако порт P0 (шина данных и шина младшего адреса), порт P2 (шина адреса старшего уровня), RD, WR и ALE не затрагиваются. На языке ассемблера доступ к встроенной расширенной оперативной памяти осуществляется с помощью инструкции MOVX. Обратите внимание, что pdata — это младшие 256 байтов xdata. После объявления переменной как типа pdata в программе C компилятор автоматически разместит переменные в диапазоне от 0000H до 00FFH в XDATA и будет использовать MOVX @ Ri, A и MOVX A @ Ri. для доступа. Бит управления EXTRAM, расположенный в регистре AUXR, используется для управления доступом к встроенной расширенной оперативной памяти.
7.2.3 On-chip extended RAM In addition to 256 bytes of internal RAM, on-chip extended RAM is integrated in STC8H series of microcontrollers. The method of accessing the on-chip extended RAM is the same as that of the traditional 8051 MCU accessing the external extended RAM. However, the P0 port (data bus and low-order address bus), P2 port (high-order address bus), RD, WR and ALE are not affected.
In assembly language, the on-chip extended RAM is accessed through the MOVX instruction, MOVX A,@DPTR MOVX @DPTR,A MOVX A,@Ri MOVX @Ri,A In C language, xdata / pdata can be used to declare the storage type, such as, unsigned char xdata i; unsigned int pdata j; Note that pdata is the lower 256 bytes of xdata. After declaring a variable as the pdata type in C program, the compiler will automatically allocate the variables in the 0000H to 00FFH of XDATA and use MOVX @ Ri, A and MOVX A @ Ri to access. The control bit EXTRAM located in AUXR register is used to control the access of on-chip extended RAM can be used or not.
STC8H-en.pdf у меня нету. Судя по приведенному Вами - стандартный набор команд доступа к ВПД. Но там должен использоваться механизм разделения областей доступа. Для малолапых "по умолчанию" это раздел ВПД, а для "полноформатных" с Р0, и Р2 видимо флаг в каком- нибудь из РОН ( тот же AUXR или чего еще), возможны и варианты... МК эти относительно новые так что компилятор может их просто не знать. А каким образом добавить новшества - зависит от глубины знаний конкретного компилятора. Для ассемблера это самостоятельное написание *.inc файла, для Си или другого компилятора - что-то свое...
Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов.
Для ассемблера это самостоятельное написание *.inc файла, для Си или другого компилятора - что-то свое...
в Баском это DAT файл, я его раскурил на примерах и сделал свой. Компилятор проглотил и в железе мои творения работают. вот с памятью пока не вкуриваю... Нашел у себя несколько книг по i51, пробую понять. И не очень понятно, почему Баском даёт возможность сделать только 32 байта в переменных. Это очень сильная для меня подстава. Автор не отвечает: с начала СВО написал гневное сообщение на своём сайте, потом залочил всех по IP и RU. На письма не отвечает, хъотя у меня лицензия и клиентов я ему подгонял, и донатил пару раз. Такая она, пропаганда ... ((
Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов.
Допустим ЯВУ... Для 51й это SDCC (Си)... У Яву свое понимание стека и рабочей области ОЗУ. Ежли в компиляторе жестко заложено использование "стандартного ОЗУ", то обойти данное ограничение довольно сложно. К примеру, помимо собственного файлика описания ресурсов иногда требуется отменить "шаблон по умолчанию" (обе "добавки" вводятся в текст исходника или в опции запуска компилятора).
Ну уж "хрен редьки не слаще" - те же 1177 страничек без перспектив работы с данным кристаллом. Когда-то с трудом приобрел пару STC15F204EA 351 - так и вылеживаются "до возможно лучших времен". Поигрался только с их программатором (STC-ISP V6.86) да сделал добавочный файлик для работы под с51asm (атмелевский ассемблер для 51-х). Для STC8H, кстати, требуется более современная версия той софт - оболочки. Причем софтинка только на прошивку рассчитана - читать код она не умеет (основана на встроенном при изготовлении бутлоадере). Второй нюенс - описание примеров в даташитах от STC дается или для ассемблера или для SDCC - следовательно так или иначе надо данные компиляторы осваивать. Ежли с ассемблером проблем нету, то SDCC таки чуток посложнее (с учетом самостоятельного написания make файлов для запуска).
Гляну как нибудь по настроению/возможности ту даташитину, может чего интересного найдется.
Адрес начала стека по умолчанию SP = 0х07, стек "растет вверх". Сам стек может находится только в области РПД для 51й 0х00-0х7F, для 52й 0х00 - 0хFF. (У 52х очень удобно при инициализации устанавливать SP на 0х7F). Команды JZ/JNZ проверяют содержимое аккумулятора на соответствующее содержание (именно содержимое, а не флаг Z !). Засылка 0х00 в АСС это тоже операция.
В принципе все есть в соответствующей документации:
То, что JNZ/JZ работают и так - выяснил и по книге, и по экспериментам. А вот то, что с банком регистров номер 1 оно не работает - странно. Работает с 0 и 2, 3 не проверял.
Просто всю документацию в голове не удержать, и обычно хватает таблички опкодов. Но в этот раз вот такое получилось, видимо, из-за подпрограмм в прерывании (и подпрограмм в подпрограммах) - раньше я такой вложенности на МК не делал.
Сейчас уже проблема подружить МК с ht1381, и если прочитать получается, то записать ничего, даже защиту записи не отключить.
Насчет "не работает с банком1"... Не забываем включать соответствующий банк (в том числе и указывать о том компилятору). Как в компиляторе прописывать -смотреть надо документацию. Я пользуюсь атмелевским c51asm -в нём это директива .USING К примеру там для правильного обращения при использовании AR0 -AR7 (синонимы r0-r7 в текущем банке) : ;ставим команды установки регистрового банка ; для железа МК setb rs0 .using 1 ; переход на банк 1 для ar0-ar7 ;для компилятора ; код пользователя ;возвращаем банк в железе clr rs0 .using 0 ; возврат в банк 0 для ar0-ar7 ;для компилятора И соответственно указывать переключение установкой флагов rs1:rs0 в PSW для переключения банков в МК.
D0-D7 могут быть не прописаны в подключаемых "по умолчанию" файлах. Вариант описания ресурсов "по умолчанию" зависит от компилятора. Чего не хватает и/или чего самодельного (типа макросов и обьявлений) добавляем самостоятельно. Обычно обязательным "по умолчанию" является описание стандартных ресурсов для MCS51, далее опционно можно переключить на MCS52 (смотри описание компилятора). Следующий нюенс... В описании может иметь место разница между D0-D7 и 0xD0 - 0xD7 поскольку обычно положение бит в байте часто обозначается как просто константы: Спойлер
а 0xD0 - 0xD7 это уже адреса области прямоадресуемых бит, которые имеют собственные имена. В нашем случае 0xD3 это RS0, а 0xD4 это RS1 (RS1:RS0 объявлены "по умолчанию" для всех MCS5х МК). Кроме того предпочтительно изменять оба флага или сделать макрос вида (компилятор с51аsm): Спойлер
Код:
SEL_RB macro num ;; управление выбором регистрового банка if num = 0 clr RS0 clr RS1 elseif num = 1 setb RS0 clr RS1 elseif num = 2 clr RS0 setb RS1 elseif num = 3 setb RS0 setb RS1 endif endm
И перед переключением засылать PSW в стек с последующим восстановлением PSW (обратное переключение на исходный бенк).
Мой компилятор переварит всё, так как это я сам. Так что я могу делать любые финты ушами в меру знаний.
А вот напоминание про сохранение в стек ССП - это разумное напоминание, я совершенно забыл про него. Впрочем, оно и так работает, часы на 89с2051 и ht1381.
На компьютере в блокноте. А потом так же ручками перебиваю коды в то, что может прошить эти самые 2051. Хотя можно и сделать, чтобы программатор "кушал" блокноты, но так как это нужно раз в год, то мне и так нормально.
Жестковато однако... Да и ошибок можно наделать. Гораздо удобнее использовать специализированный текстовой редактор и компилятор с запуском из командной строки или еще удобнее IDE ... Под виндовс их в достатке (в том числе и свободно-бесплатных).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения