Перейти к содержанию

Общие вопросы по PIC-микроконтроллерам


NebsteR

Рекомендуемые сообщения

15 минут назад, IMXO сказал:

по комнате сам летает ?

Хуже.

 

 

Вот код. Симулирую в Протеусе. Опрашиваю датчик температуры DS18B20. Остановился на том что прога считывает код семейства  (для данного датчика 0x28h)

после первого прохода всё работает хорошо , считанный код 0x28h помещается в регистр 0x23. Далее я проверяю этот код на соответствия, и если датчик подключён и он отправляет этот код то я включаю светодиод -  bsf PORTA, 5.

Но вот после этого прога и перестаёт работать. Именно после этой команды, и даже если bcf PORTA, 5  написать , то тоже. Вообщем PORTA 4 перестаёт выводить сигналы на датчик хотя команды посылаются.

Там после этой команды из за которой не работает стоят знаки  вопроса. Сломал весь мозг нет больше идей из за чего так.

;///////////////////////////////////////////////////////////////////////////////////////

list p=16f676,n=25,c=200,b=10
#include 16f676.INC
__config B'11111110010100'

                bcf STATUS, RP0   ;Bank 0  
                bcf PORTA, 4
                   bcf PORTA, 5
                  ; bcf PORTC, 5
                bsf STATUS, RP0   ;Bank 1
                   bcf TRISA, 5   ;port output
                  ; bcf TRISC, 5   ;port output
                bcf ANSEL, 3      ;Digital I/O
                bcf ANSEL, 5
                bsf TRISA, 4      ;Line set "1" port input

;///////////////////////////////////////////////////////////////////////////////////////
                
loop1          
                call wire_res     ;Отправить команду сброса

                movlw H'33'       ;Отправить команду 0x33h
                call wire_write   ;Отправить команду 0x33h
                call wire_read    ;принять данные в регистр 0x23h
                             

                  movlw H'D7'     ;0xD7h если DS18B20(0x28h); 0xEFh если DS1820(0x10h)
                  addwf H'23', 1
                  btfss STATUS, C
                  goto loopds
                  goto loop1
loopds            incf H'23'
                  btfss STATUS, Z
                  goto loop1
                  bcf STATUS, RP0   ;Bank 0  

              bsf PORTA, 5                                           ;? ? ? ? ? ? ? ? ?

                  bsf STATUS, RP0   ;Bank 1


                  

                  goto loop1
;///////////////////////////////////////////////////////////////////////////////////////

wire_res        bcf TRISA, 4       ;Line set "0" port output
                movlw H'A6'        ;Delay 500us
                movwf 22h
loop2           decfsz 22h, 01h   
                goto loop2
                bsf TRISA, 4       ;Line set "1" port input
                movlw H'A6'        ;Delay 500us
                movwf 22h
loop3           decfsz 22h, 01h   
                goto loop3                                
                return


wire_write        
                movwf 20h
                movlw H'08'
                movwf 21h
loop4           rrf H'20',1
                btfss STATUS, C
                goto set_wire_0
                goto set_wire_1
loop5           decfsz 21h, 01h
                goto loop4
                return

set_wire_1      bcf TRISA, 4       ;Line set "0" port output
                movlw H'02'        ;Delay 8us
                movwf 22h
loop6           decfsz 22h, 01h   
                goto loop6
                bsf TRISA, 4       ;Line set "1"  port input
                movlw H'17'        ;Delay 72us
                movwf 22h
loop7           decfsz 22h, 01h   
                goto loop7                                  
                goto loop5         ;send wire one
set_wire_0      bcf TRISA, 4       ;Line set "0"  port output
                movlw H'19'        ;Delay 80us
                movwf 22h
loop8           decfsz 22h, 01h   
                goto loop8
                nop                ;send wire zero
                bsf TRISA, 4       ;Line set "1" port input
                movlw H'02'        ;Delay 8us
                movwf 22h
loop9           decfsz 22h, 01h   
                goto loop9
                goto loop5


wire_read       clrf H'23'
                movlw H'08'
                movwf 21h
loop13          bcf TRISA, 4       ;Line set "0" port output
                nop
                nop
                bsf TRISA, 4       ;Line set "1" port input
                nop
                nop
                bcf STATUS, RP0    ;Bank 0
                btfss PORTA,4
                goto write_0
                goto write_1               
loop12          bsf STATUS, RP0    ;Bank 1
                movlw H'14'        ;Delay
                movwf 22h
loop10          decfsz 22h, 01h   
                goto loop10
                decfsz 21h, 01h
                goto loop13
                return
                
write_1         rrf H'23'
                bsf H'23', 7
                goto loop12

                
write_0         rrf H'23'
                bcf H'23', 7
                goto loop12

end

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

4 минуты назад, Юрий123 сказал:

                  movlw H'D7'     ;0xD7h если DS18B20(0x28h); 0xEFh если DS1820(0x10h)
                  addwf H'23', 1
                  btfss STATUS, C
                  goto loopds
                  goto loop1

че за х... написана?

0xd7+0x28 = 0xff - где тут кери?

и кто надоумил так делать проверку? использовать сложение для сравнения чисел???

для этого есть команда xor  и бит зеро

а если регистр 23 ваапче не равен ни 0х28 ни 0х10 прога че делает????

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Простите, если не совсем грамотно, неделю назад начал изучать архитектуру PIC . Если регистр не равен 28 то  прога выполняется заново  по переходу goto loop1, но светодиод не поджигается.

если нужно могу сбросить проект в Протеусе

Ссылка на комментарий
Поделиться на другие сайты

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

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

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

читайте как оформлять код http://pic24.ru/doku.php/osa/articles/mpasm_formatting

повторяю у вас нет проверки на равенство 28! , к тому же убили начальное значение в регистре

movfw 0x23
xorlw 0x28
btfss status,z
goto label_1 неравно
goto labtl_2 равно

исправляйте

Ссылка на комментарий
Поделиться на другие сайты

Код пока сырой. Ваше предложение грамотней конечно.Позже я исправлю.Но на данный момент  удалил проверку на число 28h вообще, чтоб не мешало.

Сейчаст прога постоянно опрашивает датчик и отсылает его код семейства в регистр 0x23 .     Но из за этой команды  - bsf PORTA, 5  он опрашивается только один раз.  ПОтом импульсы на датчик не поступают хотя команды посылаются.

код остался таким:

................

.................

loop1          
                call wire_res     ;Отправить команду сброса

                movlw H'33'       ;Отправить команду 0x33h
                call wire_write   ;Отправить команду 0x33h
                call wire_read    ;принять данные в регистр 0x23h                               

                  bcf STATUS, RP0   ;Bank 0  

              bsf PORTA, 5                                           ;? ? ? ? ? ? ? ? ?

                 bsf STATUS, RP0   ;Bank 1


            

                  goto loop1

.....................

..........................

Ссылка на комментарий
Поделиться на другие сайты

Вообщем получается так что  установка или сброс любого бита регистра защёлки PORTA  командой bcf или bsf  при условии что выводы настроены на вход, информация одновременно защёлкивается  со входов PORTA.2;   PORTA.4;  PORTA.5

Почему так происходит и почему именно эти биты а не все например мне неизвестно. Бред.

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, Юрий123 сказал:

Почему так происходит

читаем раздел 9.10 руководства пользователя

у вас по дефолту портв4=0 , коммутацию вы осуществляете изменением направления порта трисв4 =0/1

портв4 у вас подтянут к +пит , когда вы устанавливаете портв5=1 , читается фактическое состояние портав в регистр записывается

портв4=1

при работе трисом имеете на выходе4 лог1

в ДШ на датчик есть рекомендованный код для ПИК

ds18b20-rus(3).pdf

Ссылка на комментарий
Поделиться на другие сайты

Ясно, значит в пиках это такая особенность. Блин пол дня потратил. А другие биты 0, 1 почему не защёлкиваются их ведь к плюсу подлючил. А как скопировать содержимое регистра 23h в 24h, что то команд подходящих не нашол ?

А всё, разобрался

Ссылка на комментарий
Поделиться на другие сайты

Доброго времени суток!

Помогите, вероятно что то с настройками, при отладке в MPLABX, XC8, в Proteuse PIC16F886 не хочет воспринимать данные EEPROM, определенные в программе через процедуру __EEPROM_DATA(). При этом, из среды MPLABX, в окошке EEPROM, данные изменены, в Proteuse, данные  EEPROM, все равны FF. Если запустить Proteus отдельно, то данные EEPROM отображаются корректно, т.е. записанные через __EEPROM_DATA(). Для моделирования использую COF  файл.  Это доставляет ряд неудобств, хотелось бы непосредственно из MPLABX полноценно отлаживать программу. 

За ранее спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Протез - не железо. По этому, почему он так себя ведёт - одному только Богу разработчику известно.
Отлаживайте в железе и проблем не будет.

Ссылка на комментарий
Поделиться на другие сайты

На глаз код выглядит по другому,  точки останова (которые криво работают, по крайней мере на моей версии протеуса),  просмотр/задание значений переменных и т.д. в MPLABе мне более по душе. Можно и 

15 минут назад, IMXO сказал:

нажать запуск симуляции в протезе????

Поэтому всего лишь "неудобств", а не проблем.

 

Ссылка на комментарий
Поделиться на другие сайты

ну не знаю, попытки подружить протез с мплабом оставил когда мплаб был 8.34, протез досихпор 7.10 , о кривизне точек останова в протезе впервые слышу... это вообще в чем выражается? КМК в протезе как раз точки останова дают более наглядную информацию особенно при настройке отладке системных таймеров

Ссылка на комментарий
Поделиться на другие сайты

точку останова убрал, а программа все равно там останавливается, приходится регулярно Resetом, который в  Debug пользоваться. Протеус 8.1.

Ну ничего прорвемся.

Изменено пользователем Bugrim
опечатка
Ссылка на комментарий
Поделиться на другие сайты

а так это вы ее не убрали...

у точки останова "три состояния" , включена(отметка:красный круг), выключена(отметка:красная окружность), удалена (метка отсудствует)

единственно есть проблемы когда метка стояла на команде которую удалили  и/или заменили другими командами, метка уже не показывается , но работает, тут как обычно ПКМ и снимаем все точки останова, ставим по новой

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Кто сталкивался с проблемой, когда при внутрисхемной отладки не работают порты. MPLAB-X3.65+PicKit3клон+pic18f4550 не работает при отладке RE0-2 хоть тресни, при пошаговом выполнении LATE не меняет регистр порта. когда просто шьешь - работает. ЧЯДНТ??? И как с этим жить...

#pragma config FOSC = XTPLL_XT  //HSPLL_HS
#pragma config PLLDIV = 1
#pragma config CPUDIV = OSC4_PLL6    //24Mgz-OSC3_PLL4 | 16Mhz-OSC4_PLL6
#pragma config USBDIV = 2
#pragma config WDT = OFF //,WDTPS=128
#pragma config PWRT = ON
#pragma config LVP = OFF
#pragma config VREGEN   = ON        //USB Voltage Regulator
#pragma config STVREN   = ON
                        
#pragma config DEBUG = ON //OFF
#pragma config PBADEN = OFF
#pragma config ICPRT = ON //OFF     //Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit
#pragma config XINST = OFF
#pragma config CCP2MX = OFF

    ADCON1 = 0x0A;  //откл АЦП от E
    CMCON = 0x07;   //откл компаратора от E
    LATE  = 0b10000000;   
    PORTE = 0b10000000;
    TRISE = 0b11111000;

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Здравствуйте.

Есть ли в MPLABX,  XC8  встроенные библиотеки для преобразования чисел.  PIC16LF1823.  Я собираюсь на трёхзначный семисегментный экранчик выводить целые значения от 0 до 512.   Стоит ли для этого велосипед творить или есть готовые решения?

Изменено пользователем GDK
Ссылка на комментарий
Поделиться на другие сайты

Напр. значение в переменной val - 000 0001  0011 1011 (315 decimal).

  Из неё нужно получить в переменных :

val1 - 0000 0011 (3);

val2 -  0000 0001 (1); 

val3 - 0000 0101(5).

@IMXO , спасибо. Я это находил вчера, но почему то пощёлкал, что может с 16 битными числами работать... , а с восьмибитными?

Изменено пользователем GDK
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
  • Похожий контент

×
×
  • Создать...