Вопросы начинающих PIC ASM
Re: Вопросы начинающих PIC ASM
Ну надо же и альтернативы развивать.
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Подобные ошибки в Си еще более распространены. И компилятор их не видит. И все потому, что существуют определенные СОГЛАШЕНИЯ языка, которые способны истрактовать ошибочную запись как верную.yor писал(а):Ну как тут не согласиться, согласен конечно со всем:)) Я в gpsim проверяю, случай с "btfsc W" поймал
То есть любой компилятор (включая ассемблер) не имеет логики живого человека. Он работает ПО ПРАВИЛАМ.
Аккумулятор в синтаксисе определен как НОЛЬ. То есть везде, где пишется слово W, будет ПОДСТАВЛЕН при компиляции НОЛЬ.
И этот ноль не противоречит синтаксису.
Re: Вопросы начинающих PIC ASM
На том и постановим
А вот к вопросу, в каком состоянии после включения, POR и прочих сбросов находятся общие регистры, которые ОЗУ? Родэрик пишет, что FF, это случайно не в режиме программирования память программная? При обычной работе в симуляторе вижу, что по нулям. Насколько это корректно?
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
ОЗУ (общего назначения, а не спецрегистры) находятся В СЛУЧАЙНОМ СОСТОЯНИИ.
Симулятор тут вообще не причем.
Возьмите контроллер с отладчиком и включите его. Увидите в ОЗУ хаос. Правда этот хаос достаточно точно повторяем у данного образца...
Но это другая история...
SFR (регистры специального назначения) после сброса занимаю состояние указанное в даташите.
Симулятор тут вообще не причем.
Возьмите контроллер с отладчиком и включите его. Увидите в ОЗУ хаос. Правда этот хаос достаточно точно повторяем у данного образца...
Но это другая история...
SFR (регистры специального назначения) после сброса занимаю состояние указанное в даташите.
Последний раз редактировалось КРАМ Вт янв 12, 2016 17:51:01, всего редактировалось 1 раз.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Вопросы начинающих PIC ASM
Их значение после включения питания не определено.
Только вам думать, делать ли при INIT-е (до MAIN) "очистку памяти".
----
P.S.
Дуплет.
Только вам думать, делать ли при INIT-е (до MAIN) "очистку памяти".
----
P.S.
Дуплет.
- Реклама
- Родэрик
- Нашел транзистор. Понюхал.
- Сообщения: 162
- Зарегистрирован: Чт ноя 26, 2015 23:22:35
- Откуда: не с Уфы
- Контактная информация:
Re: Вопросы начинающих PIC ASM
Возьми да проверь.yor писал(а):На том и постановимА вот к вопросу, в каком состоянии после включения, POR и прочих сбросов находятся общие регистры, которые ОЗУ? Родэрик пишет, что FF, это случайно не в режиме программирования память программная? При обычной работе в симуляторе вижу, что по нулям. Насколько это корректно?
Я уже проверил в железе, поэтому и написал.
Как-то раз перенёс несколько регистров в другой банк, а очищал только нулевой. При включении питания у меня начало пикать по 255 раз, то есть содержимое тех регистров указывало но то сколько раз попикать, причём они там в очереди стояли. В чём дело, я далеко не сразу понял. И поверь, это не случайные значения каждый раз были, а всегда FF.
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
"Не верь глазам своим." (с)Родэрик писал(а): Возьми да проверь.
Я уже проверил в железе, поэтому и написал.
Как-то раз перенёс несколько регистров в другой банк
Значит так перенес...
Никаких FF в ОЗУ общего применения при включении питания нет.
Вы ошиблись.
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Вопросы начинающих PIC ASM
доброе время суток коты.
давно уже программирую в MPLAB 8, но столкнулся с необходимостью к проекту на asm подцепить дополнительный файл на asm, порывшись в гугле нашёл подобные темы, а вот как решить эту проблему так и не понял ?
давно уже программирую в MPLAB 8, но столкнулся с необходимостью к проекту на asm подцепить дополнительный файл на asm, порывшись в гугле нашёл подобные темы, а вот как решить эту проблему так и не понял ?
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Re: Вопросы начинающих PIC ASM
Код: Выделить всё
include "sample.asm">(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Никаких инклюдов asm-исходников делать не надо.
Просто достаточно включить исходники в ветку Source проекта.
НО!
Все переменные нужно объявлять корректно.
То есть не как константы, а:
Далее нужно объявить глобальные переменные, которые будут видимы всеми остальными файлами
Соответственно в файлах, где эти переменные применяются должна быть строка
Тоже самое должно быть с метками вызовов.
Константы оформляются в виде inc-файлов.
После секции объявления переменных код должен начинаться с директивы code.
Итого код будет выглядеть так:
Файл первый:
Файл второй:
inc-файл проекта (помимо стандартного контроллерного):
inc-файлы объявляются инклюдами в каждом файле, где константы применяются.
Пользовательский inc-файл (в примере упомянут как MyHeader.inc во втором файле исходника) должен быть включен в проект в ветке Headers.
ЗЫ. Объявление переменных через директиву udata удобно тем, что в проекте РЕАЛЬНО УЧИТЫВАЕТСЯ объем использованного ОЗУ с контролем через скрипт линкера проекта. А так же можно увидеть текущий занятый объем ОЗУ в Wiew-Memory Usage Gauge в самом MPLAB IDE 8.
При объявлении переменных как адресных констант эти фичи недоступны.
Возможность загрузки адреса переменной как константы при косвенной адресации остается.
Просто достаточно включить исходники в ветку Source проекта.
НО!
Все переменные нужно объявлять корректно.
То есть не как константы, а:
Код: Выделить всё
udata
var1 res 1
var2 res 1
var3 res 1Код: Выделить всё
global var1, var2Код: Выделить всё
extern var1Константы оформляются в виде inc-файлов.
После секции объявления переменных код должен начинаться с директивы code.
Итого код будет выглядеть так:
Файл первый:
Код: Выделить всё
list p=12F683
#include <p12F683.inc>
udata 0x20
www res 1
w_temp res 1
status_temp res 1
global www
extern Func
RST code 0x000
nop
goto start
ISR code 0x004
................
................
MAIN code
start
................
call Func
................
goto start
end
Код: Выделить всё
#include <p12F683.inc>
#include <MyHeader.inc>
extern www
global Func
SUB code
Func
movf www, f
movlw mask
andwf www, f
movlw offset
addwf www, w
return
endКод: Выделить всё
mask equ 0x1F
offset equ .152
listПользовательский inc-файл (в примере упомянут как MyHeader.inc во втором файле исходника) должен быть включен в проект в ветке Headers.
ЗЫ. Объявление переменных через директиву udata удобно тем, что в проекте РЕАЛЬНО УЧИТЫВАЕТСЯ объем использованного ОЗУ с контролем через скрипт линкера проекта. А так же можно увидеть текущий занятый объем ОЗУ в Wiew-Memory Usage Gauge в самом MPLAB IDE 8.
При объявлении переменных как адресных констант эти фичи недоступны.
Возможность загрузки адреса переменной как константы при косвенной адресации остается.
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Забыл.
В проект обязательно нужно В ЯВНОМ ВИДЕ включить скрипт линкера. Дженерик на свой целевой контроллер из папки MPASM Suite/LNK МПЛАБа.
В проект обязательно нужно В ЯВНОМ ВИДЕ включить скрипт линкера. Дженерик на свой целевой контроллер из папки MPASM Suite/LNK МПЛАБа.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Прошу прощения, но задам глупый вопрос...
Пытаюсь поиздеваться над PIC16F84 и пишу кодовый замок с матричной клавиатурой и семисегментным трехразрядным индикатором.
Индикатор (общий анод) сидит на трех выводах порта А, который их поочередно перебирает в прерывании таймера. На них же висят столбцы матричной клавиатуры. Цифры выводятся через 595 регистр.
1. Цифры он у меня выводит правильно.
2. Динамическая индикация работает.
3. Клавиатура опрашивается в том же прерывании таймера и сохраняет значения опрошенных столбцов в три переменные.
А дальше стопор...
Не могу придумать как сделать, чтобы при нажатии кнопки любой число записывалось в первый разряд, при нажатии еще раз любой кнопки уже во второй разряд, и третий раз нажатие в третий разряд...
Написал ту часть программы, которая работает с сохраненными значениями столбцов клавиатуры и определяет какая кнопка была нажата. Даже вывод сделал, но скорость работы МК большая и он выводит все одинаковые цифры во все три позиции. Понятно, что надо вообще сделать как-то так, чтобы пока кнопка нажата, он ничего не выводил, а как только ее отпустили - он тут же вывел, при этом понял в какую позицию.
У меня же пока кнопка нажата - в прерывании в переменную уходит ее значение, а если она отпущена, то в том же очередном прерывании в переменную уходят нули.
Простите, нету кода, т.к. комп с проектом у друга.
З.Ы. Да, это все исключительно для обучения надо из любопытства. Просто PICи изучаю дня 4 всего.
Пытаюсь поиздеваться над PIC16F84 и пишу кодовый замок с матричной клавиатурой и семисегментным трехразрядным индикатором.
Индикатор (общий анод) сидит на трех выводах порта А, который их поочередно перебирает в прерывании таймера. На них же висят столбцы матричной клавиатуры. Цифры выводятся через 595 регистр.
1. Цифры он у меня выводит правильно.
2. Динамическая индикация работает.
3. Клавиатура опрашивается в том же прерывании таймера и сохраняет значения опрошенных столбцов в три переменные.
А дальше стопор...
Не могу придумать как сделать, чтобы при нажатии кнопки любой число записывалось в первый разряд, при нажатии еще раз любой кнопки уже во второй разряд, и третий раз нажатие в третий разряд...
Написал ту часть программы, которая работает с сохраненными значениями столбцов клавиатуры и определяет какая кнопка была нажата. Даже вывод сделал, но скорость работы МК большая и он выводит все одинаковые цифры во все три позиции. Понятно, что надо вообще сделать как-то так, чтобы пока кнопка нажата, он ничего не выводил, а как только ее отпустили - он тут же вывел, при этом понял в какую позицию.
У меня же пока кнопка нажата - в прерывании в переменную уходит ее значение, а если она отпущена, то в том же очередном прерывании в переменную уходят нули.
Простите, нету кода, т.к. комп с проектом у друга.
З.Ы. Да, это все исключительно для обучения надо из любопытства. Просто PICи изучаю дня 4 всего.
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Для записи чисел в разные разряды, наверно нужно ввести УКАЗАТЕЛЬ на разряд.
И его инкрементировать. Или декрементировать. Или изменять по любому заранее выбранному закону таблично.
Факт нажатия меняет указатель ПОСЛЕ записи самого числа по первоначальному указателю.
И его инкрементировать. Или декрементировать. Или изменять по любому заранее выбранному закону таблично.
Факт нажатия меняет указатель ПОСЛЕ записи самого числа по первоначальному указателю.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Вот! так и делал. Инкрементровал переменную, потом сверял ее и по ней выводил, после последнего знакоместа обнулял ее и все по кругу.КРАМ писал(а):Факт нажатия меняет указатель ПОСЛЕ записи самого числа
Да, работает.
Однако проблема возникла в том, что у меня идет типа "дребезг" контактов у кнопок. Т.е. если я нажал на кнопку, при частоте в 4 МГц у микроконтроллера, он успевает заполнить все разряды. Т.е. мне надо значит нажать кнопку и дождаться пока я ее отпущу, чтобы заполнить разряд. Вот это у меня не получается...
Станислав
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы начинающих PIC ASM
Вовсе необязательно. Достаточно хранить предыдущее состояние кнопки и при очередном заходе проверять его. Если кнопка не была нажатой, а нажатие появилось - считаем что кликнули по кнопке, взводим флаг, который в основном цикле проверяется и сбрасывается.СКАЗОЧНИК писал(а):и дождаться пока я ее отпущу
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Дребезг удаляется путем опроса с интервалом БОЛЬШЕ, чем дребезг.СКАЗОЧНИК писал(а): Однако проблема возникла в том, что у меня идет типа "дребезг"
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Хм.. Кнопки так и делал. А матричная клавиатура в прерывании опрашивается... 
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Какая разница в чем она опрашивается? В прерывании или просто в программном цикле - без разницы.СКАЗОЧНИК писал(а):матричная клавиатура в прерывании опрашивается...
При опросе реже, чем длится дребезг, дребезга не будет.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Хорошо... Короче, я туплю.
У меня выводы индикатора и клавиатуры висят на одном порту. Соответственно, клавиатура опрашивается быстро, как и вывод цифр в динамической индикации. А если я отпустил кнопку, то тут же в порт уходят нули... Задержку по опросу кнопки в прерывании я сделать не могу.
Ткните носом, чего туда запихать?
У меня выводы индикатора и клавиатуры висят на одном порту. Соответственно, клавиатура опрашивается быстро, как и вывод цифр в динамической индикации. А если я отпустил кнопку, то тут же в порт уходят нули... Задержку по опросу кнопки в прерывании я сделать не могу.
Ткните носом, чего туда запихать?
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25263
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Причем тут вообще задержка?
Тут нужна не задержка, а ПРОПУСКИ.
Создаете переменную счетчик и инкрементируете ее в том месте, где опрашиваете кнопки. А сам опрос делаете только если счетчик кратен некоему коэффициенту деления. Сиречь, по условию равенства единице выбранного разряда счетчика. Нулевой разряд даст деление на 2 (опрос будет происходить через раз), первый разряд - даст деление на 4, второй - на 8 и так далее. Таким образом Вы понизите частоту опросов до нужного Вам значения. Сам счетчик будет тупо считать по кругу.
Тут нужна не задержка, а ПРОПУСКИ.
Создаете переменную счетчик и инкрементируете ее в том месте, где опрашиваете кнопки. А сам опрос делаете только если счетчик кратен некоему коэффициенту деления. Сиречь, по условию равенства единице выбранного разряда счетчика. Нулевой разряд даст деление на 2 (опрос будет происходить через раз), первый разряд - даст деление на 4, второй - на 8 и так далее. Таким образом Вы понизите частоту опросов до нужного Вам значения. Сам счетчик будет тупо считать по кругу.


