Jump to content
    

Странности с битовыми операциями с PORTA

прошу помощи, почти день потерял на простейшей проблеме, обошел, но хочу понять где моя ошибка:

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

под руками оказались остатки проекта примерно 20-ти летней давности на PIC16F876, он избыточен, но был под руками.

кнопки - на PORTB с встроенной подтяжкой, светодиоды - на PORTC, выходы платы (их всего 4) на PORTA, соответственно максимально просто настроены A C все на выход, B на вход.

вся программа - строк 150 на ассемблере, тупо инициализация, основой цикл с обработкой 3-х кнопок и прерывание таймерное для выдачи частоты 50 или 60 Гц.

быстро написал, логику кнопок и светодиодов сделал, таймер на 50х2\60х2 переключается все ок.

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

пример, на этапе инициализации, до включения прерываний:

        call    delay
        call    delay
        call    delay
        bsf     PORTA,1            ; BPOK
        bsf     PORTC,2            ; BPOK red smd led off
        call    delay
        bsf     PORTA,0            ; BDCOK
        bsf     PORTC,3            ; BDCOK red smd led off

светодиоды отрабатывают правильно, а PORTA не работает...

причем не работает именно с bcf или bsf...

потеряв много времени, решил "костылем" с переменной-дублем PORTA, во все обращениях к порту поменял PORTA на имя переменной (и прерывания пораньше включил):

        call    delay
        call    delay
        call    delay
        bsf     tmp_a,1            ; BPOK
        bsf     PORTC,2            ; BPOK red smd led off
        call    delay
        bsf     tmp_a,0            ; BDCOK
        bsf     PORTC,3            ; BDCOK red smd led off
        call    delay

в прерывании:

        movf    tmp_a,w    
        movwf    PORTA

вот такая "виртуализация" 😞

всё работает так, устройство живет, но почему bcf или bsf не работают?!  я даже нашел еще PIC16F876A, почти тех же лет, та же проблема...

про OC на PORTA.4 помню, альтернативные функции не включались. из всей периферии только TIMER1 от внутреннего тактирования используется. +питания у этого пика один, забыть банк запитать нельзя 🙂

 

 

 

 

 


 

Share this post


Link to post
Share on other sites

Ещё на заре PICов везде про чтение-модификация-запись в документации писали. Это те самые bsf и bcf.

Share this post


Link to post
Share on other sites

я давно очень не писал для пиков, но вроде все ок должно быть, по структуре порта. читается выходная защелка, модифицируется и пишется обратно. тонкости с "перетягиванием" ног нагрузкой, но тут не тот случай...

и с портом С проблем нет, в том же чипе

пример из той же программы:

        movlw   0x20
        xorwf   PORTC,f         ; toggle bit 6 TIMER led

работает, при этом явная операция чтение-модификация-запись.

а здесь:

        bsf     PORTA,1            ; BPOK - тут просто нет реакции на пинах
        bsf     PORTC,2            ; BPOK red smd led off   - тут все ок

если просто писать в портА  "movwf    PORTA" - все ок

что то я упустил... вроде прочитал, что к портам относится, специально нашел старый вариант пдф-ки, тех же годов, что и пик примененный. 


 

Share this post


Link to post
Share on other sites

2 часа назад, Vasily_A сказал:

тут не тот случай

Почему нет, эффект очень похожий?
Ещё предложу вариант, что-то неправильно с настройками цифровой-аналоговый.

 

2 часа назад, Vasily_A сказал:

явная операция чтение-модификация-запись

Так здесь сразу на весь порт, а не на отдельные выходы.

 

Share this post


Link to post
Share on other sites

6 hours ago, Vasily_A said:

светодиоды - на PORTC, выходы платы (их всего 4) на PORTA,

вот в этом и кроется пробема

Выше вам писали

2 hours ago, ShAlex said:

Ещё на заре PICов везде про чтение-модификация-запись в документации писали. Это те самые bsf и bcf.

Чтоб такого эффекта не было порт нужно нагружать на нагрузку более 5кОм , а лучше 10кОм.

А вы напрямую к порту СД подключили?  Хорошо если через низкоомные резисторы. но все равно это не спасает.

Share this post


Link to post
Share on other sites

13 минут назад, smart_pic сказал:

А вы напрямую к порту СД подключили?

Читайте внимательно: у ТС светодиоды работают нормально.
И с чего Вы взяли, что они подключены без резисторов?
Полагаю ТС не совсем деревянный, хотя всякое конечно бывает.

😁
А нагрузку к портам надо подключать согласно цифрам из таблицы даташита.

Share this post


Link to post
Share on other sites

1 hour ago, Smen said:

Читайте внимательно: у ТС светодиоды работают нормально.

светодиоды работают правильно, только порт от этого работает не правильно при выполнение операции чтение-модификация-запись

 

1 hour ago, Smen said:

И с чего Вы взяли, что они подключены без резисторов?
Полагаю ТС не совсем деревянный, хотя всякое конечно бывает.

даже если резистор будет 500 Ом порт может воспринимать 0 при выполнение операции чтение-модификация-запись

Это известные грабли и бывалые их стороной обходят как в схемотехнике так и программировании.

И пока ТС не покажет тут свою схему подключения  - то и советы давать бесполезно.

Share this post


Link to post
Share on other sites

Господа, я не "деревянный". Со светодиодами, которые на PORTC (естественно с резисторами...), с bcf и bsf проблем нет.

На выходах PORTA обычные ttl совместимые драйвера в пике (кроме PORTA.4), если верить документации микрочипа и нескольким моим годам их использования с конца 90-х по начало 2000-х.

Нагрузка порта А, в моем случае - делитель осциллографа при первичной настройке, или нагрузка примерно эквивалентная нескольким ttl входам в целевом применении.

Вопрос остается - почему в 2-х экземплярах PIC16F876 и одном PIC16F876A не работает bcf или bsf? Сами порты исправны, при байтовой записи все с ними ок.

Больше у меня этого 16F8хх семейства в дипе не осталось, но вроде они все три новые были, не снятые с устройств (судя по формовке ног заводской и чистой памяти), проверить больше не чем.

На совсем древнем проекте (еще на PIC16C84), прошлого тысячелетия, bcf и bsf на PORTA работали, я исходник студенческих лет нашел от заведомо живого устройства...

Может ассемблер в условно-современном мплабе (8.3 версия) дурит?

 

 

Share this post


Link to post
Share on other sites

схему выкладывайте , и только после этого возможен разговор. Условия проверки , а также питающие напряжения.

НИ РАЗУ, повторюсь ни разу не встречал в пиках 16 серии глюков, не объяснимых документацией и ERRATA.

12 hours ago, Vasily_A said:

Может ассемблер в условно-современном мплабе (8.3 версия) дурит

Это очень устойчивая версия, также 8.88 и по сей день остаются устойчивыми и отлично работают.

Share this post


Link to post
Share on other sites

Если память не изменяет, у 84 пиков PORTA.4 был с открытым стоком. Но это непринципиально - команды-то читают и пишут регистр выходной защелки, которому без разницы, что там на реальных ногах.

Share this post


Link to post
Share on other sites

схему набросал

правда, не знаю зачем, все написано ранее:

порт А - выходы на разъем, нагружены на ttl входы в целевом устройстве

порт В - входы, кнопки с включенной в пике подтяжкой, один из пинов идет на внешний разъем.

порт С - выходы, светодиоды через резисторы

про особенности PORTA.4 писал в первом сообщении, учтено подтяжкой.

2024-02-12_20-36-22.png

Share this post


Link to post
Share on other sites

On 2/12/2024 at 8:49 PM, Vasily_A said:

схему набросал

А вы учли, что по умолчанию выводы PORTA настроены как аналоговые входы ?

Share this post


Link to post
Share on other sites

"А вы учли, что по умолчанию выводы PORTA настроены как аналоговые входы ?"

апа... что то я упустил.

вроде обычно, в trisa 0x00 записал, и они на выход работают. завтра почитаю повнимательней, я всегда думал что по por ацп и все с ним связанное в отключке...

не, не учел... или забыл, или и не знал, а это точно? а почему при выводе байтом работают нормально? 

Share this post


Link to post
Share on other sites

On 2/12/2024 at 11:37 PM, Vasily_A said:

не, не учел... или забыл, или и не знал, а это точно? а почему при выводе байтом работают нормально? 

По документации так.
Раздел I/O Ports

 

Quote

The operation of each pin is selected by clearing/setting the control bits in the ADCON1 register (A/D Control Register1).

Note: On a Power-on Reset, these pins are configured as analog inputs and read as '0'.

 

Share this post


Link to post
Share on other sites

11 часов назад, Vasily_A сказал:

апа... что то я упустил

Так читайте внимательно, что Вам отвечают.

😏

Я Вам высказывал такой вариант.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...