Форум РадиоКот https://radiokot.ru/forum/ |
|
Программа для PIC16F837A https://radiokot.ru/forum/viewtopic.php?f=58&t=187957 |
Страница 1 из 1 |
Автор: | nikita_kepp [ Пн апр 17, 2023 20:04:12 ] |
Заголовок сообщения: | Программа для PIC16F837A |
Всем привет. Задали заполнить РОН банка номер 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 |
Автор: | dementor1987 [ Пн апр 17, 2023 22:54:50 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Т.е. у вас с А0 по АF hex числа с 15 по 0, исключая А, B, C, D, E, F? И надо такими же числами заполнить еще 5 "строк" B0-BF, C0-CF, D0-DF, E0-EF и F0-FF? |
Автор: | nikita_kepp [ Вт апр 18, 2023 11:22:58 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Т.е. у вас с А0 по АF hex числа с 15 по 0, исключая А, B, C, D, E, F? Да всё верно, потом нужно переписать в EEPROM (по порядку следования адресов) числа кратные 5-ти.
И надо такими же числами заполнить еще 5 "строк" B0-BF, C0-CF, D0-DF, E0-EF и F0-FF? |
Автор: | OKF [ Вт апр 18, 2023 12:39:42 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Никита, ты бы код научился правильно вставлять. Сначала. |
Автор: | nikita_kepp [ Вт апр 18, 2023 12:43:08 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Никита, ты бы код научился правильно вставлять. Сначала. Исправил
|
Автор: | Martian [ Вт апр 18, 2023 12:59:08 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
А что, преподаватель запрещает обращаться за помощью? Или лекции тихо читал? Судя по тому, что данный вопрос всплывает эпизодически, это - задание студента. Пущай сам выполняет. |
Автор: | linkov1959 [ Вт апр 18, 2023 16:39:33 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Помощь студентам отлажена по тарифной сетке. ![]() ![]() |
Автор: | dementor1987 [ Вт апр 18, 2023 20:21:54 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Так как у вас один и тот же код скорей всего будет использоваться 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 [ Вт апр 18, 2023 20:29:43 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Цитата: Так как у вас один и тот же код скорей всего будет использоваться 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ом пока как то очень туго ![]() ![]() |
Автор: | dementor1987 [ Вт апр 18, 2023 20:44:46 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Оригинально ![]() |
Автор: | Родэрик [ Ср апр 19, 2023 00:53:22 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Код: B0 MOVLW 0x0A0 MOVWF FSR ; B0.IT1 MOVLW 0Fh XORWF FSR,W ANDLW 0Fh MOVWF INDF INCFSZ FSR,F GOTO B0.IT1 ; ; ![]() |
Автор: | nikita_kepp [ Ср апр 19, 2023 11:17:06 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
![]() ![]() |
Автор: | Родэрик [ Ср апр 19, 2023 14:09:32 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
Всего лишь увидел картинку выше и представил свой вариант. По крайней мере по ней видно какую именно задачу решал человек. А что касается твоих заданий, то я тупо не понимаю такие неоднозначные формулировки. Взять к примеру вот это "пропустить A, B......". В смысле, вообще их не писать? ........ но тогда зачем вообще упоминать про них (15.....0), если можно просто написать: мол, надо циклично заполнить числами [10......0] пространство [0x0A0..........0x0FF]. Но в этом случае тогда также нет смысла упоминать про строки, но про них речь все же идёт........ получается abcdef не пропускать хотят, а тогда что? Может заменить чем-то, но чем.........? То же самое с этим ипромом. Я, например, понимаю слово "кратно", но совершенно не въезжаю, что и как тебе надо заполнить. "числа кратные 5" - из какого диапазона? "в том же порядке" - это как? Есть какой-то "порядок"/формат, где он описан? "с сохранением адресов" - в смысле сохранять адреса как данные? по какому принципу?... Ну и во-вторых, - ты создаёшь тему, представляешь какой-то код (особо не вникал) и типа ты сделал для одной строки, а для остальных сделать тоже самое уже почему то не в силах. Что довольно странно....... Чуть позже ("изучив флаги") ты публикуешь решение, тоже сильно не вникал в саму математику, но в котором явно ощущается подход ....... И если этот код реализует описанное в задании и ты самостоятельно и осмысленно его написал, то тогда какие у тебя могут быть проблемы с ипром.......? |
Автор: | dementor1987 [ Ср апр 19, 2023 16:59:28 ] |
Заголовок сообщения: | Re: Программа для PIC16F837A |
8) Может подскажешь как переписать в EEPROM числа кратные 5 в таком же порядке с сохранением адресов?А что значит с сохранением адресов? Вот допустим ячейка А0 содержит 15h, которое не кратно 5, значит в ЕЕПРОМ записываем 0 в нулевую ячейку? А затем 14h делится на 5, значит надо записать в ЕЕПРОМ 14h в первую ячейку? |
Автор: | nikita_kepp [ Пт апр 21, 2023 11:30:53 ] | ||
Заголовок сообщения: | Re: Программа для PIC16F837A | ||
8) Может подскажешь как переписать в EEPROM числа кратные 5 в таком же порядке с сохранением адресов?А что значит с сохранением адресов? Вот допустим ячейка А0 содержит 15h, которое не кратно 5, значит в ЕЕПРОМ записываем 0 в нулевую ячейку? А затем 14h делится на 5, значит надо записать в ЕЕПРОМ 14h в первую ячейку?
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |