Помогите пожалуйста решить задачу!!!

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Помогите пожалуйста решить задачу!!!

Сообщение Milady »

1.в ПП с адреса 0080h находится массив из 16 чисел; элементами массива есть числа 10, 20,30,180. Посчитать и сохранить в регистрах R4-R7 количество повторений каждого элемента
2.подсчитать количество импульсов между установкой из «1» в «0» на порту Р1.1 с помощью таймера/счетчика.
3.по нажатию клавиши произвести циклический сдвиг «1» по разрядам порта Р0
Последний раз редактировалось Milady Пт апр 08, 2011 17:28:04, всего редактировалось 1 раз.
Реклама
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Это программа для МК51
MOV DPTR,#80H;
MOV A,#0AH; в даной строке, #0AH - это число 10 в шестнадцатеричной системе
MOVX @DPTR, A;

INC DPTR;
MOV A,#014H; в даной строке, #14H - это число 20 в шестнадцатеричной системе
MOVX @DPTR, A;

INC DPTR;
MOV A,#01EH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0B4H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#04H;
MOVX @DPTR, A;
;
INC DPTR;
MOV A,#05H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#06H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#07H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#08H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#09H;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0AH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0BH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0CH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0DH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0EH;
MOVX @DPTR, A;

INC DPTR;
MOV A,#0FH;
MOVX @DPTR, A ///Это массив из 16 чисел. дальше надо сравнивать и запоминать количество повторений
Реклама
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Помогите пожалуйста решить задачу!!!

Сообщение IM1 »

Уважаемая Миледи, команда MOVX не применяется для ПП (памяти программ), для нее существуют всего 2 команды и одну из них MOVC A, @A+DPTR и будем использовать.

Код: Выделить всё

mov	dptr, #80h	;начальный адрес массива
mov	r0, #0		;обнуляем счетчик кол-ва элементов массива
mov	r4, #0		;обнуляем
mov	r5, #0		;счетчики повторений
mov	r6, #0		;элементов 
mov	r7, #0		;массива 


metka:
mov	a, r0		;выбираем элемент массива
movc	a, @a+dptr	;читаем элемент массива в аккумулятор
cjne	a, #10, metka_1	;проверяем элемент массива на равенство 10, если нет, то проверяем дальше
inc	r4		;элемент массива=10, поэтому r4=r4+1
jmp	metka_5		;уходим на проверку окончания цикла	
metka_1:
cjne	a, #20, metka_2	;проверяем элемент массива на равенство 20, если нет, то проверяем дальше
inc	r5		;элемент массива=20, поэтому r5=r5+1
jmp	metka_5		;уходим на проверку окончания цикла	
metka_2:
cjne	a, #30, metka_3	;проверяем элемент массива на равенство 30, если нет, то проверяем дальше
inc	r6		;элемент массива=30, поэтому r6=r6+1
jmp	metka_5		;уходим на проверку окончания цикла	
metka_3:
inc	r7		;если элемент массива не равен 10, 20 и 30, значит он равен 180 и r7=r7+1
metka_5:
inc	r0		;выбираем следующий элемент массива
cjne	r0, #16, metka	;если не достигли конца элементов массива, то цикл повторяем
nop
nop			; конец 1-й задачи

end 		
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Спасибо большое!!!! открыла, там правда сначала было не все понятно, но я разобралась вроде. но она не считает. или я что-то не так делаю.ВОПРОС. числа 10,20,30,180 переводим в хекс. и записываем в память ЕЕРROM , рам или куда? у меня считает только R0 и R7. и досчитывают до 10(Н). что не так?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Помогите пожалуйста решить задачу!!!

Сообщение IM1 »

Уважаемая Миледи, я не ожидал, что до такой степени у Вас все в начале.
Дело в том, что по условию задачи числа 10,20,30,180 уже находятся в пп и когда Вы проверяете их наличие в реальности, а их там нет, то программа полагает, что раз нет 10,20,30, то значит там 180 и увеличивает счетчик r7 16 раз (10h), все правильно делает. Ну а r0 счетчик элементов и так как их 16, то в конце работы программы обязательно будет содержать в себе 10h.
Память программ (пп), это память где находится Ваша программа и писать туда МК не может. Если хотите, то поместите туда массив самостоятельно, для этого в программу между оператором nop и командой end вставьте примерно такой кусочек кода с 16 числами из ряда 10,20,30,180 посредством оператора db:

Код: Выделить всё

org    80h    ;указываем адрес начала массива
massiv:       ; метка, необязательна
db    10, 20, 30, 180, 20, 30, 10, 30
db    180, 20, 20, 30, 10, 30, 180, 10 
Массив для примера, в реале вводите числа в любой последовательности, а регистры r4-r7 посчитают количество повторений каждого.
И еще, переводить числа 10,20,30,180 и другие, если нет особой необходимости, принудительно в хекс нет смысла. Если нет буковки "h" , то ассемблер прекрасно понимает, что это число десятичное и переведет его сам.
Реклама
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Прям не знаю как вас благодарить!!!!!!!!!!!! я лишь совсем недавно начала изучать ассемблер МК51. до этого немного изучала 86й. а тут дают сразу сложные задачи. и с прогой разобралась. оказывается, это совсем просто.я ведь не совсем глупая.и писала все проги по лабам сама. а можете объяснить, если знаете, как писать программы с таймером, какие для этого использоватькоманды. или где это подробно прочитать?а то нам ничего не объяснили, дали только задание.
Реклама
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Вот пример программы. она похожая на мою немного
Вложения
Фото079.jpg
Вот пример программы
(250.91 КБ) 355 скачиваний
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Помогите пожалуйста решить задачу!!!

Сообщение IM1 »

Milady писал(а):2.подсчитать количество импульсов между установкой из «1» в «0» на порту Р1.1 с помощью таймера/счетчика.
3.по нажатию клавиши произвести циклический сдвиг «1» по разрядам порта Р0
По 2-й задаче непонятки:
что есть "между установкой из «1» в «0» на порту Р1.1"?. Может быть во время действия "1"?
Какие импульсы считать, внешние (если да, то по какому порту) или внутреннего генератора?
по 3-й задаче:
где будет клавиша и уровень при нажатии ( "0" или "1"), мы определяем сами?
Клавиша считается "идеальной" или надо устранять "дребезг"?
Milady писал(а): как писать программы с таймером, какие для этого использовать команды. или где это подробно прочитать?а то нам ничего не объяснили, дали только задание.
Я бы посоветовал книгу:
Zanimatelno_o_microkontrolerax.pdf
(166.28 КБ) 293 скачивания
Она есть в сети, если не найдете, то скажите куда скинуть.
Ну уж если доведется глубоко изучать программирование на МК51, то можно и Фрунзе А. В. "Микроконтроллеры? Это же просто!" все 4 тома.
Milady писал(а):Вот пример программы. она похожая на мою немного
Даже не знаю, - смеяться или плакать? Украинский технический, это нечто. В общем, ничего не понял.
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

задача 2 была по идее несложной. препод чуть поменял порт(на 3.5)и смотреть ответ в порту 1.количество импульсов будет таким, сколько раз нажимать на кнопку бита порта 3.5. а в итоге программа выглядит так.
org 00h
ajmp start
org 30h
start:
mov tmod,#01010000B
mov tl1,#0
mov th1,#0
setb tr1
wait0:
mov p1,tl1
nop
ajmp wait0

только последняя задача пока не решена. кнопка по идее тоже будет в симуляторе битом порта. нужно решить задачу через прерывание. его нужно настроить,и что-то в общем такое
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Помогите пожалуйста решить задачу!!!

Сообщение IM1 »

Milady писал(а):только последняя задача пока не решена. кнопка по идее тоже будет в симуляторе битом порта. нужно решить задачу через прерывание. его нужно настроить,и что-то в общем такое
Уважаемая Миледи, насколько я понял, Вам требуется что-то типа такого:

Код: Выделить всё

; используем внешнее прерывание int0, у которого вход на выводе p3.2
; соответственно на p3.2 и подключаем кнопку, которая при нажатии выдает лог "0"
; используем прерывание по "срезу импульса", т.е. прерывание возникает не по 
; лог. "0", а при переходе из лог. "1" в лог. "0", а затем нас этот "0" не волнует до
; следующего среза, т.е. кнопку надо будет отпустить, а потом еще раз нажать
; кнопку считаем идеальной. т.е. не создающей "дребезга"
org 0
	jmp		start

; задаем адрес вектора внешнего прерывания int0 (0003h)
org 3							
	jmp		irr_0				; переходим на обработку прерывания		
start:
	mov 	tcon, #00000001b	; устанавливает бит (it0="1") управления типом прерывания int0 (срез)
	mov 	ie, #10000001b 		; разрешаем прерывание int0 (бит ex0="1") и устанавливаем общее
								; разрешение на прерывания (бит ea="1")
	mov 	a, #00000001b 		; уст. лог. "1" в младшем разряде аккумулятора
	mov		p0, a				; отправляем содержимое акк. в порт 0
wait0:
   jmp wait0 						; далее зацикливаемся и ждем нажатия кнопки

; обработка прерывания, будем попадать сюда при каждом нажатии кнопки
irr_0:
	rl		a					; сдвигаем нашу единицу в акк. циклически влево на 1 разряд
	mov		p0, a				; отправляем содержимое акк. в порт 0
	reti						; выходим из обработки прерывания

; все

end
В заключение, маленькое замечание:
для перехода пишите просто jmp, а ассемблер при трансляции сам сообразит, что лучше применить ljmp, ajmp или sjmp, тоже самое для lcall и acall, пишите просто call.
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Большое спасибо. пришлось разобраться с организацией прерываний и настройкой. Вот что в итоге получилось
org 00h
jmp start
org 0003h
jmp i0
org 030h
i0:
PUSH ACC
PUSH PSW
PUSH B
PUSH DPL
PUSH DPH
mov a,p1
rl a
mov p1,a
POP DPH
POP DPL
POP B
POP PSW
POP ACC
reti

start:
mov p0,#01
mov ip, #00000001b
mov ie,#10010001b
mov tcon,#00000011b
tt:
nop
jmp tt
end.
а если надо проверить, работает ли программа в симуляторе Пиннакл, то tt: поставить после строки mov p0,#01.
Также эта программа была проверена в симуляторе Протеус. (преподаватель немного помог). После всего этого вчера был распечатан и сдан отчет со всеми лабораторными работами. Итог защиты лабораторных- оценка 5В(то есть 5 с минусом)
Milady
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 08, 2011 17:17:27

Re: Помогите пожалуйста решить задачу!!!

Сообщение Milady »

Вот картинка работающей программы. только порт 0 поменян на порт 1. препод сказал, что там нужны какие-то дополнительные настройки для него.
Вложения
прога.JPG
(45.33 КБ) 343 скачивания
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Помогите пожалуйста решить задачу!!!

Сообщение IM1 »

Milady писал(а):Итог защиты лабораторных- оценка 5В(то есть 5 с минусом)
Поздравляю!
А теперь продолжим разбор полетов, думаю это будет познавательно и другим начинающим:
Milady писал(а):PUSH ACC
PUSH PSW
PUSH B
PUSH DPL
PUSH DPH
Milady писал(а):POP DPH
POP DPL
POP B
POP PSW
POP ACC
Если в обработке прерывания эти регистры не используются, то нет смысла загонять их в стек и затем выталкивать обратно.
Milady писал(а):mov ip, #00000001b
Если используется только одно прерывание, то установка приоритета теряет смысл.
Milady писал(а):mov tcon,#00000011b
Установка флага прерывания tcon.1 происходит автоматически при вызове самого прерывания и сбрасывается также автоматически при его обработке. Установка программой tcon.1 (он же ie0) имеет смысл если вы хотите вызвать прерывание искусственно, т.е. не по входу (кнопке), а непосредственно из программы, что можно сделать к примеру командой setb ie0 в нужный момент.
Milady писал(а):Вот картинка работающей программы. только порт 0 поменян на порт 1. препод сказал, что там нужны какие-то дополнительные настройки для него.
Порт p0 имеет выход на транзисторах с открытым стоком и при чтении его командой mov a, p0 будем иметь в аккумуляторе только нули. Чтобы этого избежать необходимо установить 8 резисторов на его выводы, примерно так как стоит у Вас на входе кнопки, т.е. на плюс питания. Обратите внимание, что в своей программе, я порт p0 не читал, а только выводил в него.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»