|
|
  |
Keil C, AT89S8253, содержимое ячеек внутренней EEPROM |
|
|
|
Aug 9 2009, 20:06
|
Группа: Участник
Сообщений: 4
Регистрация: 9-08-09
Пользователь №: 51 806

|
Товарищи, не подскажите, есть ли способ в тексте программы на С задать начальные значания ячеек EEPROM, которые потом соответственно перекочуют в hex и оттуда в контроллер при прошивке?
|
|
|
|
|
Aug 10 2009, 07:10
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Имхо, Keil "заточен" под классические МК51, в которых EEPROM для хранения данных отсутствует, поэтому и такая "фича" в нём не предусмотрена. Однако, ничто не мешает Вам завести проект, который выдаст Вам нужный Вам hex-файл. Состоять он будет из одного файла на ассемблере, в котором определены нужные адреса и байты (слова) с нужными Вам значениями. Ещё, как вариант, в прикладной программе при включении МК предусмотреть проверку EEPROM на чистоту, и если записей нет - прописать "заводские" установки.
|
|
|
|
|
Aug 10 2009, 13:34
|
Группа: Участник
Сообщений: 4
Регистрация: 9-08-09
Пользователь №: 51 806

|
Спасибо за ответ. Видимо действительно нет способа. Задача вызвана необходимостью сгрузить часть таблиц из кода в EEPROM, так как память может вскоре окончитсья. Придетеся действовать указанным Палычем способом, неудобно правда проект для прошивки в виде двух хексов иметь.
|
|
|
|
|
Aug 11 2009, 19:13
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 23-06-06
Из: Харьков
Пользователь №: 18 322

|
Например в Ride'е можно написать Код org 2000h db 01h, 02h, 03h или на С Код char xdata Array[3] = {0x03, 0x56, 0x03}; Будет создан соответствующий bin или hex файл. В данном случае уже должен программатор уметь работать с таким файлом, т.к. некоторым для флеш и EEPROM нужно указывать файлы отдельно. Может и в Keil'е так можно.
|
|
|
|
|
Aug 23 2009, 18:52
|

Группа: Участник
Сообщений: 7
Регистрация: 8-11-08
Из: Киев
Пользователь №: 41 471

|
Код void ram_eeprom(void data*,void xdata*,unsigned char); void eeprom_ram(void xdata*,void data*,unsigned char);
unsigned int xdata KeyClock_ee; . . . ram_eeprom(&KeyClock,&KeyClock_ee,sizeof(KeyClock)); . . . eeprom_ram(&KeyClock_ee,&KeyClock,sizeof(KeyClock)); Это основная программа на С.
А это функции на ассемблере:
NAME EEPROM_MODULE
EEPROM_MODULE SEGMENT CODE PUBLIC _eeprom_ram,_ram_eeprom
sfr EECON = 0x96; Memory Control Register
rseg eeprom_module
;--------------------------------------------------------------- ;Перенос данных из EEPROM в ОЗУ ;В R0 адрес в ОЗУ, куда переносим ;В DPTR адрес в EEPROM, откуда берем ;В R3 сколько байт ;--------------------------------------------------------------- _eeprom_ram: mov dph,r6;откуда из EEPROM mov dpl,r7 mov a,r5;куда в RAM mov r0,a
orl EECON,#00001000b;включаем EEPROM rd_eeprom: movx a,@dptr mov @r0,a inc dptr inc r0 djnz r3,rd_eeprom anl EECON,#11110111b;выключаем EEPROM ret ;-------------------------------------- ;Перенос данных из ОЗУ в EEPROM ;В R0 адрес в ОЗУ, откуда берем ;В DPTR адрес в EEPROM, куда переносим ;В R3 сколько байт ;-------------------------------------- _ram_eeprom: mov a,r7;откуда из RAM mov r0,a mov dph,r4;куда в EEPROM mov dpl,r5
orl EECON,#00011000b;включаем EEPROM, разрешаем запись ram_ee: mov a,EECON jnb acc.1,ram_ee;ждем готовности EEPROM (RDY/BSY=1)
mov a,@r0 movx @dptr,a inc dptr inc r0 wwr2: mov a,EECON jnb acc.1,wwr2;ждем готовности EEPROM (RDY/BSY=1)
djnz r3,ram_ee anl EECON,#11100111b;выключаем EEPROM, запрещаем запись
ret
END Писал в Keil.
Сообщение отредактировал an_ga - Aug 23 2009, 18:52
|
|
|
|
|
Oct 11 2009, 20:32
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
Добрый день. Люди помогите! В Keil на С51 при отладке программы симулятором игнорируются некоторые строки. Соответственно программа неправильно работает и дальнейшее написание программы не имеет смысл. Пробовал разные программы и разные проекты. До определенного момента все нормально, но в какой то момент все повторяется (при добавлении новых строк). Размер кода программы до 2Кб. Да и программа простая. Привожу пример на рисунке. Видно как часть строк игнорируются симуляторомю.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 12 2009, 05:52
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(valser2007 @ Oct 12 2009, 00:32)  Добрый день. Люди помогите! В Keil на С51 при отладке программы симулятором игнорируются некоторые строки. Соответственно программа неправильно работает и дальнейшее написание программы не имеет смысл. Пробовал разные программы и разные проекты. До определенного момента все нормально, но в какой то момент все повторяется (при добавлении новых строк). Размер кода программы до 2Кб. Да и программа простая. Привожу пример на рисунке. Видно как часть строк игнорируются симуляторомю. Добрый день. Попытаюсь предположить. Он их не игнорирует, он их оптимизирует. Попробуйте в настройках проекта (закладка C51), поиграть с Code Optimization (level). И Emphasis выставить в Favor speed.
--------------------
Удачи.
|
|
|
|
|
Oct 12 2009, 16:58
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
Добрый день. Спасибо AndreyS. Написал программу на ассемблере и проверил результаты как на С51, так и на ASM51. Результат вычисления контрольной суммы (именно это было в программе) идентичен. Похоже симулятор их все же оптимизирует. Попробую поизменять настройки, чтобы все строки можно было пройти симулятором. Еще раз огромное спасибо AndreyS.
|
|
|
|
|
Oct 24 2009, 09:17
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
Добрый день. Опять проблемы с Keil. Не пойму, или я что-то не догоняю или версия такая? При отладке прерывания последовательного порта значения байта приема указываю в SBUF. На симуляторе при подводе курсора к надписи SBUF появляется его значение. Это значение хочу передать во временный файл (для дальнейшей обработки). Но этого не происходит. Как был байт temp_sbuf равен нулю, так он и остается. Все это видно на рисунках. Подскажите, если кто знает. Pleeease.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 24 2009, 17:37
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(valser2007 @ Oct 24 2009, 12:17)  При отладке прерывания последовательного порта значения байта приема указываю в SBUF. На симуляторе при подводе курсора к надписи SBUF появляется его значение. Это значение хочу передать во временный файл (для дальнейшей обработки). Но этого не происходит. В МК51 два разных регистра обозваны разработчиками одним именем - это два регистра UART: это регистр в который помещается принятый байт, и регистр в который помещается передаваемый байт. Отсюда все проблемы. Изменяя в симуляторе регистр SBUF Вы меняете тот самый регистр с байтом для передачи из МК, а считываете из своей программы тот регистр что для принятых данных, который для изменения из симулятора недоступен. В Keil есть окошечко Serial Window - вот через него и можно (нужно) передавать данные, якобы через UART. В отладчике (в симуляторе тоже) доступны такие команды как ASSIGN и МОDE - советую обратить на них внимание. А, если Вы на своём компьютере поставите программу, которая позволяет создавать виртуальные СОМ-порты и соединять их между собой, то передать в прикладную программу, отлаживаемую в Keil байт (или некую последоватьность) не представиться большого труда. При использовании названных выше средств очень удобно отлаживать на одной РС интерфейс между МК и РС.
|
|
|
|
|
Oct 25 2009, 09:16
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
Спасибо Палыч. Не знаешь где взять описание как пользоваться окошком Serial Window или ссылку на описание. Еще раз огромное СПАСИБО.
|
|
|
|
|
Oct 25 2009, 16:36
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
В том то и дело, что ничего не набирается. Ни цифры, ни буквы , ни другие символы.
|
|
|
|
|
Oct 26 2009, 06:34
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(valser2007 @ Oct 25 2009, 19:36)  В том то и дело, что ничего не набирается. Ни цифры, ни буквы , ни другие символы. А - и не должно само набираться (отображаться). Я ведь писал - самый примитивный терминал: отображаются только те символы (байты), что приходят от МК. Т.е. если в прикладной программе есть вывод принятых байтов (эхо), то набираемые символы будут отображаться. Ещё раз повторяю: лучше поставить Serial Port Bridge (я брал вот от сюда); соединить пару виртуальных портов между собой; прицепить к одному порту UART отлаживаемого МК (командами Keil: ASSIGN и МОDE) , а к другому терминалку, которая Вам нравиться, и - работайте/отлаживайте. Гораздо удобнее, чем Serial Window Keil'а...
|
|
|
|
|
Oct 26 2009, 22:55
|
Группа: Участник
Сообщений: 6
Регистрация: 11-10-09
Пользователь №: 52 870

|
Спасибо Палыч. Разобрался с прогами и сделал как советовал. ВСЕ ЗАРАБОТАЛО!
БОЛЬШОЕ СПАСИБО!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|