Заголовок сообщения: Помогите разобраться с директивой BCF
Добавлено: Пн дек 14, 2015 00:16:17
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
Коты, привет.
Начинаю разбираться с МК и ассемблером. Ранее с ним имел дело только в теории и сейчас словил непонятный тупняк. Под руками PicKit2 и МК PIC16f684
Судя по мануалам (если я не разучился читать) BSF должна устанавливать один бит в регистре не трогая остальных, однако на практике я вижу, что остальные биты сбрасываются в 0.
В моем случае - это регистр PORTC, в котором я пытаюсь управлять независимо двумя выходами. При использовании директивы BSF в единице тот выход, который установлен последним.
Где вы накосячили - фиг его знает. Текст программы я не могу увидеть (гадалки готовятся к НГ). bsf PORTC,0 "поднимет" выход 0 порта С в "единицу" при условии, что этот вывод порта назначен на выход и, при этом, не переназначен на "периферию".
Заголовок сообщения: Re: Помогите разобраться с директивой BCF
Добавлено: Пн дек 14, 2015 01:20:12
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
Насколько я понял из примеров и прочего, что мне нужно все включать, если это нужно, в остальных случаях все выключено. Мне нужны тупо триггеры, соответственно, я ни чего не конфигурил.
В любом случае, почему одна директива работает правильно, а другая нет (на мой взгляд), как на это может влиять настройки компаратора, АЦП и т.д.?
Не видел ни в одном примере простейших программ настройки более чем Config. Не хотел лезть сразу в дебри периферии, есть где то пример настройки, близкой к "все отключено"?
Давайте, попробую вам объяснить "на двух пальцах": /заранее извиняюсь за "лирику"/ Старт выполнения программы идёт с адреса 0000 Далее: Необходимо сразу после старта программы указать какие выводы у вас должны быть выходами, какие входами, что из периферии (ADC, PWM, компаратор(ы), таймеры и т.д.) вы разрешаете, задать их конфигурацию и, только после этого, можете приступать к "нормальной работе". Вот здесь, для дальнейшего исполнения программы, будет метка MAIN.
Заголовок сообщения: Re: Помогите разобраться с директивой BCF
Добавлено: Пн дек 14, 2015 01:43:31
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
т.е. условно, мне необходимо из main вынести TrisC с сопутствующими? Завтра попробую.
такой текст, у моем случае определен тем, что много где (в том числе у любимого всеми Корабельникова) написано, что с с адреса 0000 можно ввести только 4 команды, дальше переходить на main, т.к. с 0004 идет область памяти для обработки прерываний.
Пока у меня отсутствуют необходимые количества пол-литровых емкостей для того что бы сразу во всем разобраться....
...с 0004 идет область памяти для обработки прерываний.....
Только, не область памяти для обработки прерываний, а "ссылка" на конкретный адрес (вектор прерываний). Первой командой (org 0000) можно "сказать" goto INIT и "перелететь" через адрес вектора прерываний (0004). org 00h goto INIT Так же, вам никто не запрещает написать в программе org 04h goto INTERRUPT и где-то, хоть в конце текста основной программы, поставить метку INTERRUPT (обработка прерываний). ---- В этой моей статье (пытался сделать как можно проще) можете посмотреть исходник на asm. Там всё сделано до предела просто (насколько смог).
All write operations are read-modify-write operations. Therefore, a write to a port implies that the port pins are read, this value is modified and then written to the port data latch. RA3 reads ‘0’ when MCLRE = 1.
Вот далась вам эта RMW. RMW возникает при быстром переключении при высокой ёмкости на выводе и при чрезмерной нагрузке вывода. Проверить наличие RMW при быстром переключении можно добавив пару NOP между командами. Но здесь виною на 99% является отсутствие настройки периферии. Из даташита на порт С.
Текст вам много не даст, я просто зажигал (даже без мигания) светодиоды
Для RMW принципиально важно КАК ПОДКЛЮЧЕНЫ эти самые светодиоды. Если напрямую к пинам (или с очень маленьким балластным сопротивлением), то причина как раз в RMW.
Albert_V писал(а):
Для этого контроллера это не принципиально.
Можно полюбопытствовать ПОЧЕМУ? Защелка выхода не читается, то есть регистр LAT отсутствует. И потому есть все предпосылки получить подобный баг через RMW.
Albert_V писал(а):
При старте программы, вы ОБЯЗАНЫ настроить периферию "вручную".
А он ее и настроил. Отсутствие корректной конфигурации никак не влияет на самопроизвольный сброс отдельных разрядов. Неверно настроенный пин просто не будет работать. Автор все настроил правильно. Проверка на RMW совершенно элементарна. Достаточно вывести в порт ПОЛНЫЙ БАЙТ вместо побитной установки и все сразу станет на свои места...
Заголовок сообщения: Re: Помогите разобраться с директивой BCF
Добавлено: Пн дек 14, 2015 10:13:17
Открыл глаза
Зарегистрирован: Ср сен 24, 2014 11:14:53 Сообщений: 50 Откуда: Москва
Рейтинг сообщения:0
scorpi_0n спасибо, повкуриваю.
КРАМ RMW на сколько я понял, это "временное" явление, если не успевает переключиться выход. У меня нет переключений, просто диоды горят. Я не прав? диоды подключены через сопротивления 180 Ом, нагрузка на 30% меньше допустимой для контроллера по электрическим характеристикам.
В первую очередь, мне не понятно, почему одна команда работает, другая нет? Почему, если я прописываю оба выхода сразу командой MOVWF, светятся оба, а если по одному - только последний? Судя по мануалу команда не должна влиять на другие биты!
Albert_V Спасибо, почитаю, думаю будет крайне полезно. Возник соответственно вопрос, получается я не смогу в процессе исполнения программы менять направление пина? Если это так, то я очень расстроен, я очень надеялся, что это возможно....
КРАМ RMW на сколько я понял, это "временное" явление, если не успевает переключиться выход. У меня нет переключений, просто диоды горят. Я не прав? диоды подключены через сопротивления 180 Ом, нагрузка на 30% меньше допустимой для контроллера по электрическим характеристикам.
Дело тут вообще не во времени. Проблема модификации разрядов, которые не устанавливаются битовой командой состоит в том, что из-за отсутствия доступа к ВЫХОДАМ ЗАЩЕЛОК РАЗВЯЗАННЫХ ОТ ПИНОВ (нет регистра LAT и защелки напрямую подключены к пину), при выполнении ЛЮБОЙ БИТОВОЙ КОМАНДЫ происходит ЧТЕНИЕ ПИНОВ (а не защелки), их модификация (одного бита) и запись обратно в защелку. То есть та самая процедура RMW (чтение-модификация-запись). Если Вы нагрузили порт таким образом, что выходное напряжение на ПИНЕ упало ниже порога единицы, то при чтении в этом разряде будет прочитан НОЛЬ. И это никак не связано с допустимой нагрузкой на пин. Даташит не гарантирует сохранение логического уровня на нагруженном пине в разделе абсолютных максимумов. А в разделе описания выходных уровней ток пина обозначен совершенно другой. Можете экстраполировать график до тока 19...20 мА (5-1,5)/180=19,4мА.
Shk_Alex писал(а):
Возник соответственно вопрос, получается я не смогу в процессе исполнения программы менять направление пина? Если это так, то я очень расстроен, я очень надеялся, что это возможно....
Естественно, что это возможно. Конфигурационное слово не настраивает направление пинов.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения