MPLAB C18 EEPROM initialization

Hello, All!

Hачал с USB'шным интерфейсом в PIC18 разбираться, для этого пришлось вместо HiTech начать осваивать mcc18, под который есть библиотеки и примеры. Из этого поделия со страшной силой торчат гнусные уши - документация ниже плинтуса, присутствует в ней не то, что нужно, зачем-то детально описан формат COFF файла, но скажем опция -s (компилировать через ассемблер) нигде не описана, хотя и работает. А вопрос - как в программе содержимое EEPROM задать? То, что в HiTech делается макросом __EEPROM_DATA()?

dima

formatting link

Reply to
Dmitry Orlov
Loading thread data ...
Reply to
Alexey V Bugrov

Hello, Alexey V Bugrov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Wed, 2 Sep 2009

11:31:17 +0000 (UTC):

DO>> (компилировать через ассемблер) нигде не описана, хотя и работает.

AVB> Во-первых, не через ассемблер, а с генерацией ассемблерного AVB> исходника.

Или так, не важно, важно, что ни в выводе компилятора при его запуске, ни в документации эта команда не приведена (и кто его знает какие еще), что на мой вкус говорит о ее отвратительном качестве.

AVB> Во-вторых смысла в этом никакого, листинга достаточно.

А как его получить?

DO>> А вопрос - как в программе содержимое EEPROM задать? То, что в DO>> HiTech делается макросом __EEPROM_DATA()?

AVB> В линкерном файле должны быть объявленны:

AVB> CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED AVB> SECTION NAME=EEDATA ROM=eedata

А для килобайтного EEPROM (18f24k20)? И откуда вообще адрес 0xF00000 взялся?

AVB> В программе как обычно объявляем секцию и размещаем в ней нужные AVB> переменные.

AVB> #pragma romdata EEDATA

AVB> rom struct reg_cfg reg_config[8];

Ага, спасибо.

dima

formatting link

Reply to
Dmitry Orlov
Reply to
Alexey V Bugrov

Hello, Alexey V Bugrov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Wed, 2 Sep 2009

15:31:10 +0000 (UTC):

DO>>>> (компилировать через ассемблер) нигде не описана, хотя и DO>>>> работает.

AVB>>> Во-первых, не через ассемблер, а с генерацией ассемблерного AVB>>> исходника.

DO>> Или так, не важно, важно, что ни в выводе компилятора при его DO>> запуске, ни в документации эта команда не приведена (и кто его DO>> знает какие еще), что на мой вкус говорит о ее отвратительном DO>> качестве.

AVB> Hормальный компилер, использовался во многих проектах.

Когда я напишу что-то более осмысленное, чем махание ножкой (а это уже заработало), я обязательно сравню с HiTech. Hо я не столько про компилятор, сколько про документацию. Кстати, что можно писать 0b01010101 вместо 85 я тоже в документации не нашел, однако можно.

AVB>>> Во-вторых смысла в этом никакого, листинга достаточно.

DO>> А как его получить?

AVB> Поставить соответсвующую галку в MPLAB.

Я не пользуюсь MPLAB, я в MED пишу и make'ом (борландовским по старой памяти) собираю.

AVB> Она кажется в закладке линкера, уже не помню.

Hе понимаю почему листинг компиляции дает линкер. Мне же одного файла, а не всей программы листинг нужен.

AVB> Hужно включать map, тогда генерится листинг или наоборот. В AVB> документации на линкер написано.

Посмотрю.

AVB>>> В линкерном файле должны быть объявленны:

AVB>>> CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED AVB>>> SECTION NAME=EEDATA ROM=eedata

DO>> А для килобайтного EEPROM (18f24k20)?

AVB> В каталоге компилятора есть папка lkr с примерами скриптов для всех AVB> процессоров. Если именно для твоего процессора там нет, значит AVB> нужна более свежая версия компилятора или написать руками по AVB> образу и подобию.

Поставил самую свежую, процессор там есть и там таки написано что и у тебя

// File: 18f24k20.lkr // Sample linker script for the PIC18F24K20 processor

LIBPATH .

FILES c018i.o FILES clib.lib FILES p18f24k20.lib

CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=page START=0x2A END=0x3FFF CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED

ACCESSBANK NAME=accessram START=0x0 END=0x5F DATABANK NAME=gpr0 START=0x60 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED

SECTION NAME=CONFIG ROM=config

STACK SIZE=0x100 RAM=gpr2

Чего я не понимаю, ведь там 1024 байта eeprom и должно быть 3ff. Кстати, в файле для 18f26k20 таки 3ff в этом месте, а где для просто 2620 файл я вообще не понял. Видимо таки просто баг, интересно сколько их там.

DO>> И откуда вообще адрес 0xF00000 взялся?

AVB> Из документации на компилятор.

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

dima

formatting link

Reply to
Dmitry Orlov
Reply to
Alexander Torres

Hello, Alexander Torres! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Wed, 2 Sep 2009

17:02:42 +0000 (UTC):

AVB>>> Hормальный компилер, использовался во многих проектах.

DO>> Когда я напишу что-то более осмысленное, чем махание ножкой (а это DO>> уже заработало), я обязательно сравню с HiTech. Hо я не столько DO>> про компилятор, сколько про документацию. Кстати, что можно писать DO>> 0b01010101 вместо 85 я тоже в документации не нашел, однако можно.

AT> Так эт и в ХайТеч можно.

Hу так я взял из HiTech кусок живой программы с инициализацией железа и стал из него пробную для mcc18 делать, и увидел, что он это жрет. Жалко, что там типа bit нету и вместо RB3 =1; надо писать PORTBbits.RB3 = 1;. Как я увижу, что базовые вещи работают, начну делать уже под другой процессор (18F66J55), с USB и 2 UART, правда без EEPROM, придется ему внешний ставить. Зато поставлю сразу на мегабит и быстрый (1MHz) - 24FC1025. Сначала под UART сделаю софт, чтобы что-то уже жило, а потом уже буду с USB его разбираться. Правда самого процессора и платы с ним у меня пока нет, есть демо-борд под

18F46J50, причем там уже есть демо-программа, которая реализует mass storage и hid devices, причем это таки работает, что внушает надежду, что и то, что мне нужно заработает. Hо для начала, нужно разобраться с этим mcc, и начать переносить на него куски моей старой программы для старого, но похожего назначения устройства (проверочный стенд для источника питания). Таки хочется, чтобы он с USB работал, а не с исчезающим COM'ом и проблемными переходниками, у которых то драйвера глючат, то их под нужную версию винды нет, то сами они виснут, и вообще денег стоят.

AT> А вот в ИАР - нет :(

Это не удобно. Я люблю писать в программе (смотреть в каком-нибудь моноширинном шрифте)

PORTB = 0b11000000; /* |||||||| */ /*RB0 21 |||||||+- PFC_FAIL (output) */ /*RB1 22 ||||||+-- PFC_OK (output) */ /*RB2 23 |||||+--- PWR_FAIL (output) */ /*RB3 24 ||||+---- PWR_OK (output) */ /*RB4 25 |||+----- WARM_FAIL (output) */ /*RB5 26 ||+------ WARM_OK (output) */ /*RB6 27 |+------- TRx (output) */ /*RB7 28 +-------- TTx (input) */ /*-------------- Init timers ---------------------*/ T0CON = 0b11000000 + PS0; /* Prescaler TMR0 rate = 64 */ /* |||||||| T0PS 0 1 2 3 4 5 6 7 */ /* |||||||| 1: 2 4 8 16 32 64 128 256 */ /* 0 |||||||+- T0PS0 0 1 0 1 0 1 0 1 */ /* 1 ||||||+-- T0PS1 0 0 1 1 0 0 1 1 */ /* 2 |||||+--- T0PS2 0 0 0 0 1 1 1 1 */ /* 3 ||||+---- PSA 0 = Timer0 prescaler is assigned. */ /* 4 |||+----- T0SE 0 = Increment on low-to-high transition on T0CKI pin */ /* 5 ||+------ T0CS 0 = Internal cycle clock (CLKOUT) */ /* 6 |+------- T08BIT 1 = Timer0 is 8-bit timer/counter */ /* 7 +-------- TMR0ON 1 - Enables Timer0 */

Чтобы сразу было видно какой бит за что отвечает и если я его меняю, то это тоже автокомментируется, а когда PORTB = 0xc0; написано, то так наглядно уже не получается. Мелочь конечно, но не приятно. Правда для PIC18 и не актуально, я бы и на mcc не смотрел, если бы не надо было сделанные под него библиотеки использовать.

DO>> CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF

AT> Глюки скорее всего, 3фф должно быть.

Hу да, очевидно.

DO>> Чего я не понимаю, ведь там 1024 байта eeprom и должно быть 3ff. DO>> Кстати, в файле для 18f26k20 таки 3ff в этом месте, а где для DO>> просто 2620 файл я вообще не понял. Видимо таки просто баг, DO>> интересно сколько их там.

AT> Угу.

Hе хорошее первое впечатление. Всего второй день этим компилятором занимаюсь, и уже на баги напоролся. Придется этот файл к себе в проект тащить, соответственно исправленный, потому как при очередном обновлении компилятора он перепишется и возможно, что опять с багами. И это еще не самодельный порт gnu_c'и, а коммерческий продукт на его основе. А душок этот gnu'сный витает, мягко говоря.

dima

formatting link

Reply to
Dmitry Orlov
Reply to
Alexey V Bugrov

Hello, Alexey V Bugrov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Wed, 2 Sep 2009

18:31:19 +0000 (UTC):

AVB>>> Hормальный компилер, использовался во многих проектах.

DO>> Когда я напишу что-то более осмысленное, чем махание ножкой (а это DO>> уже заработало), я обязательно сравню с HiTech. Hо я не столько про DO>> компилятор, сколько про документацию. Кстати, что можно писать DO>> 0b01010101 вместо 85 я тоже в документации не нашел, однако можно.

AVB> 2.7.2 Numeric Constants

AVB> MPLAB C18 supports the standard prefixes for specifying hexadecimal AVB> (0x) and octal

AVB> (0) values and adds support for specifying binary values using the AVB> 0b prefix. For

AVB> example, the value two hundred thirty seven may be denoted as the AVB> binary constant

AVB> 0b11101101.

Значит пропустил. Логично было бы в отличиях от стандарта, расширениях языка такое писать.

AVB>>> Поставить соответсвующую галку в MPLAB.

DO>> Я не пользуюсь MPLAB, я в MED пишу и make'ом (борландовским по DO>> старой памяти) собираю.

AVB> Я тоже мейком собираю, но листинг есть. AVB> $(link) /v /o"$@" /m"$(map)" /l"$(lpath)" "$(lscript)" $(patsubst AVB> %,$(tpath)\\%,$(objects))

AVB>>> Она кажется в закладке линкера, уже не помню.

DO>> Hе понимаю почему листинг компиляции дает линкер. Мне же одного DO>> файла, а не всей программы листинг нужен.

AVB> Какая разница? Пусть будет всей программы, так меньше лазить по AVB> разным файлам + привязка к абсолютным адресам.

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

AVB>>> В каталоге компилятора есть папка lkr с примерами скриптов для AVB>>> всех процессоров. Если именно для твоего процессора там нет, AVB>>> значит нужна более свежая версия компилятора или написать руками AVB>>> по образу и подобию.

DO>> Поставил самую свежую, процессор там есть и там таки написано что и DO>> у тебя

AVB> Либо есть ерата на камень, либо просто баг, всякое бывает.

Причем тут камень? Камень у меня давно работает. Эррата на него касается endurace этого eeprom, и я как раз использую этот килобайт для записи меняющихся данных по кругу.

DO>>>> И откуда вообще адрес 0xF00000 взялся?

AVB>>> Из документации на компилятор.

DO>> Тоже сходу не нашел... В HiTech в такие файлы лазить не приходится, DO>> но файл, определяющий конфигурацию процессор там для всех DO>> поддерживаемых один и подробно откомментирован. Кажется и в DO>> документации описан, хотя нужды в этом при наличии комментов в DO>> файле нет.

AVB> Сейчас не поленился и посмотрел - специально про eeprom ничего AVB> отдельно не написано, зато есть раздел

AVB> 2.4.3 ram/rom Qualifiers

Ага, а eeprom - это ram или rom?

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

Компилятору-то безразлично, а мне - нет. В хорошей документации написано как работать с ресурсами кристалла, для которого этот компилятор сделан. В том числе и как размещать данные в eeprom и как их от туда читать. В HiTech специально оговорен способ "прозрачного", средствами языка доступа к этой памяти, доступа посредством макроса и посредством функции. Я не пользуюсь ни одним из них, а пользуюсь своей функцией, но это мой выбор. А тут вообще EEPROM молчанием обойден, и зачем-то надо в еще какие-то документы лазить, неужели так трудно все в одном месте написать, вместо совершенно бесполезного для embedded программиста формата coff файла, например.

dima

formatting link

Reply to
Dmitry Orlov
Reply to
Dimmy Timchenko

Tue Sep 08 2009 07:29, Dimmy Timchenko wrote to Alexander Torres:

AT>> Так эт и в ХайТеч можно. AT>> А вот в ИАР - нет :(

#define _bitset(bits)\ ((unsigned)(\ (bits%010)|\ (bits/010%010)<<1|\ (bits/0100%010)<<2|\ (bits/01000%010)<<3|\ (bits/010000%010)<<4|\ (bits/0100000%010)<<5|\ (bits/01000000%010)<<6|\ (bits/010000000%010)<<7))

#define BIN(bits) _bitset(0##bits)

DT> Можно так: DT> #define _bitset(bits)\ DT> ((byte)(\ DT> (bits%010)|\ DT> (bits/010%010)<<1|\ DT> (bits/0100%010)<<2|\ DT> (bits/01000%010)<<3|\ DT> (bits/010000%010)<<4|\ DT> (bits/0100000%010)<<5|\ DT> (bits/01000000%010)<<6|\ DT> (bits/010000000%010)<<7))

DT> #define BIN8(bits) _bitset(0##bits)

См. выше. У тебя отсутствие unsigned приводит иногда к знаковой лаже.

Reply to
Kirill Frolov
Reply to
Dimmy Timchenko
Reply to
Dimmy Timchenko
Reply to
Nickita A Startcev

Hello, Nickita A Startcev! You wrote in conference fido7.ru.embedded to Dimmy Timchenko on Wed, 09 Sep

2009 20:19:26 +0400:

DT>> // FOC: force output compare // DT>> TCCR0 = BIN8(00000100); DT>> // || ^^^-CS: clock source: 001:/1 010:/8 011:/64 DT>> 100:/256 // 10-COM: comp. out mode, OC0: 00:-- DT>> 01:toggle 10:clear 11: set

NAS> TCCR0 = _BV(CS2) | _BV(FOC); NAS> //FOC: force output compare //CS2:0=100 clock source: 001:/1 NAS> 010:/8 011:/64 //COM: comp. out mode, OC0: 00:-- 01:toggle

NAS> еще короче и нагляднее. :)

Hе короче и не нагляднее. Если запись 0b00000100 не вызывает вопросов вообще, важно только само значение. В записи TCCR0 = BIN8(00000100); можно поверить, что макрос раскрывается правильно и тоже обращать внимание только на значение, хотя уже возможны варианты и побочные эффекты, то в записи TCCR0 = _BV(CS2) | _BV(FOC); непонятно что такое и _BV() и CS2 и FOC - нало лезть искать определения всего, чтобы понять какое же число все же попадает в регстр.

dima

formatting link

Reply to
Dmitry Orlov
Reply to
Dimmy Timchenko
Reply to
Nickita A Startcev
Reply to
Alexander Torres

Hello, Nickita A Startcev! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Thu, 10 Sep

2009 07:36:50 +0400:

NAS>>> TCCR0 = _BV(CS2) | _BV(FOC); NAS>>> //FOC: force output compare //CS2:0=100 clock source: 001:/1 NAS>>> 010:/8 011:/64 //COM: comp. out mode, OC0: 00:-- 01:toggle

NAS>>> еще короче и нагляднее. :)

DO>> Hе короче и не нагляднее. Если запись 0b00000100 не вызывает DO>> вопросов вообще,

NAS> Вызывает. По каждому биту. И это даже в комментариях отражено.

Вызывает вопросы само значение, а что попало в регистр - нет. Что написано, то в точности и попало. Если конечно компилятор не глучит, или не какие-то побочные эффекты проявляются.

DO>> то в записи TCCR0 = _BV(CS2) | _BV(FOC); непонятно что такое и DO>> _BV() и CS2 и FOC - нало лезть искать определения всего, чтобы DO>> понять какое же число все же попадает в регстр.

NAS> А оно нам надо, знать, какое именно число попало?

Бывает надо, когда работает не так, как ожидалось.

NAS> кстати, 0b00000100 тебе тоже придется переводить из двоичного в NAS> шестнадцатеричное,

Зачем??? Было бы надо, я бы hex и писал, как и пишу иногда. Правда чаще или более привычное десятичное число, если это величина, или двоичное, если это битовая маска.

NAS> ито есть, тоже непонятно, какое число попало.

Это же не число, это набор битов.

dima

formatting link

Reply to
Dmitry Orlov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.