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

Стэк asm 8051 AT89C52

16.11.2021, 12:10. Показов 4810. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги!
Делаю лабу в ВУЗе по микроконтроллерам.
Накопилось несколько вопросов, если кто-то может кратко помочь, буду безмерно благодарен.

Assembler
1
MOV      SP,   #?STACK-1
Это установка начала стэка.

Перед этим
Assembler
1
2
3
?STACK  SEGMENT IDATA     ; Размещение сегмента стека ?STACK в главном модуле
        RSEG    ?STACK
        DS      20
Почему стэк размещается именно в IDATA и почему при установке начала стэка вычитается 1.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2021, 12:10
Ответы с готовыми решениями:

С BASIC на ASM, 8051
задали, и здать нужно срочно, напишите что знаете, пожалуйста 1.Реализовать на ассемблере BASIC-программу: 10 LET A=4 20 FOR B=2...

8051+asm, нужна подсказка
Добрый вечер. Никак не могу понять как можно сделать умножение двух четырехразрядных чисел, предварительно разместив их в резидентной...

8051. Сравнение скорости ASM и С в симуляторе
Здравствуйте нужно на примере простой функции (вычитание 6ти-значных чисел) сравнить быстродействие Ассемблера и С для микроконтроллера...

22
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
16.11.2021, 18:56
Цитата Сообщение от BuJIJI Посмотреть сообщение
почему при установке начала стэка вычитается 1.
Потому что команда PUSH работает так:

(SP):=(SP)+1
((SP)):=(direct)

Т е чтобы использовать все ячейки памяти (чтобы не было одного "лишнего" байта)

Цитата Сообщение от BuJIJI Посмотреть сообщение
Почему стэк размещается именно в IDATA
Некоторые МК имеют память 256 байт, но старшие 128 байт DATA отображаются на регистры SFR,
в то время как старшие 128 байт IDATA (операции PUSH POP MOV @R0 и т д) как раз используют
"нормальную" память. Удобно использовать стек, загрузив туда например 127 и имея целых
128 байт стека. Но повторяю, это только в поздних моделях МК, надо смотреть документацию.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
16.11.2021, 21:37  [ТС]
Круто, спасибо!

У меня есть такое задание на лабу:
требуется задействовать таймер-счетчик ТС1; длительность формируемого импульсного сигнала составляет 45 мс, пауза – 25 мс, коэффициент K не задан; частота тактового генератора Fosc = 12 МГц; кол-во повторений импульсов N равно 15.

Я взял пример готовой программы, которую предоставил преподаватель. И вот в момент инициализации контроллера уже не понимаю что приосходит:

Assembler
1
2
3
4
5
6
7
8
9
10
11
InitDevice: MOV   TH0, #0      ; загрузка в старший счетный регистр таймера-счетчика 0 нулевого значения 
            MOV   TL0, #0      ; загрузка в младший счетный регистр таймера-счетчика 0 нулевого значения 
            ANL   TMOD, #0F0H  ; установка таймера-счетчика 0 в режим таймера и блокировка внешнего вывода
            ORL   TMOD, #09    ; установка таймера-счетчика 0 в режим работы 16-разрядного таймера и
                               ;  разрешение управление таймером-счетчиком от внешнего вывода INT0
            SETB  TR0          ; установка бита управления таймера-счетчика 0 в регистре TCON 
            SETB  PX0          ; установка бита уровня внешнего прерывания INT0 таймера счетчика 0 в регистре IP
            SETB  EX0          ; установка бита разрешения внешнего прерывания таймера-счетчика 0 в регистре IE 
            SETB  EA           ; установка бита разрешения индивидуально разрешенных прерываний в регистре IE
            RET                ; выход из подпрограммы и возвращение в основную программу
            END
Со второй частью всё более менее понятно, устанавливаются биты для прерываний и запуск таймера. А вот зачем тут ANL и ORL, почему нельзя просто установить через MOV.

И второй вопрос. Как определяется куда положить сегмент кода по умолчанию, если не задан очерез CSEG AT. У меня был OVERLAP и я в одном из модулей руками определил с какого места в этом модуле начинать складывать инструкции. Но помимо этого у меня есть ещё два модуля, в которых ничего не определено, но там сегмент кода лежит нормально.
И ещё связанный с этим вопрос:
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
            CSEG AT 17h
            LJMP  ISR_INT0
 
; Определение переменных
;  в сегменте памяти данных
?DT?GetPulseCode  SEGMENT DATA
               RSEG ?DT?GetPulseCode   
PulseWidth:    DS 2           ; Длительность импульса (два байта)
 
; в битоадресуемом сегменте памяти данных
?BT?GetPulseCode  SEGMENT BIT
               RSEG ?BT?GetPulseCode   
FgOV:          DBIT 1         ; Флаг переполнения (1 бит)
 
?PR?GetPulseCode SEGMENT CODE ; PR - Program Part
              RSEG ?PR?GetPulseCode 
 
ISR_INT0:   PUSH  PSW                ; запоминаем значение регистра PSW в стек
            MOV   PulseWidth, TH0    ; Считывание кода длительности из счетных 
            MOV   PulseWidth+1, TL0  ;  регистров таймера-счетчика 0
            MOV   TH0, #0            ; обнуление старшего счетного регистра таймера-счетчика 0
            MOV   TL0, #0            ; обнуление старшего счетного регистра таймера-счетчика 0
            MOV   C, TF0             ; флаг переноса принимает значение флага переполнения таймера-счетчика 0
            MOV   FgOV, C            ; битовая переменная FgOV принимает значение флага переноса
            CLR   TF0                ; очистка флага переполнения таймера-счетчика 0
            POP   PSW                ; восстановление значения регистра PSW из стека
            RETI                     ; выход из подпрограммыобработчика прерывания и возвращение в основную программу
Почему на 17h у меня лежит только LJMP ISR_INT0, а сама метка начинается аж на 082D, почему инструкции метки не пишутся сразу за LJMP?
0
4043 / 2654 / 583
Регистрация: 11.09.2009
Сообщений: 9,487
17.11.2021, 01:39
Цитата Сообщение от BuJIJI Посмотреть сообщение
Почему на 17h у меня лежит только LJMP ISR_INT0, а сама метка начинается аж на 082D, почему инструкции метки не пишутся сразу за LJMP?
ISR_INT0 - это Interrupt Service Routine for Interrupt 0. По русски - обработчик прерывания. Адреса векторов прерывания расположены в начале области памяти программ по фиксированным адресам. Их (векторов входа в прерывание) там может быть много расположенных подряд, и максимум, что в одном может поместиться, - команда Jump. А само тело обработчика вынесено в другое (произвольное) место.

Цитата Сообщение от BuJIJI Посмотреть сообщение
зачем тут ANL и ORL, почему нельзя просто установить через MOV.
Команда MOV устанавливает байт целиком, все его биты. Если нужно изменить только несколько бит в байте, не изменяя остальные (и не зная их значения), то это делается битовыми командами или, как в данном случае, логическими операциями.
Команда ANL TMOD, #0F0H сбросит в "0" младшие 4 бита регистра TMOD, старшие 4 бита при этом не изменятся.
Команда ORL TMOD, #09 установит в "1" биты 0 и 3 регистра TMOD, остальные биты при этом не изменятся.
То, что при такой последовательности команд биты 0 и 3 сначала сбрасываются в "0", потом устанавливаются в "1", - наверное так требуется для запуска чего-то. Нужно так, или нет, - в этом разберитесь сами по даташиту в описании назначения битов управляющего регистра TMOD.
1
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
18.11.2021, 12:36  [ТС]
Спасибо! А как генерируются эти самые прерывания в коде?
0
4043 / 2654 / 583
Регистрация: 11.09.2009
Сообщений: 9,487
18.11.2021, 14:44
Аппаратно.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
18.11.2021, 20:18  [ТС]
Как тогда препод даёт мне задание на генерацию импульсов?)

У меня из оборудования только Keil uVision 4
0
4043 / 2654 / 583
Регистрация: 11.09.2009
Сообщений: 9,487
19.11.2021, 00:00
Цитата Сообщение от BuJIJI Посмотреть сообщение
задание на генерацию импульсов
Речь про прерывания от встроенного в контроллер таймера. После его настройки и запуска, таймер разово или периодически (смотря как настроен и как обрабатывается флаг прерывания) вызывает прерывание. Это происходит аппаратно, таймер заданные временные интервалы считает сам.
По окончании отсчёта таймером заданного временного интервала устанавливается флаг прерывания от таймера, так же автоматически прерывается выполнение основного цикла программы и происходит вызов подпрограммы обработки этого прерывания. Вызов происходит по фиксированному адресу, назначенному этому прерыванию (см. выше). Команда вызова подпрограммы, включая загрузку в стек адреса возврата, так же выполняется аппаратно, нигде в коде её писать не надо.
В обработчике прерывания пишутся необходимые манипуляции по управлению выходами. В конце обработчика прерывания пишется команда возврата из прерывания, при её выполнении из стека достаётся адрес возврата, и основной цикл программы продолжается дальше.
Так на выходе можно формировать импульсную последовательность, т.е. сделать генератор импульсов.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
19.11.2021, 02:42
Лучший ответ Сообщение было отмечено BuJIJI как решение

Решение

Можно и без прерываний. Достаточно в цикле проверять флаг TF0.
Зависит от точной задачи. А в "задании на лабу" из поста #3 есть непонятные слова
Цитата Сообщение от BuJIJI Посмотреть сообщение
коэффициент K не задан
Цитата Сообщение от BuJIJI Посмотреть сообщение
У меня из оборудования только Keil uVision 4
У вас из оборудования есть ещё и сам процессор. Ну или симулятор процессора в Keil uVision.
Ну и в целом по поводу прерываний. BuJIJI ну почитали бы вы хоть какую-нибудь умную книжку. Форум всё-таки существует не для того, чтобы разжёвывать азбучные истины для всех тех, кто не хочет нормально учиться.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
19.11.2021, 09:45  [ТС]
Точная задача звучит так:
Закодируйте программу на языке Ассемблер согласно приведенному далее условию.
Составьте программу на ассемблере для формирования с помощью встроенного в МК таймера-счетчика (Т/С) прямоугольных импульсов положительной полярности длительностью … и паузой … (или указывается отношение длительности импульса к длительности паузы сигнала как коэффициент K) соответственно при установленной частоте тактирования МК Fosc = … . Число повторений импульсов N = … . Протестируйте работу программы.

СПО_Б-ТС1-45-25-х-12-15
Расшифровка: задание типа «Б» – требуется задействовать таймер-счетчик ТС1; длительность формируемого импульсного сигнала составляет 45 мс, пауза – 25 мс, коэффициент K не задан; частота тактового генератора Fosc = 12 МГц; кол-во повторений импульсов N равно 15.

Добавлено через 5 минут
Форум всё-таки существует не для того, чтобы разжёвывать азбучные истины для всех тех, кто не хочет нормально учиться.
Да я бы с радостью почитал бы книгу, если бы хотя бы знал какую именно чтобы всё это понять. Материалы препода не особо доходчиво объясняют, там как бы есть много умных слов про прерывания, но картинка в голове не рисуется, поэтому я иду таким практическим путём. При всём при этом у меня ещё работа, которая занимает 90% времени, поэтому извиняюсь и благодарю за помощь)
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
19.11.2021, 14:07
Магда Ю С
МИКРОКОНТРОЛЛЕРЫ
СЕРИИ 8051:
ПРАКТИЧЕСКИЙ ПОДХОД
 Комментарий модератора 
правила п 5.3
Запрещено размещать любые материалы, нарушающие авторские права (без разрешения правообладателя), а также ссылки на них.
Вложения, ожидающие проверки
Тип файла: pdf magda_8051.pdf
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
20.11.2021, 02:30
Цитата Сообщение от BuJIJI Посмотреть сообщение
При всём при этом у меня ещё работа, которая занимает 90% времени
Это что тогда? Типа курсов повышения квалификации? Молодец!
По описанию задачи не требуются прерывания от таймера.
Буде у меня время в выходные, набросаю два варианта решения. С прерыванием и без.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
20.11.2021, 09:34  [ТС]
Спасибо большое!

Это учёба в ВУЗе. Я учусь в ВУЗе на дистанционной форме, когда на сессию даже ходить не надо. Соответственно и обратную связь от преподавателей сложно получать. Вообще учеба в ВУЗе больше для корочки, но так как я по профессии программист и мне это нравится, то решил сам выполнять эти задания чтобы поизучать ассемблер, подтянуть свои знания в микропроцессорах, узнать как всё это низкоуровнего устроено.
0
0 / 0 / 0
Регистрация: 21.11.2021
Сообщений: 2
21.11.2021, 13:35
BuJIJI, Коллега, Вы учитесь в известном ВУЗе на Авиамоторной? Можно с Вами лично связаться?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
21.11.2021, 15:51
Цитата Сообщение от nikitako Посмотреть сообщение
Вы учитесь в известном ВУЗе на Авиамоторной?
на Авиамоторной стопитсот ВУЗов
МТУСИ что ли?
0
0 / 0 / 0
Регистрация: 21.11.2021
Сообщений: 2
21.11.2021, 16:24
ValeryS, не МТУСИ. Думаю, что топикстартер поймет. Я вижу, что BuJIJI уже сильно продвинулся в решении заданий.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
21.11.2021, 16:29  [ТС]
Конечно можно лично связаться, где вам удобнее? Оставляйте контакты свои
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 114
23.11.2021, 16:30  [ТС]
Еее я разобрался!
Защитил преподу на 5 эту лабу. Осталась последняя.
Вот какую программу я написал:
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
CSEG AT 0h ; Устанавливаем начало сегмента кода в 0h
 
; Программа формирует 15 импульсов длиной 45 мс с задержкой 25 мс, путём подачи на P1.0 0 и 1.
; Программа справедлива при частоте процессора 12 MHz. При частоте 24 MHz необходимо умножать полученные миллисекунды на 2.
; Реализация отсчёта времени основана на оступе от верхней границы таймера и ожидания флага переполнения
 
 
 
MOV A, #1Eh ; Помещаем в аккумулятор 30d для отсчёта 15 положительных импульсов
CLR P1.0 ; Сбрасываем 0 бит порта P1
MOV TMOD, #00010000b ; Настраиваем ТС 1 в режим 1
SJMP MAIN ; Прыгаем на метку MAIN
 
DELAY:
CLR P1.0 ; Сбрасываем 0 бит порта P1 в 0
MOV TL1, #58h
MOV TH1, #9Eh; 25 мс до флага прерывания. Всего тактов таймера 65536. - 25000 = 40536d = 9E58h.
;При условии что частота тактового генератора Fosc = 12 МГц
SETB TR1 ; Запускаем таймер
SJMP WAIT ; Уходим в задержку
 
MAIN:
JZ OUT ; Завершаем программу в случае, если A равно 0
DEC A ; Уменьшаем A на 1
JB P1.0, DELAY ; Если бит порта находится в 1, то уходим на задержку в 25 мс
MOV TL1, #38h
MOV TH1, #50h ; 45 мс до флага прерывания. Всего тактов таймера 65536. - 45000 = 20536d = 5038h.
;При условии что частота тактового генератора Fosc = 12 МГц
SETB P1.0 ; Устанавливаем 0 бит порта P1 в 1
SETB TR1 ; Запускаем таймер
 
WAIT:
JNB TF1, WAIT ; Осуществляем задержку до переполнения таймера
CLR TR1 ; Останавливаем таймер
CLR TF1 ; Сбрасываем флаг переполнения
SJMP MAIN ; Переходим в MAIN
 
OUT:
CLR P1.0 ; Сбрасываем бит порта
CLR TR1 ; Выключаем таймер
CLR TF1 ; Сбрасываем флаг переполнения
SJMP $ ; Уходим в бесконечный цикл
END
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
23.11.2021, 18:30
Непонятна строка

Assembler
1
JB P1.0, DELAY ; Если бит порта находится в 1, то уходим на задержку в 25 мс
Если P1.0 это выход, то его нельзя опрашивать как вход, а надо создавать переменную-бит с таким же значением.
А если P1.0 это вход, то возможно надо установить его в 1, а затем только читать.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
23.11.2021, 18:55
Цитата Сообщение от qbfan Посмотреть сообщение
Если P1.0 это выход, то его нельзя опрашивать как вход
посмотри устройства портов 0x51, там нет режима вход/выход
выход транзистора соединён со входом триггера Шмидта, соответственно считывая порты можешь определить , ноги в каком состоянии
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2021, 18:55
Помогаю со студенческими работами здесь

Формирователь меандра с частотой 36 кГц (8051, Proteus, ASM)
Задача мне была задана такая: на выходе порта P1.1 сформировать меандр с частотой 36 кГц, тактовая частота 12 МГц. Написал код на ASM,...

Определение минимального элемента в массиве (Intel 8051, ASM, Keil uVision4)
Задача: Составьте программу на языке ассемблера, которая реализует алгоритм решения Определение минимального элемента массива в...

Asm 8051 | найти количество элементов, значение которых четное или меньше 110
найти количество элементов, значение которых четное или меньше 110 Не могу понять как написать(через cjne A,#110,m) и куда вставить...

AT89C52 24Pi чем программировать?
Разобрал ККМ. извлёк данный камешек AT89C52 24Pi. Даташит только на английском. Грызется плоховато :-). Не могу найти программы, из которых...

При записи в регистр меняется содержимое соседнего (ASM, Intel 8051)
Здравствуйте Я написал программу - в этом куске CmcCommand: ;---------------Tuning settings, must be commented in real chip...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru