Вы не вошли.
Фух, еле победил эти глюки....
2 Liv
Доброго времени суток!! Спасибо огромное за вашу вашу программу про светодиод!! Все понятно (в общем). Откомпилировалась успешно.Однако все же есть некоторые вопросы общего характера.
1. Регистру r16 присвоили имя "temp" и всегда работали с ним как с некоторым буфером, через который пересылаются данные.
Например, Вы пишете:
ldi temp,0xFF ;загружаем в temp FF
out DDRB,temp ;настраиваем порт B на вывод
тут понятно, комнды непосредственной записи числа в порт я не нашел (mov P1,#11111111,к примеру, как в 51-х, тут не канает).
Дальше больше. Вы пишете:
ldi temp,LED_DEL
sts LedTmr,temp ;загружаем в переменную значение LED_DEL
тут как я понимаю, тот же случай. Напрямую нельзя присвоить переменной значение константы, я правильно понял??
Т.е. фактически пересылка данных из одной области памяти (где храниться LED_DEL) в другую (тот самый 1 байт,
зарезервированный под LedTmr) возможна только через "буферный" регистр temp ака r16 (кстати, почему именно он??)
В обработчике прерывания по переполнению таймера 0 Вы опустили в стек сперва temp а потом и SREG. Но, опять-таки SREG через temp. Насколько я понял, все эти операции (ldi, lds, push, pop и пр.) возможны только с регистрами из того самого регистрового файла (32 РОНа, напрямую соединенные с АЛУ. Как видите, в архитектуре я тоже немного "прошарил" )
И последнее.
Init: ldi temp,RAMEND ;константа RAMEND определена в 2313def.inc
out SPL,temp ;инициализируем стек
Константа RAMEND из 2313def.inc: ".equ RAMEND =$DF ;Last On-Chip SRAM Location" - "последняя область встроенной SRAM". Я читал, что стек у AVR аппаратно не реализован,(ну, кроме AT90S1200) и стеком является область SRAM, адрес которой указан в Stack Pointer. А каков его (стека) объем в данном случае?? У меня есть подробное русское описание архитектуры ATmega103, там написано буквально следующее: "Указатель стека указывае на область в SRAM данных, в которой размещаются стеки подпрограмм и прерываний. Объем стека в SRAM данных должен задаваться программой перед каждым вызовом подпрограммы и обработкой разрешенного прерывания."
Вы вроде нигде не указывали объем стека при вызове подпрограммы и обработке прерывания...
Заранее спасибо!! Ваша помощь просто неоценима!!!
Отредактировано Алексей (26.07.2006 22:54:59)
......There is someone in my head, but it's not me.......
Вне форума
2 LivДоброго времени суток!!
Здарова!
"Регистру r16 присвоили имя "temp" и всегда работали с ним как с некоторым буфером, через который пересылаются данные"
Верно.
"тут понятно, комнды непосредственной записи числа в порт я не нашел"
Дык RISC, ё моё. В итоге всё равно быстрее получается.
"Напрямую нельзя присвоить переменной значение константы, я правильно понял??"
Правильно.
"Т.е. фактически пересылка данных из одной области памяти (где храниться LED_DEL) в другую (тот самый 1 байт,
зарезервированный под LedTmr) возможна только через "буферный" регистр temp ака r16 (кстати, почему именно он??)"
R16 - это первый регистр из старших, с которым возможны все операции (битовые, например, или с непосредственными операндами, т.е. числами). Регистры R0..R15 неполноценны. Но в MCS-51 столько регистров вообще не было. Плюс возможность арифметических операций с любым регистром...
"В обработчике прерывания по переполнению таймера 0 Вы опустили в стек сперва temp а потом и SREG.
Но, опять-таки SREG через temp. Насколько я понял, все эти операции (ldi, lds, push, pop и пр.) возможны
только с регистрами из того самого регистрового файла (32 РОНа, напрямую соединенные с АЛУ. Как видите, в
архитектуре я тоже немного "прошарил" )"
Круто прошарили. Я очень рад.
"Я читал, что стек у AVR аппаратно не реализован,(ну, кроме AT90S1200) и
стеком является область SRAM, адрес которой указан в Stack Pointer. А каков его (стека) объем в данном случае??"
У S1200 был апаратный стек, но у всех нормальных AVR он, как и положено, находится в ОЗУ. У S1200 стек был очень ограниченный, а у всех остальных AVR он лимитируется только объемом ОЗУ. На практике при программировании на асемблере можно забыть про стек, ему места хватит. В отлитчие от Си, на ассемблере мы не передаем данные через стек. Но и для Си в AVR стека хватает.
"Заранее спасибо!! Ваша помощь неоценима!!! "
Ну, этого много! Хватит пива
Вне форума
2 Liv Снова здравствуйте!!!
R16 - это первый регистр из старших, с которым возможны все операции (битовые, например, или с непосредственными операндами, т.е. числами). Регистры R0..R15 неполноценны. Но в MCS-51 столько регистров вообще не было. Плюс возможность арифметических операций с любым регистром...
Постойе-ка.. в чем "неполноценность" первых 16-ти?? В моей мега-умной книге такого нет....
Я все-таки создам новую тему. А то ведь оффтопим фактически. Начальство рассердиться
Ну, этого много! Хватит пива
Эх, жаль, что мы далеко!! Давайте адрес, я Вам по почте вышлю
......There is someone in my head, but it's not me.......
Вне форума
Алексей Постойе-ка.. в чем "неполноценность" первых 16-ти?? В моей мега-умной книге такого нет....
Регистры R0-R15 неполноценны тем, что с ними не проходят команды с непосредственными операндами (ldi, например). Если в AVR Studio нажать F1, когда курсор стоит на мнемонике команды, откроется хелп по этой команде, где будет указано, с каким диапазоном регистров она работает. Есть еще ряд стандартных "граблей", я позже подготовлю и напишу.
Уважаемая администрация форума! Большая просьба перенести из этой ветки посты, начиная с #14 в новую ветку "AVR для чайников". Эта ветка пусть останется, возможно, будет продолжение беседы по MCS-51.
Вне форума
Уважаемая администрация форума! Большая просьба перенести из этой ветки посты, начиная с #14 в новую ветку "AVR для чайников". Эта ветка пусть останется, возможно, будет продолжение беседы по MCS-51.
Перенести не получится, только всё цитировать и писать от себя. Делать?
Саша
Вне форума
Да наверно не стоит. Бог с ними, с этими постами. Просто больше не будем ничего сюда писать про AVR да и все. А если кто хочет что по 51-м обсуждать, так пусть продолжают ветку. Я ее создал, думал, что буду 51-ми заниматься. Но Liv переубедил.
......There is someone in my head, but it's not me.......
Вне форума
Давайте продолжим эту страничку!
Написал я прогу на асемблере, оттранслировал ее TASM-ом (как написано в книге А.Фрунзе Микроконтроллеры? это же просто!) и получил файл *.obj , но програма Pony Prog (через которую програмирую контроллер) не поддерживает етот формат файла. Есть ли какието конверторы *.obj <=> *.bin или чем лучше компилировать??
Вне форума
Для простых задач, с объемом до 2к можно использовать Бейсик BASCOM-8051 от mcselec.com или ассемблер/Си Reads51 от www.rigelcorp.com. Это все бесплатно. На выходе они готовят hex-файлы для пршивки. Сам пользовался неоднократно.
Вне форума
Написал я прогу на асемблере, оттранслировал ее TASM-ом (как написано в книге А.Фрунзе Микроконтроллеры? это же просто!) и получил файл *.obj , но програма Pony Prog (через которую програмирую контроллер) не поддерживает етот формат файла. Есть ли какието конверторы *.obj <=> *.bin или чем лучше компилировать??
Если TASM-у в командной строке задать ключ -b, то он генерирует двоичный исполняемый файл (тот же .bin), но с расширением .obj. Если ключа -b не ставить, то он генерит hex-файл, хотя тоже с расширением .obj. Так что в Вашем случае достаточно поставить ключ желаемого формата, а затем просто переименовать файл (сменить расширение).
Вне форума
Спасибо Liv, все заработало!
Вопрос следующий: Можно ли TASM-ом компилировать с командной строки в WIN XP SR2? или лучше в чистом DOS-е? от етого что-нибудь зависит?
Вне форума
[ Сгенерировано за 0.040 сек, 7 запросов выполнено - Использовано памяти: 625.91 Кбайт (Пик: 676.28 Кбайт) ]