Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по ADuC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Viktor_
Вопрос очень прост. Записываю программу, всё работает пока не нажму Reset, либо не отключу питание.
Почему не переходит на программу? В чём дело? после Reset, как я думаю контроллер переходит на 0000 адресс в котором должен хранится jmp на точьку входа. Но почему на работает то?
ipc
Цитата(Viktor_ @ Apr 17 2006, 07:52) *
Вопрос очень прост. Записываю программу, всё работает пока не нажму Reset, либо не отключу питание.
Почему не переходит на программу? В чём дело? после Reset, как я думаю контроллер переходит на 0000 адресс в котором должен хранится jmp на точьку входа. Но почему на работает то?

В вопросе есть ответ скорее всего неправильно сделана таблица векторов.Лучше бы посмотреть на исходник или на мемори мап.
Viktor_
Как не работат переход на точку входа я могу понять, но почему? Некоторое время назад всё было ОК.
ipc
Цитата(Viktor_ @ Apr 17 2006, 09:01) *
Как не работат переход на точку входа я могу понять, но почему? Некоторое время назад всё было ОК.

По разному бывает,например если злоупотреблять директивами типа ORG можно разбомбить все что угодно включаю точку входа.
KRS
А может у вас просто бутлоадер все время активируется?
volkanaft
Если работаете в Keil-e, запустите симулятор и увидете куда программа выходит после Reset
1. если все правильно - смотрим что делается на EA & PSEN в момент окончания RESET
(а на EA и во время выполнения программы)
2. если в симуляторе выполняется неправильно - ...
Viktor_
Большое спасибо за советы. Я даже начал что-то понимать blink.gif
А ЕЩЁ ВОПРОС - ЧТО такое "БУТЛОАДЕР"?
*SERG
Посмотри осцилографом что творитьбся на ножке сброса, они критично относятся к форме импульса зброса, даже микрухи специальные для них выпускают.........., форму в даташите глянь
Viktor_
вообщем вроде понял в чём дело. Reset вроде ничё пашет. Проблемма с точкой входа. не могу понять как првильно использовать org.????
Viktor_
.ORG 0000h
lJMP MAIN ; jump to main program

.ORG 0100h
MAIN:

Работать должно????
Если нет то как нужно???
ipc
Цитата(Viktor_ @ Apr 18 2006, 06:58) *
вообщем вроде понял в чём дело. Reset вроде ничё пашет. Проблемма с точкой входа. не могу понять как првильно использовать org.????

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

$INCLUDE (MOD52)
VERSION EQU 5700
;***************************************************************
;Описание сегментов программы
;***************************************************************
PROG SEGMENT CODE
CONST SEGMENT CODE
STACK SEGMENT IDATA
VAR SEGMENT DATA
;****************************************************************
;Область обьявлений и присваиваний
;*****************************************************************
HLD1 BIT P1.2
HLD2 BIT P1.3
system EQU R6
;******************************************************************
; Область изменяемых параметров
;******************************************************************
QUARZ EQU 16
IF VERSION=5600
ChanON EQU 21
TimeON EQU 900
ENDIF
IF VERSION=5700
ChanON EQU 28
TimeON EQU 001
ENDIF
PWR EQU 0dfh
FRQ EQU 0fah


;***************************************************************
;Область констант
;***************************************************************
RSEG CONST

Mas1Address: DB 01 ,03 ,04 ,05 ,10 ,12 ,12 ,13 ,13 ,14 ,12 ,14 ,14 ,15 ,15 ,16 ,16 ,17
Mas2Address: DB 01 ,03 ,04 ,05 ,11 ,14 ,15 ,14 ,15 ,15 ,13 ,16 ,17 ,16 ,17 ,18 ,19 ,18


;******************************************************************
;Область переменных
;******************************************************************
RSEG VAR
BitArray: DS 4
RollToggle: DS 1


;******************************************************************
;Область стека
;******************************************************************
RSEG STACK ;Сегмент стека
DS 20H ;
RSEG PROG
;******************************************************************
;Область векторов прерываний
;*******************************************************************
ORG 00h ;Вектор ресета
JMP START ;Переход на начало программы
ORG 01BH ;Вектор таймера
JMP T1_INTERRUPT ;Переход на обработчик переполнения таймера
;********************************************************************
;Главный цикл программы
;********************************************************************
START: MOV SP, #STACK-1 ;Определить стек
итд

Особое внимание рекомендую обратить на определение сегментов разных типов(RSEG) и присвоение стека.А также на возможность использования препроцессора IF EQU DS DB итд.В зависимости от компилятора директивы могут менятся но суть одна.
Viktor_
блиииин. Чёта сильно уж мутно.... sad.gif
Нее, я понимаю всё это, но неужели это нужно прописывать?
ipc
Цитата(Viktor_ @ Apr 18 2006, 09:17) *
блиииин. Чёта сильно уж мутно.... sad.gif
Нее, я понимаю всё это, но неужели это нужно прописывать?

Да ничего немутно.Нужно же обьяснить компилятору и линкеру где размещать данные,код,константы и стек.Если не ты то кто же это сделает wink.gif
Viktor_
всё. Буду читать, читать, читать.
Stas
Судя по тому, что прога исполняется после загрузки, но после ресета не прет - ты не убираешь с PSEN нагрузочный резистор на землю. Во время ресета если на PSENe висит нагрузка то ADUC8xx после окончания ресета переходит в режим программирования (те запускается внутренний код для записи памяти программ содержимым, получаемым с последовательного порта - тн бутлоадер). Если ты после загрузки не убрал с PSENа, то кристалл после очередного ресета опять ждет программирования. Итог - убери нагрузку с PSEN, после ресета должен исполнятся код с адреса 0000h
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.