Программа для PIC16F837A

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Программа для PIC16F837A

Сообщение nikita_kepp »

Всем привет. Задали заполнить РОН банка номер 1 кадрами двоично-десятичных числе от 15 до 0. У меня получилось заполнить только первую строку. Подскажите, как заполнить остальные 5.

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

#include p16f873a.inc
	__CONFIG _HS_OSC
SIZE_MAS equ h'B0'
_DATA equ h'B1'
START_ADR equ h'A6'
SIZE_MAS2 equ h'B2'
_DATA2 equ h'B3'
START_ADR2 equ h'A0'
	ORG 8
	bsf STATUS, RP0
	bcf STATUS, RP1
	movlw d'6'
	movwf SIZE_MAS2
	movlw d'21'
	movwf _DATA2
	movlw START_ADR2
	movwf FSR
loop:
	movf _DATA2,W
	movwf INDF
	decf _DATA2, F
	incf FSR, F
	decf SIZE_MAS2, F
	movf SIZE_MAS2, W
	btfss STATUS, Z
	goto loop
	bsf STATUS, RP0
	bcf STATUS, RP1
	movlw d'10'
	movwf SIZE_MAS
	movlw d'9'
	movwf _DATA
	movlw START_ADR
	movwf FSR
loop2:
	movf _DATA,W
	movwf INDF
	decf _DATA, F
	incf FSR, F
	decf SIZE_MAS, F
	movf SIZE_MAS, W
	btfss STATUS, Z
	goto loop2
Последний раз редактировалось nikita_kepp Вт апр 18, 2023 12:42:30, всего редактировалось 1 раз.
Реклама
dementor1987
Родился
Сообщения: 4
Зарегистрирован: Пн апр 17, 2023 22:47:38

Re: Программа для PIC16F837A

Сообщение dementor1987 »

Т.е. у вас с А0 по АF hex числа с 15 по 0, исключая А, B, C, D, E, F?
И надо такими же числами заполнить еще 5 "строк" B0-BF, C0-CF, D0-DF, E0-EF и F0-FF?
Реклама
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Re: Программа для PIC16F837A

Сообщение nikita_kepp »

[uquote="dementor1987",url="/forum/viewtopic.php?p=4402615#p4402615"]Т.е. у вас с А0 по АF hex числа с 15 по 0, исключая А, B, C, D, E, F?
И надо такими же числами заполнить еще 5 "строк" B0-BF, C0-CF, D0-DF, E0-EF и F0-FF?[/uquote] Да всё верно, потом нужно переписать в EEPROM (по порядку следования адресов) числа кратные 5-ти.
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Программа для PIC16F837A

Сообщение OKF »

Никита, ты бы код научился правильно вставлять. Сначала.
Реклама
Эиком - электронные компоненты и радиодетали
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Re: Программа для PIC16F837A

Сообщение nikita_kepp »

[uquote="OKF",url="/forum/viewtopic.php?p=4402795#p4402795"]Никита, ты бы код научился правильно вставлять. Сначала.[/uquote] Исправил
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Программа для PIC16F837A

Сообщение Martian »

А что, преподаватель запрещает обращаться за помощью? Или лекции тихо читал?

Судя по тому, что данный вопрос всплывает эпизодически, это - задание студента. Пущай сам выполняет.
Реклама
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

Re: Программа для PIC16F837A

Сообщение linkov1959 »

Помощь студентам отлажена по тарифной сетке.:) Никита смекнул, что мир не без добрых людей.:)
dementor1987
Родился
Сообщения: 4
Зарегистрирован: Пн апр 17, 2023 22:47:38

Re: Программа для PIC16F837A

Сообщение dementor1987 »

Так как у вас один и тот же код скорей всего будет использоваться 6 раз (если продолжать заполнение массива данных в вашем стиле) то логично использовать отдельную подпрограмму для
шести строк - fill_nums и "скармливать" ей адреса всех шести строк по очереди в главном цикле программы. Конец программы надо завершать директивой END. Если мы часть действий выполняем подпрограммой, то главный год надо зациклить пусть и пустым циклом MAIN_LOOP: NOP - Goto MAIN_LOOP.
Если избавиться от дублирующих переменных, константы вынести в заголовок и предположить что вся работа будет происходить в Банке данных 0, дополнить слово конфигурирования (не только выбор тактового генератора) то программа может выглядеть как-так:
Спойлер

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

#include p16f873a.inc
	__CONFIG _HS_OSC & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _CP_OFF & _WRT_OFF  & _DEBUG_OFF
; выбраны:
; высокоскоростной генератор
; сторожевой таймер выключен
; задержка при включении питания активирована
; выключение при снижении питания включено
; низковольтное программирование не задействовано
; защита данных программ, ПЗУ, записи отключено
; отладка отключена

; Стартовые адреса шести строк в памяти данных
START_ADR1_6 equ h'A0'
START_ADR2_6 equ h'B0'
START_ADR3_6 equ h'C0'
START_ADR4_6 equ h'D0'
START_ADR5_6 equ h'E0'
START_ADR6_6 equ h'F0'

; massive pointer 
;- Вместо переменных SIZE_MAS2 и SIZE_MAS одна переменная
;- mas_p, т.к. они использовались по очереди. Переменная в Банке 0,
; потому что Банк 1 будет полностью использован
mas_p		equ 	h'20'	
; Константы для вычисления длины массива
SIZE_MAS2	equ		d'6'
SIZE_MAS1	equ		d'10'
; - Вместо _DATA и _DATA2 - _data в Банке 0
_data	equ			h'21'	;
; Константы для вычисления hex числа
_DATA2	equ		d'21'
_DATA1	equ		d'9'

	ORG 0
Goto	START
	ORG 8
START
	Movlw	START_ADR1_6		; 1-ый из 6
	Call	fill_nums
	Movlw	START_ADR2_6		; 2-ой из 6
	Call	fill_nums
	Movlw	START_ADR3_6		; 3-ий из 6
	Call	fill_nums
	Movlw	START_ADR4_6		; 4-ый из 5
	Call	fill_nums
	Movlw	START_ADR5_6		; 5-ый из 6
	Call	fill_nums
	Movlw	START_ADR6_6		; 6-й из 6
	Call	fill_nums
MAIN_LOOP
	NOP					; Главный цикл ничегонеделанья
	Goto	MAIN_LOOP	
;********************************************************
;		 	***		 fill_nums		 ***				*
; Заполняем 16 ячеек начиная со стартового адреса в 	*
;  аккумуляторе в обратном порядки числами:				*
;  15,14,13,12,11,10,9 ... 4,3,2,1,0 в hex виде			*	
;********************************************************
fill_nums
;- Работа с регистрами FSR и INDF возможна из любого банка		
	movwf	FSR
	movlw 	SIZE_MAS2
	movwf 	mas_p
	movlw 	_DATA2
	movwf 	_data
loop:
	movf 	_data,W
	movwf 	INDF
	decf 	_data, F
	incf 	FSR, F
	decf 	mas_p, F	
;- Дополнительно запихивать переменную в раб. аккумулятор
;-  не надо, т.к. результат команды влияет на Z		
	btfss 	STATUS, Z
	goto loop
			
	movlw SIZE_MAS1
	movwf mas_p
	movlw _DATA1
	movwf _data
		
loop2:
	movf _data,W
	movwf INDF
	decf _data, F
	incf FSR, F
	decf mas_p, F
	btfss STATUS, Z
	goto loop2

	Return

END
Вот окно памяти данных после выполнения основной программы:
Изображение
PS
Насчет записи в ПЗУ чисел кратных 5 попробуйте сами, по идее можно загнать в FSR начальный адресс - A0 и двигаясь до конца - А0+(6*16) проверять на кратность пяти и при успешной проверке запихивать в ПЗУ (хотя какой смысл проверять все строки если данные отличаются только в пределах "строки" а между строками - нет).
Все числовые константы советую выносить в шапку и давать им отличающиеся имена (например в верхнем регистре через нижнее подчеркивание) это облегчает восприятие вашей команды проверяющем
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Re: Программа для PIC16F837A

Сообщение nikita_kepp »

Так как у вас один и тот же код скорей всего будет использоваться 6 раз (если продолжать заполнение массива данных в вашем стиле) то логично использовать отдельную подпрограмму для шести строк - fill_nums и "скармливать" ей адреса всех шести строк по очереди в главном цикле программы. Конец программы надо завершать директивой END. Если мы часть действий выполняем подпрограммой, то главный год надо зациклить пусть и пустым циклом MAIN_LOOP: NOP - Goto MAIN_LOOP.
Спасибо, за помощь, но я целый день изучал флаги STATUS и вышла такая штука:

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

#include p16f873a.inc
	__CONFIG _HS_OSC
	ORG 3
	bcf STATUS, RP0
	bcf STATUS, RP1
		MOVLW	h'A0'
		movwf	FSR
LOOP1:		
		MOVLW	h'15'
LOOP2:	
		MOVWF	INDF
		INCF	FSR,F
		BTFSC	STATUS,Z
		GOTO	LOOP3	; If FSR=0
		ADDLW	h'FF'		; X->X-1
		BTFSS	STATUS,C
		GOTO	LOOP1		; If 0->0FFh
		BTFSS	STATUS,DC ; Проверяем десятичный перенос
		ADDLW	-6		; If 10h->0Fh
		GOTO	LOOP2
LOOP3:END
С EEPROMом пока как то очень туго :cry: :cry:
dementor1987
Родился
Сообщения: 4
Зарегистрирован: Пн апр 17, 2023 22:47:38

Re: Программа для PIC16F837A

Сообщение dementor1987 »

Оригинально :)
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: Программа для PIC16F837A

Сообщение Родэрик »

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

B0	
	MOVLW	0x0A0
	MOVWF	FSR
	;
B0.IT1	
	MOVLW	0Fh
	XORWF	FSR,W
	ANDLW	0Fh
	MOVWF	INDF
	INCFSZ	FSR,F
	GOTO	B0.IT1
	;
	;
8)
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Re: Программа для PIC16F837A

Сообщение nikita_kepp »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4403105#p4403105"]8)[/uquote] Было бы неплохо, если бы не нужно было пропускать A, B, C, D, E, F :)). Может подскажешь как переписать в EEPROM числа кратные 5 в таком же порядке с сохранением адресов?
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: Программа для PIC16F837A

Сообщение Родэрик »

Всего лишь увидел картинку выше и представил свой вариант. По крайней мере по ней видно какую именно задачу решал человек. А что касается твоих заданий, то я тупо не понимаю такие неоднозначные формулировки. Взять к примеру вот это "пропустить A, B......". В смысле, вообще их не писать? ........ но тогда зачем вообще упоминать про них (15.....0), если можно просто написать: мол, надо циклично заполнить числами [10......0] пространство [0x0A0..........0x0FF]. Но в этом случае тогда также нет смысла упоминать про строки, но про них речь все же идёт........ получается abcdef не пропускать хотят, а тогда что? Может заменить чем-то, но чем.........? То же самое с этим ипромом. Я, например, понимаю слово "кратно", но совершенно не въезжаю, что и как тебе надо заполнить. "числа кратные 5" - из какого диапазона? "в том же порядке" - это как? Есть какой-то "порядок"/формат, где он описан? "с сохранением адресов" - в смысле сохранять адреса как данные? по какому принципу?...
Ну и во-вторых, - ты создаёшь тему, представляешь какой-то код (особо не вникал) и типа ты сделал для одной строки, а для остальных сделать тоже самое уже почему то не в силах. Что довольно странно....... Чуть позже ("изучив флаги") ты публикуешь решение, тоже сильно не вникал в саму математику, но в котором явно ощущается подход ....... И если этот код реализует описанное в задании и ты самостоятельно и осмысленно его написал, то тогда какие у тебя могут быть проблемы с ипром.......?
dementor1987
Родился
Сообщения: 4
Зарегистрирован: Пн апр 17, 2023 22:47:38

Re: Программа для PIC16F837A

Сообщение dementor1987 »

[uquote="nikita_kepp",url="/forum/viewtopic.php?p=4403267#p4403267"][uquote="Родэрик",url="/forum/viewtopic.php?p=4403105#p4403105"]8)[/uquote] Может подскажешь как переписать в EEPROM числа кратные 5 в таком же порядке с сохранением адресов?[/uquote]
А что значит с сохранением адресов? Вот допустим ячейка А0 содержит 15h, которое не кратно 5, значит в ЕЕПРОМ записываем 0 в нулевую ячейку? А затем 14h делится на 5, значит надо записать в ЕЕПРОМ 14h в первую ячейку?
nikita_kepp
Родился
Сообщения: 6
Зарегистрирован: Пн апр 17, 2023 19:59:16

Re: Программа для PIC16F837A

Сообщение nikita_kepp »

[uquote="dementor1987",url="/forum/viewtopic.php?p=4403486#p4403486"][uquote="nikita_kepp",url="/forum/viewtopic.php?p=4403267#p4403267"][uquote="Родэрик",url="/forum/viewtopic.php?p=4403105#p4403105"]8)[/uquote] Может подскажешь как переписать в EEPROM числа кратные 5 в таком же порядке с сохранением адресов?[/uquote]
А что значит с сохранением адресов? Вот допустим ячейка А0 содержит 15h, которое не кратно 5, значит в ЕЕПРОМ записываем 0 в нулевую ячейку? А затем 14h делится на 5, значит надо записать в ЕЕПРОМ 14h в первую ячейку?[/uquote] Как то вот так должно получиться
Вложения
Скриншот 21-04-2023 132846.jpg
(144.36 КБ) 99 скачиваний
Ответить

Вернуться в «PIC»