Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 01.09.2015
Сообщений: 4

Выполнение кода из внешней EEPROM (ASM, AT89C51ED2)

01.09.2015, 09:59. Показов 5647. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: Необходимо в память (EEPROM) записать исполняющий код (не важно что он делает),который будет выполняться при включении микроконтроллера. Сам код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$MOD8252
DSEG AT 0020H
VAR1: DS 1
ORG     0040H           
stack: DS 0050H          
 
        CSEG                    
 
        ORG     0000H           
        jmp     start
 
        ORG     0003H            
        reti                    
 
        ORG     000BH           
        reti                     
 
        ORG     0013H           
        reti                     
 
        ORG     001BH           
        reti                     
 
        ORG     0023H           
        reti                     
 
        ORG     002BH           
        reti                     
 
 
        ORG     0040H           
 
 
        ORG     00E0H           
        USING   0               
START:
 
MOV P0,#0AAH
MOV P1,#0AAH
MOV P2,#0AAH
MOV P3,#0AAH                                                                                                                                       
SETB P0.0
JB P0.0,$ ; 
 
MOV P0,#055H
MOV P1,#055H
MOV P2,#055H
MOV P3,#055H
 
JNB P0.0,$ ;
JMP START                    
 
END
Инструменты:
  • програматор EVP-390
  • wellon
  • Keil uVision4 (c51)
  • Сам микроконтроллер AT89C51ED2
[/LIST]
Суть проблемы: В общем то в даташите, есть блок-схема которая повзоляет реализовать запись данных в EEPROM этого МК. В целом понятно, кроме самого важного момента. Цитирую даташит:"DPTR=adress, ACC=Data, Exec: MOVX @DPTR,A" . Суть понятна- указываем DPTR с какого адресса начать запись, пересылаем данные в Акк. и потом из Акк в DPTR.
Вопрос:Как можно переслать код преведенный выше в Акк(т.е. выполнить условие даташита - ACC=Data), если это просто набор нетраслированного текста? А команда MOV по сути работает либо напрямую со значениями (цифрами) либо из регистров. И попутный вопрос: Как для DTPR нужно указывать адресс (из даташита - DPTR=adress), с которого будут записываться данные в память EEPROM? Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2015, 09:59
Ответы с готовыми решениями:

Как отследить выполнение кода, если выполняется печать внешней печатной формы?
Внешняя печатная форма закреплена за документом "ЗаказПокупателя". В конфигураторе устанавливаю точку останова на коде,по которому...

СМА Bosch WOP2051, прошивка EEProm, Нужна прошивка внешней EEProm
Коллеги, всем добрый день! Разыскиваю прошивку внешней EEProm 24С32. Другие данные на эту СМА отсутствуют. МК был почти в кз после баха, но...

Взаимодействие МК c внешней EEPROM по SPI
Здравствуйте! Пожалуйста, объясните или (еще лучше) приведите пример как микроконтроллер (например какой-нибудь PIC 16f84a) взаимодействует...

16
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
01.09.2015, 16:37
Цитата Сообщение от dukvbg Посмотреть сообщение
Необходимо в память (EEPROM) записать исполняющий код (не важно что он делает),который будет выполняться при включении микроконтроллера.
Откомпилируй приведенный выше текст программы и залей полученный код в микроконтроллер с помощью программатора. Вот он и будет исполняться при включении микроконтроллера.

Добавлено через 3 минуты
Цитата Сообщение от dukvbg Посмотреть сообщение
Необходимо в память (EEPROM) записать исполняющий код
В упомянутый EEPROM код залить то можно. Только с чего ты решил, что микроконтроллер станет его исполнять ? Ему-то на твои хотелки плевать.

EEPROM Data memory - это одно. А FLASH/EEPROM Program memory - это физически другое.

Добавлено через 9 минут
Цитата Сообщение от dukvbg Посмотреть сообщение
Как можно переслать код преведенный выше в Акк(т.е. выполнить условие даташита - ACC=Data), если это просто набор нетраслированного текста?
Выше у тебя приведен исходный текст, а не код.
Текст превращает в код транслятор. В что-то типа
:100080007A346F291A29232934291A291A291A2 975
:100090001A295E2889008316081483120808890 A21
:1000A0000800682947291A295D281A290800080 02C
:1000B0001A293C2919299E036C30F23EC83E890 05A
:1000C00008214B209E008D001F3084004B20800 0B3
да и то это опять таки текстовое представление кода (Intel HEX format),
потому-что сам код в сообщение не вставить. Но в этом текстовом-то
представлении код хорошо виден.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.09.2015, 16:42
хочу уточнить - вы хотите кусок кода закинуть в EEPROM и запустить его оттуда, без копирования в область, доступную для выполнения программ? Если архитектура МК позволяет выполнять код из EEPROM, то обычно в файле .asm перед областью добавляется тип памяти, которую надо использовать. Например, ".eeprom", ".code", ".text". В зависимости от компилятора (и архитектуры) используются разные обозначения, посмотрите в хелпе на компилятор. Есть вы не можете скомпилировать код в определенную область, то в 99% случаев это обозначает, что вы его оттуда и не выполните.
Если же вы планируете использовать эти куски кода в качестве дальнейшего их копирования во FLASH, тогда можно скомпилить исходник и вырезать кусок данных из HEX'а, а затем уже воткнуть их в файл для EEPROM с нужным оффсетом.

ЗЫ: возможно, я неточно понял суть вопроса.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
01.09.2015, 16:43
Да там поток сознания, а не вопрос. В 8051 архитектуре код выполняется из
памяти, доступной на чтение командой MOVC. А он говорит про EEPROM
доступный по MOVX. Оттуда ни в жисть ничего не будет исполняться.
Это разные адресные пространства. Как-никак Гарвард, ети ее.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
01.09.2015, 21:27
dukvbg, Чтобы ваш код выполнялся из внешней EEPROM, вам надо вывод EA микроконтроллера посадить на землю. Но такой код как вы написали выполняться не будет. Потому что вы там дергаете сразу всеми портами. А на портах P0 и P2 подключается внешняя EEPROM. Нельзя трогать эти порты когда вы хотите работать с внешней памятью.
Залить код в EEPROM вашим программатором - можно.

Добавлено через 9 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
В 8051 архитектуре код выполняется из
памяти, доступной на чтение командой MOVC. А он говорит про EEPROM
доступный по MOVX. Оттуда ни в жисть ничего не будет исполняться.
Это разные адресные пространства. Как-никак Гарвард, ети ее.
Все там выполняется начиная с самых первых 8051 и до сих пор. Ножка EA управляет переключением на внешнее ПЗУ.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.09.2015, 23:09
Цитата Сообщение от Ethereal Посмотреть сообщение
Как-никак Гарвард, ети ее
а из RAM'а может выполняться?
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
02.09.2015, 08:56
Лучший ответ Сообщение было отмечено raxp как решение

Решение

В исходном виде нет. Но к этому МК можно цеплять внешнюю память, чтобы она читалась через MOVC или через MOVX. Вот если подцепить так, чтобы читалось по MOVC, то МК может оттуда исполнять код. Он делает так - если исполнение кода идет в нижних адресах, то он исполняет код из внутреннего FLASH (я про 89C51). Если исполнение кода за адреса внутреннего FLASH вылезло, он начинает обращаться к внешней памяти MOVC для выгребания кода. Если этой памятью подцепить внешнее статическое ОЗУ (например 62C16), чтобы оно было доступно сразу и по MOVC и по MOVX, то по MOVX можно будет туда скопировать код, а потом прыгнуть на этот код (прыжок будет в пространстве MOVC) и вот этот код пошел из статического ОЗУ выполняться.

Добавлено через 5 минут
Цитата Сообщение от paskal Посмотреть сообщение
Все там выполняется начиная с самых первых 8051 и до сих пор. Ножка EA управляет переключением на внешнее ПЗУ.
Там, это все таки ГДЕ ? В каком адресном пространстве ? Куда мы лезем MOVX A.@DPTR или куда MOVC A,@A+DPTR ?

И можно ли исполнить код из того встроенного EEPROM, про которое писал ТС и к которому обращение по MOVX A,@DPTR ?
1
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
02.09.2015, 12:38
Цитата Сообщение от Ethereal Посмотреть сообщение
И можно ли исполнить код из того встроенного EEPROM, про которое писал ТС
ТС "встроенного" не писал.

Добавлено через 9 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
В каком адресном пространстве ? Куда мы лезем MOVX A.@DPTR или куда MOVC A,@A+DPTR ?
К внешней памяти обращаются через MOVX
0
0 / 0 / 0
Регистрация: 01.09.2015
Сообщений: 4
03.09.2015, 09:21  [ТС]
Цитата Сообщение от paskal Посмотреть сообщение
А на портах P0 и P2 подключается внешняя EEPROM
У этого МК EEPROM внутренний (извините за тавтологию), порты вообще не задействуются (эта инфа не из головы, а из даташита на этот МК).
Ладно давайте абстрогируемся вообще от конкретного МК. Вы бы не моглинаписать пример, как будет выглядеть код исходя из этой задачи "DPTR=adress, ACC=Data, Exec: MOVX @DPTR,A" при учете что данные, это тот самый код который я указал в самом первом посте
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
03.09.2015, 11:24
Аsm - платформозависимый язык, абстрагироваться тут не получиться.
0
0 / 0 / 0
Регистрация: 01.09.2015
Сообщений: 4
03.09.2015, 11:26  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Аsm - платформозависимый язык, абстрагироваться тут не получиться.
Тогда можно написать пример исходя из того что архитектура процессора (в целом) 8051, пишуи на Keil uVision4 (c51)
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
03.09.2015, 13:05
Цитата Сообщение от paskal Посмотреть сообщение
ТС "встроенного" не писал.
Он писал это
Цитата Сообщение от dukvbg Посмотреть сообщение
Сам микроконтроллер AT89C51ED2
Цитата Сообщение от dukvbg Посмотреть сообщение
В общем то в даташите, есть блок-схема которая повзоляет реализовать запись данных в EEPROM этого МК. В целом понятно, кроме самого важного момента. Цитирую даташит:"DPTR=adress, ACC=Data, Exec: MOVX @DPTR,A" .
А это как раз про 23-ю главу даташита на этот микроконтроллер http://www.atmel.com/Images/doc4235.pdf про встроенную EEPROM Data Memory.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
03.09.2015, 13:08
Лучший ответ Сообщение было отмечено dukvbg как решение

Решение

Цитата Сообщение от dukvbg Посмотреть сообщение
Ладно давайте абстрогируемся вообще от конкретного МК. Вы бы не моглинаписать пример, как будет выглядеть код исходя из этой задачи "DPTR=adress, ACC=Data, Exec: MOVX @DPTR,A" при учете что данные, это тот самый код который я указал в самом первом посте
По поводу абстрагирования есть один интересный момент. В абстрактном 8051 один указатель dptr, а в вашем их два, что заметно облегчает задачу. Но ведь в конце концов вам нужна программа для AT89C51ED2?
Ладно, не буду усложнять, напишу как бы для абстрактного.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        dseg at 20h
 
ptr1:   ds  2 ;один указатель - источник
ptr2:   ds  2 ;другой - назначение
 
        cseg at 0
 
        jmp     start  ;здесь ваш код;
 
start:  
        mov a,2
        jmp $
finish:
;конец вашего кода
 
Exec:
        mov     dptr,#start
        mov     ptr1,dpl
        mov     ptr1+1,dph
        mov     dptr,#1234  ;любой адрес куда вам нужно
        mov     ptr2,dpl
        mov     ptr2+1,dph
        clr     ea
loop:
        mov     dpl,ptr1
        mov     dph,ptr1+1
        clr     a
        movc    a,@a+dptr
        inc     dptr
        mov     ptr1,dpl
        mov     ptr1+1,dph
 
        mov     dpl,ptr2
        mov     dph,ptr2+1
        mov     eecon,#2
        movx    @dptr,a
        mov     eecon,#0
        inc     dptr
        mov     ptr2,dpl
        mov     ptr2+1,dph
        
        mov     dptr,#finish+1  ;проверка конца
        mov     a,dpl
        cjne    a,ptr1,loop
        mov     a,dph
        cjne    a,ptr1+1,loop
 
        jmp $
 
end
Где ваш код пишете что вам нужно.
Еще не сделал проверку EEBusy, но это надеюсь допишете. )
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
03.09.2015, 13:26
Цитата Сообщение от paskal Посмотреть сообщение
К внешней памяти обращаются через MOVX
И что по MOVC уже и не обратиться что-ли ? А если вся программа MK лежит во внешней 27C512 и в коде этой программы используется MOVC A,@A+DPTR, то обращение будет куда ?

Добавлено через 9 минут
------------------------------------------------------------------------
Вот в этой PDF-ке http://www.atmel.com/images/doc0265.pdf на 12-й странице есть
External Program Memory Read Cycle
и
External Data Memory Read Cycle
А на 13-й странице
External Data Memory Write Cycle
При выгребании кода для исполнения и при исполнении MOVC будет первый цикл.
А при исполнении MOVX второй или третий цикл.

Итого, если память доступна только по MOVX, исполнить код из нее нельзя. О чем я выше и жужжал.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
03.09.2015, 13:26
Цитата Сообщение от Ethereal Посмотреть сообщение
И что по MOVC уже и не обратиться что-ли ? А если вся программа MK лежит во внешней 27C512 и в коде этой программы используется MOVC A,@A+DPTR, то обращение будет куда ?
Поправлюсь. На самом деле все зависит от схемы подключения. Как используются rd/wr и psen. Можно сделать что работает MOVX, можно что MOVC, а можно чтоб оба.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
03.09.2015, 13:33
Гарвард-с ...

Добавлено через 59 секунд
Цитата Сообщение от paskal Посмотреть сообщение
На самом деле все зависит от схемы подключения. Как используются rd/wr и psen. Можно сделать что работает MOVX, можно что MOVC, а можно чтоб оба.
Все верно. Было выше
Цитата Сообщение от Ethereal Посмотреть сообщение
Если этой памятью подцепить внешнее статическое ОЗУ (например 62C16), чтобы оно было доступно сразу и по MOVC и по MOVX, то по MOVX можно будет туда скопировать код, а потом прыгнуть на этот код (прыжок будет в пространстве MOVC) и вот этот код пошел из статического ОЗУ выполняться.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
03.09.2015, 13:38
Цитата Сообщение от Ethereal Посмотреть сообщение
Итого, если память доступна только по MOVX, исполнить код из нее нельзя. О чем я выше и жужжал.
Ну тогда остается посочувствовать топикстартеру. Код выполняться не будет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.09.2015, 13:38
Помогаю со студенческими работами здесь

AVRstudio4 ASM. Адресация и инициализация EEPROM.
Есть кусок кода: ===== адреса переменных в EEPROM ===== .ESEG .org 0 EE_code_Unlock: .byte 2 EE_code_Service: .byte 2 ...

Быстрый поиск по внешней I2C EEPROM
1. Сразу скажу, что я осЁл, поэтому буду рад любым советам, в т.ч. тыканьем в гугол (по делу), т.к. самому подобрать ключевые слова для...

Компиляция ресурсов для внешней EEPROM
Есть непонятка. Я задумал шрифт записать во внешнюю EEPROM типа AT24C128. Как настроить компилятор/линкер, чтобы он мой .h со...

СМА Siemens WS12G240OE/03, дамп внешней EEPROM
пострадал он малость, всем данными. Без помощи - никак.. Признателен отозвавшимся

СМА Ariston AVG 12 EU, Нужна прошивка внешней eeprom
Приветствую! Нужна прошивка внешней eeprom для СМА Ariston AVG 12 EU (EVO2 3f) ind - 80288710905 s/n - 510255563


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru