Например TDA7294

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

Текущее время: Вт дек 30, 2025 00:16:22

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


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



Начать новую тему Ответить на тему  [ Сообщений: 54 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 00:16:17 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Коты, привет.

Начинаю разбираться с МК и ассемблером. Ранее с ним имел дело только в теории и сейчас словил непонятный тупняк.
Под руками PicKit2 и МК PIC16f684

Судя по мануалам (если я не разучился читать) BSF должна устанавливать один бит в регистре не трогая остальных, однако на практике я вижу, что остальные биты сбрасываются в 0.

В моем случае - это регистр PORTC, в котором я пытаюсь управлять независимо двумя выходами.
При использовании директивы BSF в единице тот выход, который установлен последним.

Подскажите, где я накосячил, и как правильно? :-)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 00:44:33 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Где вы накосячили - фиг его знает. Текст программы я не могу увидеть (гадалки готовятся к НГ).
bsf PORTC,0 "поднимет" выход 0 порта С в "единицу" при условии, что этот вывод порта назначен на выход и, при этом, не переназначен на "периферию".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 00:56:00 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Да не, не в том дело.
Действительно поднимает. но при условии что выводы 0 и 1 порта на выход,

bsf PORTC,0
bsf PORTC,1

поднимает только выход 1, а если наоборот

bsf PORTC,1
bsf PORTC,0

поднимает только выход 0.

при этом директива movwf работает как надо, но она мне не удобна.

PS если использовать

movlw b'00000001'
mowwf PORTC
bsf PORTC,1

поднимается опять же только выход 1.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:01:05 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Выкладывайте текст программы...
Мне очень интересно посмотреть на то, как вы делаете INIT контроллера.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:10:01 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Albert_V писал(а):
А что ещё вы хотели увидеть при записи 0х01 (hex) в порт?

Так 0х01 (hex) 0 это выход 0 а не выход 1, после этого директивой BSF поднимается еще и выход1. И горит только 1(!!!).

Текст вам много не даст, я просто зажигал (даже без мигания) светодиоды
Делал это в разных вариантах, последний этот:


Код:
   bcf     STATUS,RP0
   clrf    PORTC
     goto     main         ; go to beginning of program


main
   bsf     STATUS,RP0
       MOVLW   b'11110011' 
       MOVWF   TRISC
        bcf     STATUS,RP0
   bsf     PORTC,2
   bsf     PORTC,3
label      goto label
        End


Результат - горит только порт 3.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:11:54 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Сори, почему форматирование в коде слетает, сказать не могу.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:12:45 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
В вашем тексте программы, я не увидел конфигурацию ADC, PWM и компаратора....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:13:44 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Код:
   list      p=16f684      ; list directive to define processor
   #include   <P16F684.inc>      ; processor specific variable definitions
   
   __CONFIG    _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IE


Последний раз редактировалось Shk_Alex Пн дек 14, 2015 01:17:25, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:16:49 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Не путайте CONFIG с настройкой периферии при старте программы.
Это разные вещи.
При старте программы, вы ОБЯЗАНЫ настроить периферию "вручную".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:20:12 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
Насколько я понял из примеров и прочего, что мне нужно все включать, если это нужно, в остальных случаях все выключено.
Мне нужны тупо триггеры, соответственно, я ни чего не конфигурил.

В любом случае, почему одна директива работает правильно, а другая нет (на мой взгляд), как на это может влиять настройки компаратора, АЦП и т.д.?


Не видел ни в одном примере простейших программ настройки более чем Config.
Не хотел лезть сразу в дебри периферии, есть где то пример настройки, близкой к "все отключено"?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:31:35 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Давайте, попробую вам объяснить "на двух пальцах":
/заранее извиняюсь за "лирику"/
Старт выполнения программы идёт с адреса 0000
Далее:
Необходимо сразу после старта программы указать какие выводы у вас должны быть выходами, какие входами, что из периферии (ADC, PWM, компаратор(ы), таймеры и т.д.) вы разрешаете, задать их конфигурацию и, только после этого, можете приступать к "нормальной работе".
Вот здесь, для дальнейшего исполнения программы, будет метка MAIN.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:43:31 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
т.е. условно, мне необходимо из main вынести TrisC с сопутствующими?
Завтра попробую.

такой текст, у моем случае определен тем, что много где (в том числе у любимого всеми Корабельникова) написано, что с с адреса 0000 можно ввести только 4 команды, дальше переходить на main, т.к. с 0004 идет область памяти для обработки прерываний. :o

Пока у меня отсутствуют необходимые количества пол-литровых емкостей для того что бы сразу во всем разобраться.... :kill:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 01:49:29 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Shk_Alex писал(а):
...с 0004 идет область памяти для обработки прерываний.....

Только, не область памяти для обработки прерываний, а "ссылка" на конкретный адрес (вектор прерываний).
Первой командой (org 0000) можно "сказать" goto INIT и "перелететь" через адрес вектора прерываний (0004).
org 00h
goto INIT
Так же, вам никто не запрещает написать в программе
org 04h
goto INTERRUPT
и где-то, хоть в конце текста основной программы, поставить метку INTERRUPT (обработка прерываний).
----
В этой моей статье (пытался сделать как можно проще) можете посмотреть исходник на asm.
Там всё сделано до предела просто (насколько смог).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 02:59:31 
Первый раз сказал Мяу!

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Чт май 01, 2014 07:28:15
Сообщений: 28
Рейтинг сообщения: 0
Shk_Alex писал(а):
...
При использовании директивы BSF в единице тот выход, который установлен последним.
...
RMW

:facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 03:07:17 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
:facepalm: Cлышал звон, не зная откуда он ©
-------
Для этого контроллера это не принципиально.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 07:16:27 
Первый раз сказал Мяу!

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Чт май 01, 2014 07:28:15
Сообщений: 28
Рейтинг сообщения: 0
Page 31 in Datasheet
Цитата:
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 :facepalm:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 09:07:40 
Вымогатель припоя
Аватар пользователя

Карма: -2
Рейтинг сообщений: -32
Зарегистрирован: Вс ноя 01, 2015 13:13:49
Сообщений: 616
Рейтинг сообщения: 0
Вот далась вам эта RMW. RMW возникает при быстром переключении при высокой ёмкости на выводе и при чрезмерной нагрузке вывода. Проверить наличие RMW при быстром переключении можно добавив пару NOP между командами. Но здесь виною на 99% является отсутствие настройки периферии. Из даташита на порт С.
Код:
BANKSEL PORTC ;
CLRF PORTC ;Init PORTC
MOVLW 07h ;Set RC<4,1:0> to
MOVWF CMCON0 ;digital I/O
BANKSEL ANSEL ;
CLRF ANSEL ;digital I/O
MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0>
                       ;as outputs
BCF STATUS,RP0 ;Bank 0


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 09:54:20 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2918
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24635
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Shk_Alex писал(а):
Текст вам много не даст, я просто зажигал (даже без мигания) светодиоды

Для RMW принципиально важно КАК ПОДКЛЮЧЕНЫ эти самые светодиоды. Если напрямую к пинам (или с очень маленьким балластным сопротивлением), то причина как раз в RMW.
Albert_V писал(а):
Для этого контроллера это не принципиально.

Можно полюбопытствовать ПОЧЕМУ?
:dont_know:
Защелка выхода не читается, то есть регистр LAT отсутствует. И потому есть все предпосылки получить подобный баг через RMW.
Albert_V писал(а):
При старте программы, вы ОБЯЗАНЫ настроить периферию "вручную".

А он ее и настроил. Отсутствие корректной конфигурации никак не влияет на самопроизвольный сброс отдельных разрядов. Неверно настроенный пин просто не будет работать.
Автор все настроил правильно.
Проверка на RMW совершенно элементарна. Достаточно вывести в порт ПОЛНЫЙ БАЙТ вместо побитной установки и все сразу станет на свои места... :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 10:13:17 
Открыл глаза

Зарегистрирован: Ср сен 24, 2014 11:14:53
Сообщений: 50
Откуда: Москва
Рейтинг сообщения: 0
scorpi_0n спасибо, повкуриваю.

КРАМ
RMW на сколько я понял, это "временное" явление, если не успевает переключиться выход.
У меня нет переключений, просто диоды горят. Я не прав?
диоды подключены через сопротивления 180 Ом, нагрузка на 30% меньше допустимой для контроллера по электрическим характеристикам.

В первую очередь, мне не понятно, почему одна команда работает, другая нет?
Почему, если я прописываю оба выхода сразу командой MOVWF, светятся оба, а если по одному - только последний?
Судя по мануалу команда не должна влиять на другие биты!

Albert_V
Спасибо, почитаю, думаю будет крайне полезно.
Возник соответственно вопрос, получается я не смогу в процессе исполнения программы менять направление пина? Если это так, то я очень расстроен, я очень надеялся, что это возможно....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобраться с директивой BCF
СообщениеДобавлено: Пн дек 14, 2015 10:20:48 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2918
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24635
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Shk_Alex писал(а):
КРАМ
RMW на сколько я понял, это "временное" явление, если не успевает переключиться выход.
У меня нет переключений, просто диоды горят. Я не прав?
диоды подключены через сопротивления 180 Ом, нагрузка на 30% меньше допустимой для контроллера по электрическим характеристикам.

Дело тут вообще не во времени.
Проблема модификации разрядов, которые не устанавливаются битовой командой состоит в том, что из-за отсутствия доступа к ВЫХОДАМ ЗАЩЕЛОК РАЗВЯЗАННЫХ ОТ ПИНОВ (нет регистра LAT и защелки напрямую подключены к пину), при выполнении ЛЮБОЙ БИТОВОЙ КОМАНДЫ происходит ЧТЕНИЕ ПИНОВ (а не защелки), их модификация (одного бита) и запись обратно в защелку.
То есть та самая процедура RMW (чтение-модификация-запись). Если Вы нагрузили порт таким образом, что выходное напряжение на ПИНЕ упало ниже порога единицы, то при чтении в этом разряде будет прочитан НОЛЬ. И это никак не связано с допустимой нагрузкой на пин. Даташит не гарантирует сохранение логического уровня на нагруженном пине в разделе абсолютных максимумов. А в разделе описания выходных уровней ток пина обозначен совершенно другой.
Изображение
Можете экстраполировать график до тока 19...20 мА (5-1,5)/180=19,4мА. :tea:
Shk_Alex писал(а):
Возник соответственно вопрос, получается я не смогу в процессе исполнения программы менять направление пина? Если это так, то я очень расстроен, я очень надеялся, что это возможно....

Естественно, что это возможно. Конфигурационное слово не настраивает направление пинов.


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

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


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

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


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

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


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