Например TDA7294

Форум РадиоКот • Просмотр темы - Некорректная работа программы на ассемблере
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 23:15:10

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Некорректная работа программы на ассемблере
СообщениеДобавлено: Вс апр 21, 2019 09:27:23 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
Здравствуйте. По долгу службы мне пришлось осваивать микроконтроллеры и ассемблер, я нашел замечательный сайт labkit.ru и взял оттуда несколько простых программ. Этот пример с бегущей строчкой. То есть светодиоды должны загораться по очереди, но на макетной плате загорается только первый светодиод и дальше ничего не происходит. Компиллировал в среде mplab 8.91, все скомпилировалось и прошилось нормально. Я неофит, поэтому пожалуйста, опишите подробно почему программа не работает как надо.
вот текст программы взятый с сайта:
LIST P=PIC16F84A
__CONFIG H'3FF1'
STATUS EQU H'0003'
PORTB EQU H'0006'
TRISB EQU H'0006'
Reg_1 EQU H'000C'
Reg_2 EQU H'000D'
Reg_3 EQU H'000E'
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
bsf STATUS,0 ; установка нулевого бита в единицу

; установка сигналов на порту B
m1 rlf PORTB,1 ; <<< сдвиг в регистре PORTB
call Pause ; <<<
goto m1 ; <<< переход на метку (зацикливание)

;delay = 500000 machine cycles
Pause movlw .85
movwf Reg_1
movlw .138
movwf Reg_2
movlw .3
movwf Reg_3
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr

return
end ; конец программы


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Вс апр 21, 2019 12:09:02 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21837
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Во первых, код нужно публиковать в тегах кода, а не как простое сообщение.
Во вторых, при написании программы на ассемблере нужно присоединять к исходнику хедер контроллера (inc-файл, где уже объявлены все специальные регистры), а так же оформлять конфиг не в виде магического числа, а в виде масок с именами бит (так же объявленных в хедере).
Перепишу Ваш код хотя бы в теги.
Код:
LIST P=PIC16F84A
__CONFIG H'3FF1'
STATUS EQU H'0003'
PORTB EQU H'0006'
TRISB EQU H'0006'
Reg_1 EQU H'000C'
Reg_2 EQU H'000D'
Reg_3 EQU H'000E'
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
bsf STATUS,0 ; установка нулевого бита в единицу

; установка сигналов на порту B
m1 rlf PORTB,1 ; <<< сдвиг в регистре PORTB
call Pause ; <<<
goto m1 ; <<< переход на метку (зацикливание)

;delay = 500000 machine cycles
Pause movlw .85
movwf Reg_1
movlw .138
movwf Reg_2
movlw .3
movwf Reg_3
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr

return
end ; конец программы

Затем, в среде стоит включить симулятор и пройти свой код по шагам. Это тут же даст ответ на Ваш вопрос.
Но могу сказать, что двигать выходной порт - плохая идея. Нужно двигать переменную в ОЗу, которую выводить в порт.
Код:
init_var
   movlw  0x01
   movwf   Reg_4
m1
   bcf  STATUS, C
   rlf Reg_4, f ; <<< сдвиг в регистре регистре ОЗУ
   btfsc STATUS, C
   goto   init_var
   movf  Reg_4, w
   movwf  PORTB
   call Pause ; <<<
   goto m1


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Вс апр 21, 2019 15:36:25 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Да и IDE последняя (под старые компы с ХР) не 8.91, а 8.92....
И помимо *.inc еще и линкер скрипт *_g.lkr в проекте указывать надо...
:roll:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Вс апр 21, 2019 17:10:41 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21837
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Скрипт линкера для MPASM не обязателен.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Пн апр 22, 2019 06:35:57 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
...на макетной плате...

Проверить макетную плату.

_________________
Docendo discimus


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Вт апр 23, 2019 07:28:45 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
Затем, в среде стоит включить симулятор и пройти свой код по шагам.

Симулятор выполняет код нормально, ошибок не находит


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 12:52:00 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
Если кому интересно, я понял в чем проблема была. Калькулятор паузы Pause_ver1.2, который я использовал, выдавал неправильный код и при задержке более 700 машинных циклов пауза повторялась бесконечно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 12:59:21 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7854
Рейтинг сообщения: 0
А я ни чего не понял.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 13:14:09 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
И я. Объясни.

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 14:05:21 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
Ну когда симулятор доходил до сегмента паузы он зацикливался на строчках
Код:
wr decfsz Reg_1, F
goto wr

выполнял их по очереди и дальше не шел

я даже осциллографом проверил, если пауза менее 1 милисекунды ноги выдают прямоугольные импульсы, если больше, то сигнал постоянный

в чем же проблема, господа программисты, помогите понять?


Последний раз редактировалось Сиддха Ср апр 24, 2019 14:20:33, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 14:11:41 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7854
Рейтинг сообщения: 0
Должен идти , только не куда.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 14:23:01 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
как это некуда


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 14:28:44 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7854
Рейтинг сообщения: 0
а куда ???


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 14:51:26 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
а куда ???


вот же в начале я код писал
Код:
LIST P=PIC16F84A
__CONFIG H'3FF1'
STATUS EQU H'0003'
PORTB EQU H'0006'
TRISB EQU H'0006'
Reg_1 EQU H'000C'
Reg_2 EQU H'000D'
Reg_3 EQU H'000E'
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
bsf STATUS,0 ; установка нулевого бита в единицу

; установка сигналов на порту B
m1 rlf PORTB,1 ; <<< сдвиг в регистре PORTB
call Pause ; <<<
goto m1 ; <<< переход на метку (зацикливание)

;delay = 500000 machine cycles
Pause movlw .85
movwf Reg_1
movlw .138
movwf Reg_2
movlw .3
movwf Reg_3
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr

return
end ; конец программы


на этих строчках зацикливается
Код:
wr decfsz Reg_1, F
goto wr


команда decfsz подразумевает вычитание из f единицы, а когда f достигает нуля то пропускается следующая строчка. но почему то этого не происходит


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 15:13:09 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21837
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
но почему то этого не происходит

Вы наблюдаете это в симуляторе или косвенно на железе? То есть по шагам в симуляторе переменная становится равной нулю, а переход на return не происходит?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 15:19:02 
Мучитель микросхем
Аватар пользователя

Карма: 45
Рейтинг сообщений: 100
Зарегистрирован: Вс мар 12, 2006 14:53:26
Сообщений: 428
Откуда: Вологда
Рейтинг сообщения: 0
Цитата:
выполнял их по очереди и дальше не шел


МК выполняет команды
Код:
wr decfsz Reg_1, F
goto wr
decfsz Reg_2, F
goto wr
decfsz Reg_3, F
goto wr

return

не по очереди, а по правилам математического счёта.
Вот и посчитайте выдержку , хотя-бы, от регистра Reg_1, с учётом времени выполнения команд.
У меня получилось много..
Так что программу паузы изменяйте.
Для начала, выкиньте (закомментируйте) Reg_2 и оставьте крайние Reg_1 и Reg_3. Заносить какие-то данные в младший (Reg_1) регистр бесполезно. Считайте с нуля. А в старшем начните с двух, а потом, при необходимости, увеличивайте значение.

Код:
wr decfsz Reg_1, F
goto wr
;decfsz Reg_2, F
;goto wr
decfsz Reg_3, F
goto wr

return


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 15:24:00 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7854
Рейтинг сообщения: 0
Не полинился симульнуть и всё сработало как и должно быть. По адресу 0СН=0 и есть переход.ТС наводиш тень на плетень.
Задержка у него 0.5 сек. и о чём пишет Vovan555 , не понятно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 17:34:36 
Мучитель микросхем
Аватар пользователя

Карма: 45
Рейтинг сообщений: 100
Зарегистрирован: Вс мар 12, 2006 14:53:26
Сообщений: 428
Откуда: Вологда
Рейтинг сообщения: 0
А что не понятного-то?
В данной программе счётчики (регистры), это младший, средний и старший байты. Если-бы они работали по очереди, то их задержки складывались-бы. А так перемножаются.
Плюс время выполнения программы счёта.
Команда декрементирования - один машинный цикл. Команда перехода - два машинных цикла. Итого имеем, при значении в регистре 0, задержку в 770 машинных циклов.
Если в младший регистр занесено значение ( в данном случае 85), то по достижении в младшем регистре нуля, откуда счёт начнётся в младшем? Правильно, с нуля: 00-FF-FE и т.д.. И до тех пор, пока счёт не закончится.
Перед началом счёта начальные значения в счётчики заносятся, а во время выполнения счёта, кто вносить будет? Где это в программе?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 17:52:24 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7854
Рейтинг сообщения: 0
Может так понятней будет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Некорректная работа программы на ассемблере
СообщениеДобавлено: Ср апр 24, 2019 20:49:29 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср фев 13, 2019 21:53:35
Сообщений: 75
Рейтинг сообщения: 0
Вы наблюдаете это в симуляторе или косвенно на железе?

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y