ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
149966 Топик полностью
MBedder, терминатор (04.03.2009 14:10, просмотров: 245) ответил Начинающий на Вот что есть
И правильно, что не работает Я же еще раньше протелепатил и сказал тебе, что RESTART у тебя не вызывается, а в лоб исполняется из строчки .include "ReStart.asm". А еще раньше то же самое происходит и с .include "Init.asm". Запомни - директива .include в ассемблерах просто вставляет весь текст из указанного файла в то место, где находится сама. В итоге ты получаешь следующий код (опускаю вектора и .include "init.asm" для краткости): RESET: CLI ldi TMP_1, high(RAMEND-1) out SPH, TMP_1 ldi TMP_1, low(RAMEND-1) out SPL, TMP_1 ldi TMP_1,0xAA sts LAST_ADDR,TMP_1 ; .include "ReStart.asm" RESTART: lds TMP_1,MCUSR sbrc TMP_1,3 ;WDRF rcall OLD_NASTROIKI sbrc TMP_1,2 ;BORF rcall OLD_NASTROIKI sbrc TMP_1,1 ;EXTRF rcall OLD_NASTROIKI ret ; <---- в никуда, т.к. не было rcall RESTART. Тут стек и выворачивается. OLD_NASTROIKI: ret Как видишь, до main код даже не успевает дойти. Не знаю, чем кончается у тебя init.asm - если не ret, то можешь оставить его на месте, а вот остальные твои .include следует расположить после main: rjmp main, да и init.asm лучше завершить ret'ом и вызывать как подпрограмму - получится стройный код: .org 0x00067 ; <--- а это еще зачем?? Уберинах. // Точка входа в программу RESET: CLI ; <--- лишнее, они и так выключены аппаратным reset'ом ldi TMP_1, high(RAMEND-1) out SPH, TMP_1 ldi TMP_1, low(RAMEND-1) out SPL, TMP_1 ldi TMP_1,0xAA sts LAST_ADDR,TMP_1 //****************************************************************************** // MAIN //****************************************************************************** //****************************************************************************** rcall INIT ; <--- разумеется, INIT должен завершаться ret'ом sei ; <--- подразумеваю, что прерывания должны разрешаться ПОСЛЕ init rcall RESTART rcall CONECT_PROV rjmp MAIN MAIN: rjmp MAIN //-------------------------------------------------------------------- //****************************************************************************** // Подгрузка файлов //****************************************************************************** .include "Init.asm" ; <--- заверши его ret'ом .include "ReStart.asm" .include "Interapt.asm" .include "Connect.asm" .include "Delay.asm" Таким образом у тебя код, содержащийся в инклудах, сможет получить управление только при явном вызове (rcall/call), т.к. дальше rjmp main прямого исполнения нет.