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

Общие вопросы по 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

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

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 прога че делает????

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 равно

исправляйте

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Код пока сырой. Ваше предложение грамотней конечно.Позже я исправлю.Но на данный момент  удалил проверку на число 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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Вообщем получается так что  установка или сброс любого бита регистра защёлки 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 пользователей онлайн

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

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