BMP180 представляет собой датчик для измерения атмосферного давления и температуры окружающего воздуха. Поскольку между давлением и температурой существует взаимосвязь, то последняя учитывается при расчете давления. Пределы измеряемого давления составляют 300…1100 мбар, или 225…825 мм рт. ст. Датчик продается в виде модуля GY-68 под Arduino, представляет собой миниатюрную плату на которой установлен стабилизатор напряжения 3,3 В, обвязка и непосредственно сам датчик.
Модуль можно заказать здесь. Напряжение питания датчика может находиться в пределах 1,8…3,6 В. Обмен данными, осуществляется с помощью распространенного интерфейса I2C, скорость передачи может достигать 3,4 Мбит/сек (3,4 МГц). Ток потребления и время преобразования зависят от точности (разрешения) результата преобразования давления и подразделены на режимы, которые отражены в следующей таблице:
Режим преобразования (oss) | Описание | Время преобразования, тип. (макс.) | Ток потребления (частота преобразования 1 Гц) | Длина результата преобразования давления |
0 | Режим пониженного потребления | 3 мс (4,5 мс) | 3 мкА | 16 бит |
1 | Стандартный режим | 5 мс (7,5 мс) | 5 мкА | 17 бит |
2 | Режим высокого разрешения | 9 мс (13,5 мс) | 7 мкА | 18 бит |
3 | Режим ультравысокого разрешения | 17 мс (25,5 мс) | 12 мкА | 19 бит |
Ток потребления в таблице указан для частоты преобразования в 1 Гц, при увеличении частоты, ток возрастает прямо пропорционально.
Для температуры время преобразования фиксировано, и составляет 3 мс (макс. 4,5 мс), длина результата 16 бит.
Ниже представлена карта памяти датчика:
Адрес | Название | Описание |
0xAA – 0xBF | Calib_xx | Калибровочные константы |
0xD0 | Chip-id | Регистр содержит число 0x55, и может использоваться для проверки интерфейса передачи данных |
0xE0 | Soft reset | Регистр программного сброса, для выполнения которого необходимо записать число 0xB6 |
0xF4 | Measurement control | Регистр управления преобразованием |
0xF6 | Out_msb | Регистр результата преобразования, старший байт |
0xF7 | Out_lsb | Регистр результата преобразования, младший байт |
0xF8 | Out_ xlsb | Регистр результата преобразования, дополнительный младший байт |
Всего в памяти датчика хранятся 11 калибровочных констант, необходимых для расчета температуры и давления. Константы двухбайтные, названия и адреса приведены в следующей таблице:
Константа | Адрес в памяти | |
MSB | LSB | |
AC1 | 0xAA | 0xAB |
AC2 | 0xAC | 0xAD |
AC3 | 0xAE | 0xAF |
AC4 | 0xB0 | 0XB1 |
AC5 | 0XB2 | 0XB3 |
AC6 | 0XB4 | 0XB5 |
B1 | 0XB6 | 0XB7 |
B2 | 0XB8 | 0XB9 |
MB | 0XBA | 0XBB |
MC | 0XBC | 0XBD |
MD | 0XBE | 0XBF |
Регистр управления преобразованием (Measurement control) содержит следующие биты:
Бит | Название | Значение бита | Описание |
7-6 | oss Режим преобразования | 00 | Пониженное потребление |
01 | Стандартный режим | ||
10 | Высокое разрешение | ||
11 | Ультравысокое разрешение | ||
5 | sco Бит состояния преобразования | 1 | Начать преобразование |
0 | Преобразование закончено | ||
4-0 | meas_ctrl | 01110 | Измерение температуры |
10100 | Измерение давления |
В общем, для измерения температуры в регистр Measurement control необходимо записать число 0x2E, результат считать из регистров out_msb и out_lsb (16 бит). Для измерения давления записать числа 0x34, 0x74, 0xB4, 0xF4 в зависимости от режима преобразования (oss: 0, 1, 2, 3), при этом длина результата варьируется в пределах от 16 до 19 бит. Для режимов (oss: 1, 2, 3), младшие биты результата находятся в дополнительном регистре Out_ xlsb (7-5 биты). Окончание преобразования можно определить, прочитав значение бита sco.
Результаты преобразования температуры и давления представляют собой некомпенсированные (сырые) данные. Для получения правильных значений необходимо произвести довольно много расчетов с использованием калибровочных констант, причем вычисления идут с 32-х разрядными числами.
Датчик имеет фиксированный 7-ми битный адрес для работы по шине I2C, двоичное значение адреса: 1110111.
Ниже представлен алгоритм и пример расчета из даташита:
Как видно в расчетах присутствуют как знаковые, так и беззнаковые числа, написать программу для расчета на языке СИ не сложно, а вот на ассемблере придется постараться, что я и сделал.
На следующей картинке представлена схема подключения датчика давления BMP180 к микроконтроллеру PIC16F628A:
Микроконтроллер работает на частоте 4 МГц от внутреннего тактового генератора, для вывода результатов измерений я использовал LCD модуль Nokia 5110.
Ниже представлена часть программы для микроконтроллера PIC16F628A, полный исходник с прошивкой можно скачать в конце статьи:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F18' ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге Sec equ 0020h ;вспомогательные регистры счета Sec1 equ 0021h ; Sec2 equ 0022h ; nomer equ 0023h ;регистр хранения кода ascii символа scetbit equ 0024h ;регистр счета кол-ва бит perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c temp equ 0026h ;вспомогательный регистр счета tmp_symb equ 0027h ;вспомогательный регистр счета для таблицы данных oss equ 0028h ;регистр хранения значения точности преобразование результата давления DIGIT1 equ 0030h ;регистры подпрограммы преобразования двоичного числа DIGIT2 equ 0031h ;в десятичное по разрядам DIGIT3 equ 0032h DIGIT4 equ 0033h DIGIT5 equ 0034h DIGIT6 equ 0035h DIGIT7 equ 0036h DIGIT8 equ 0037h DIGIT9 equ 0038h DIGIT10 equ 0039h count_1 equ 003Ah count_2 equ 003Bh bin_HH equ 003Ch bin_HL equ 003Dh bin_LH equ 003Eh bin_LL equ 003Fh adr_i2c equ 0040h ;регистры подпрограммы передачи данных интерфейса i2c tmp_i2c equ 0041h slave_adr equ 0042h data_i2c equ 0043h AC1_LH equ 00A0h ;регистры хранения калибровочных констант датчика BMP180 AC1_LL equ 00A1h AC2_LH equ 00A2h AC2_LL equ 00A3h AC3_LH equ 00A4h AC3_LL equ 00A5h AC4_LH equ 00A6h AC4_LL equ 00A7h AC5_LH equ 00A8h AC5_LL equ 00A9h AC6_LH equ 00AAh AC6_LL equ 00ABh B1_LH equ 00ACh B1_LL equ 00ADh B2_LH equ 00AEh B2_LL equ 00AFh MB_LH equ 00B0h MB_LL equ 00B1h MC_LH equ 00B2h MC_LL equ 00B3h MD_LH equ 00B4h MD_LL equ 00B5h X1_HH equ 00B6h ;регистры для расчета значений температуры и давления датчика BMP180 X1_HL equ 00B7h X1_LH equ 00B8h X1_LL equ 00B9h X2_HH equ 00BAh X2_HL equ 00BBh X2_LH equ 00BCh X2_LL equ 00BDh X3_HH equ 00BEh X3_HL equ 00BFh X3_LH equ 00C0h X3_LL equ 00C1h B3_HH equ 00C2h B3_HL equ 00C3h B3_LH equ 00C4h B3_LL equ 00C5h B5_HH equ 00C6h B5_HL equ 00C7h B5_LH equ 00C8h B5_LL equ 00C9h B4_HH equ 00CAh B4_HL equ 00CBh B4_LH equ 00CCh B4_LL equ 00CDh B6_HH equ 00CEh B6_HL equ 00CFh B6_LH equ 00D0h B6_LL equ 00D1h REGA3 equ 00D2h REGA2 equ 00D3h REGA1 equ 00D4h REGA0 equ 00D5h REGB3 equ 00D6h REGB2 equ 00D7h REGB1 equ 00D8h REGB0 equ 00D9h REGC3 equ 00DAh REGC2 equ 00DBh REGC1 equ 00DCh REGC0 equ 00DDh MTEMP equ 00DEh MCOUNT equ 00DFh P_HH equ 00E0h ;регистры хранения значения давления P_HL equ 00E1h P_LH equ 00E2h P_LL equ 00E3h P_M equ 00E4h ;регистры хранения значения давления в мм рт.ст. P_L equ 00E5h T_HH equ 00E6h ;регистры хранения значения температуры T_HL equ 00E7h T_LH equ 00E8h T_LL equ 00E9h tmp equ 00EAh ;вспомогательный регистр счета flag equ 007Fh ;регистр флагов #DEFINE res_lcd PORTB,4 ;присвоение названий линиям ввода-вывода #DEFINE cs PORTB,5 ;для работы с LCD дисплеем Nokia 5110 #DEFINE dat_com PORTB,6 ; #DEFINE sdata PORTB,7 ; #DEFINE sclk PORTA,1 ; #DEFINE sda PORTB,2 ;линия SDA для подключения датчика BMP180 #DEFINE scl PORTB,3 ;линия SCL для подключения датчика BMP180 #DEFINE sda_io TRISB,2 ;линия направления SDA #DEFINE scl_io TRISB,3 ;линия направления SCL #DEFINE led PORTA,0 ;светодиод ошибки i2c ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b'00000010' ;установка значений выходных защелок порта A movwf PORTA ; movlw b'00110000' ;установка значений выходных защелок порта B movwf PORTB ; movlw b'00000111' ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b'00001111' ;настройка линий ввода\вывода порта B movwf TRISB ;RB0,RB1 - на вход, остальные на выход movlw b'11111100' ;настройка линий ввода\вывода порта A movwf TRISA ;RA0,RA1 - на выход, остальные на вход bcf STATUS,RP0 ;выбрать 0-й банк clrf flag ;сброс регистра флагов call init_lcd ;вызов подпрограммы инициализации дисплея call clear_lcd ;вызов подпрограммы очистки дисплея call viv_not ;вывод на дисплей сообщения "--- " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b'11101110' ;адрес устройства(BMP180) movwf slave_adr call paus ;вызов подпрограммы паузы 5,3 мс movlw .22 ;загрузка констант из датчика (22 байта) во 2-й банк ОЗУ movwf tmp_i2c ; movlw 0xAA ;запись адреса ячейки с которой начнется чтение movwf adr_i2c ; bsf flag,3 ;установка флага загрузки констант из датчика call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C bmp_1 call rd_temp ;вызов подпрограммы чтения температуры с датчика BMP180 movlw data_i2c ;загрузка температуры в регистры T movwf FSR bsf STATUS,RP0 movf INDF,W movwf T_LH incf FSR,F movf INDF,W movwf T_LL bcf STATUS,RP0 movlw .0 ;установка точности измерения давления (16-19бит, 0-3(oss)) movwf oss call rd_pres ;вызов подпрограммы чтения давления с датчика BMP180 movlw data_i2c ;загрузка давления в регистры P movwf FSR bsf STATUS,RP0 movf INDF,W movwf P_HL incf FSR,F movf INDF,W movwf P_LH incf FSR,F movf INDF,W movwf P_LL clrf P_HH bcf STATUS,RP0 movf oss,W ;смещение результата преобразования в регистрах P sublw .8 ;в соответвтвии с точностью преобразования bsf STATUS,RP0 movwf tmp bmp_2 bcf STATUS,C rrf P_HH,F rrf P_HL,F rrf P_LH,F rrf P_LL,F decfsz tmp,F goto bmp_2 call rash_T_P ;вызов подпрограммы расчета температуры и давления bsf STATUS,RP0 ;копирование расчитанной температуры в регистры bin movf T_HH,W bcf STATUS,RP0 movwf bin_HH bsf STATUS,RP0 movf T_HL,W bcf STATUS,RP0 movwf bin_HL bsf STATUS,RP0 movf T_LH,W bcf STATUS,RP0 movwf bin_LH bsf STATUS,RP0 movf T_LL,W bcf STATUS,RP0 movwf bin_LL call bin2dec ;вызов подпрограммы преобразования двоичного числа в десятичное call ust_cur_1 ;установка курсора на 1-й строке LCD дисплея call vivod_temp ;вывод значения температуры на LCD bsf STATUS,RP0 ;копирование расчитанного давления в регистры bin movf P_HH,W bcf STATUS,RP0 movwf bin_HH bsf STATUS,RP0 movf P_HL,W bcf STATUS,RP0 movwf bin_HL bsf STATUS,RP0 movf P_LH,W bcf STATUS,RP0 movwf bin_LH bsf STATUS,RP0 movf P_LL,W bcf STATUS,RP0 movwf bin_LL call bin2dec ;вызов подпрограммы преобразования двоичного числа в десятичное call ust_cur_3 ;установка курсора на 3-й строке LCD дисплея call vivod_p ;вывод значения давления (Паскали) на LCD bsf STATUS,RP0 movf P_M,W ;копирование расчитанного давления (мм рт. ст) в регистры bin bcf STATUS,RP0 movwf bin_LH bsf STATUS,RP0 movf P_L,W bcf STATUS,RP0 movwf bin_LL clrf bin_HL clrf bin_HH call bin2dec ;вызов подпрограммы преобразования двоичного числа в десятичное call ust_cur_2 ;установка курсора на 2-ю строку LCD дисплея call viv_p_mm ;вывод значения давления (мм рт.ст.) на LCD call paus1s ;пауза 1 сек goto bmp_1 ;переход на метку bmp_1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрорамма чтение температуры и давления с датчика BMP180 по интерфейсу I2C rd_temp movlw 0x2E ;загрузка команды на преобразование температуры movwf data_i2c goto rd_bmp1 rd_pres movlw 0x34 ;загрузка команды на преобразование давления в зависимости movwf data_i2c ;от точности преобразования результата movf oss,W movwf perem incf perem,F pres_2 decfsz perem,F goto pres_1 goto rd_bmp1 pres_1 movlw 0x40 addwf data_i2c,F goto pres_2 rd_bmp1 movlw .1 ;передача команды на преобразование по I2C movwf tmp_i2c ;передача одного байта по I2C movlw 0xF4 ; movwf adr_i2c ;запись адреса ячейки с которой начнется чтение call write_i2c ;вызов подпрограммы записи по I2C call err_prov ;проверка на ошибки записи/чтения I2C rd_bmp2 call paus ;вызов подпрограммы паузы 5,3 мс movlw .1 ;проверка окончания преобразования movwf tmp_i2c ;передача одного байта по I2C movlw 0xF4 ; movwf adr_i2c ;запись адреса ячейки с которой начнется чтение call read_i2c ;вызов подпрограммы записи по I2C call err_prov ;проверка на ошибки записи/чтения I2C movlw data_i2c movwf FSR btfsc INDF,5 ;проверка бита готовности результата goto rd_bmp2 ;преобразование не окончено: переход на метку rd_bmp2 movlw .3 ;чтение результата преобразования movwf tmp_i2c ;передача 3-х байта по I2C movlw 0xF6 ; movwf adr_i2c ;запись адреса ячейки с которой начнется чтение call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C return ;выход из подпрограммы err_prov btfss flag,6 ;проверка ошибок передачи данных I2C return ;нет ошибок: выход из подпрограммы err_1 bsf led ;ошибка: включить светодиод led goto err_1 ;переход на метку err_1: зацикливание программы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rash_T_P bsf STATUS,RP0 ;переключение во 2-й банк clrf REGA3 ;загрузка значения температуры UT в REGA clrf REGA2 movf T_LH,W movwf REGA1 movf T_LL,W movwf REGA0 clrf REGB3 ;загрузка значения константы AC6 в REGB clrf REGB2 movf AC6_LH,W movwf REGB1 movf AC6_LL,W movwf REGB0 call subtract ;вычитание UT-AC6 clrf REGB3 ;загрузка значения константы AC5 в REGB clrf REGB2 movf AC5_LH,W movwf REGB1 movf AC5_LL,W movwf REGB0 call multiply ;умножение (UT-AC6)*AC5 movlw .15 ;деление [(UT-AC6)*AC5]/2^15 = X1 movwf tmp tdel_a1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto tdel_a1 movf REGA3,W ;сохранение результата в регистре X1 movwf X1_HH movf REGA2,W movwf X1_HL movf REGA1,W movwf X1_LH movf REGA0,W movwf X1_LL btfsc MD_LH,7 ;загрузка значения константы MD в REGB goto tzag_a1 clrf REGB3 clrf REGB2 goto tzag_a2 tzag_a1 movlw .255 movwf REGB3 movlw .255 movwf REGB2 tzag_a2 movf MD_LH,W movwf REGB1 movf MD_LL,W movwf REGB0 call add ;сумма X1+MD movf REGA0,W ;копирование результата (X1+MD) в REGB movwf REGB0 movf REGA1,W movwf REGB1 movf REGA2,W movwf REGB2 movf REGA3,W movwf REGB3 btfsc MC_LH,7 ;загрузка значения константы MC goto tzag_b1 clrf REGA3 clrf REGA2 goto tzag_b2 tzag_b1 movlw .255 movwf REGA3 movlw .255 movwf REGA2 tzag_b2 movf MC_LH,W movwf REGA1 movf MC_LL,W movwf REGA0 movlw .11 ;умножение MC * 2^11 movwf tmp tumn_a1 bcf STATUS,C rlf REGA0,F rlf REGA1,F rlf REGA2,F rlf REGA3,F decfsz tmp,F goto tumn_a1 call divide ;деление (MC * 2^11)/(X1+MD) = X2 movf X1_HH,W ;загрузка числа X1 в REGB movwf REGB3 movf X1_HL,W movwf REGB2 movf X1_LH,W movwf REGB1 movf X1_LL,W movwf REGB0 call add ;сумма X1 + X2 = B5 movf REGA3,W ;сохранение результата в регистре B5 movwf B5_HH movf REGA2,W movwf B5_HL movf REGA1,W movwf B5_LH movf REGA0,W movwf B5_LL movlw .8 ;загрузка числа 8 в REGB movwf REGB0 clrf REGB1 clrf REGB2 clrf REGB3 call add ;сумма B5 + 8 movlw .4 ;деление (B5 + 8)/2^4 movwf tmp tdel_b1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto tdel_b1 movf REGA0,W ;копируем результат температуры в регистр T movwf T_LL movf REGA1,W movwf T_LH movf REGA2,W movwf T_HL movf REGA3,W movwf T_HH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rash_P movf B5_HH,W ;загрузка числа B5 в REGA movwf REGA3 movf B5_HL,W movwf REGA2 movf B5_LH,W movwf REGA1 movf B5_LL,W movwf REGA0 clrf REGB3 ;загрузка числа 4000 в REGB clrf REGB2 movlw 0x0F movwf REGB1 movlw 0xA0 movwf REGB0 call subtract ;вычитание B5 - 4000 = B6 movf REGA3,W ;сохранение результата в регистре B6 и REGB movwf B6_HH movwf REGB3 movf REGA2,W movwf B6_HL movwf REGB2 movf REGA1,W movwf B6_LH movwf REGB1 movf REGA0,W movwf B6_LL movwf REGB0 call multiply ;умножение B6 * B6 movlw .12 ;деление (B6 * B6)/2^12 movwf tmp pdel_a1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_a1 movf REGA3,W ;сохранение результата ((B6 * B6)/2^12) в регистре X2 movwf X2_HH ;для последующего вычисления, это не X2 из формул расчета movf REGA2,W movwf X2_HL movf REGA1,W movwf X2_LH movf REGA0,W movwf X2_LL btfsc B2_LH,7 ;загрузка значения константы B2 в REGB goto pzag_a1 clrf REGB3 clrf REGB2 goto pzag_a2 pzag_a1 movlw .255 movwf REGB3 movlw .255 movwf REGB2 pzag_a2 movf B2_LH,W movwf REGB1 movf B2_LL,W movwf REGB0 call multiply ;умножение B2 * [(B6 * B6)/2^12] movlw .11 ;деление (B2 * [(B6 * B6)/2^12])/2^11 movwf tmp pdel_b1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_b1 movf REGA3,W ;сохранение результата в регистре X1 movwf X1_HH movf REGA2,W movwf X1_HL movf REGA1,W movwf X1_LH movf REGA0,W movwf X1_LL btfsc AC2_LH,7 ;загрузка значения константы AC2 в REGA goto pzag_b1 clrf REGA3 clrf REGA2 goto pzag_b2 pzag_b1 movlw .255 movwf REGA3 movlw .255 movwf REGA2 pzag_b2 movf AC2_LH,W movwf REGA1 movf AC2_LL,W movwf REGA0 movf B6_LL,W ;загрузка числа B6 в REGB movwf REGB0 movf B6_LH,W movwf REGB1 movf B6_HL,W movwf REGB2 movf B6_HH,W movwf REGB3 call multiply ;умножение AC2 * B6 movlw .11 ;деление (AC2 * B6)/2^11 = X2 movwf tmp pdel_c1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_c1 movf X1_LL,W ;загрузка числа X1 в REGB movwf REGB0 movf X1_LH,W movwf REGB1 movf X1_HL,W movwf REGB2 movf X1_HH,W movwf REGB3 call add ;сумма X1 + X2 = X3 movf REGA3,W ;сохранение результата в регистре X3 movwf X3_HH movf REGA2,W movwf X3_HL movf REGA1,W movwf X3_LH movf REGA0,W movwf X3_LL btfsc AC1_LH,7 ;загрузка значения константы AC1 в REGA goto pzag_c1 clrf REGA3 clrf REGA2 goto pzag_c2 pzag_c1 movlw .255 movwf REGA3 movlw .255 movwf REGA2 pzag_c2 movf AC1_LH,W movwf REGA1 movf AC1_LL,W movwf REGA0 movlw .2 ;умножение AC1 * 4 movwf tmp pumn_a1 bcf STATUS,C rlf REGA0,F rlf REGA1,F rlf REGA2,F rlf REGA3,F decfsz tmp,F goto pumn_a1 movf X3_LL,W ;загрузка числа X3 в REGB movwf REGB0 movf X3_LH,W movwf REGB1 movf X3_HL,W movwf REGB2 movf X3_HH,W movwf REGB3 call add ;сумма (AC1 * 4) + X3 bcf STATUS,RP0 movf oss,W ;смещение ((AC1 * 4) + X3)<<oss xorlw .0 bsf STATUS,RP0 btfsc STATUS,Z goto pumn_c1 bcf STATUS,RP0 movf oss,W bsf STATUS,RP0 movwf tmp pumn_b1 bcf STATUS,C rlf REGA0,F rlf REGA1,F rlf REGA2,F rlf REGA3,F decfsz tmp,F goto pumn_b1 pumn_c1 movlw .2 ;загрузка числа 2 в REGB movwf REGB0 clrf REGB1 clrf REGB2 clrf REGB3 call add ;сумма [((AC1 * 4) + X3)<<oss] + 2 movlw .2 ;деление ([((AC1 * 4) + X3)<<oss] + 2)/4 movwf tmp pdel_d1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_d1 movf REGA3,W ;сохранение результата в регистре B3 movwf B3_HH movf REGA2,W movwf B3_HL movf REGA1,W movwf B3_LH movf REGA0,W movwf B3_LL btfsc AC3_LH,7 ;загрузка значения константы AC3 в REGA goto pzag_d1 clrf REGA3 clrf REGA2 goto pzag_d2 pzag_d1 movlw .255 movwf REGA3 movlw .255 movwf REGA2 pzag_d2 movf AC3_LH,W movwf REGA1 movf AC3_LL,W movwf REGA0 movf B6_LL,W ;загрузка числа B6 в REGB movwf REGB0 movf B6_LH,W movwf REGB1 movf B6_HL,W movwf REGB2 movf B6_HH,W movwf REGB3 call multiply ;умножение AC3 * B6 movlw .13 ;деление (AC3 * B6)/2^13 = X1 movwf tmp pdel_e1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_e1 movf REGA3,W ;сохранение результата в регистре X1 movwf X1_HH movf REGA2,W movwf X1_HL movf REGA1,W movwf X1_LH movf REGA0,W movwf X1_LL btfsc B1_LH,7 ;загрузка значения константы B1 в REGA goto pzag_e1 clrf REGA3 clrf REGA2 goto pzag_e2 pzag_e1 movlw .255 movwf REGA3 movlw .255 movwf REGA2 pzag_e2 movf B1_LH,W movwf REGA1 movf B1_LL,W movwf REGA0 movf X2_LL,W ;загрузка числа (B6 * B6)/2^12 из X2 в REGB movwf REGB0 movf X2_LH,W movwf REGB1 movf X2_HL,W movwf REGB2 movf X2_HH,W movwf REGB3 call multiply ;умножение B1 * ((B6 * B6)/2^12) movlw .16 ;деление (B1 * ((B6 * B6)/2^12))/2^16 = X2 movwf tmp pdel_f1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_f1 movf X1_LL,W ;загрузка числа X1 в REGB movwf REGB0 movf X1_LH,W movwf REGB1 movf X1_HL,W movwf REGB2 movf X1_HH,W movwf REGB3 call add ;сумма X1 + X2 movlw .2 ;загрузка числа 2 в REGB movwf REGB0 clrf REGB1 clrf REGB2 clrf REGB3 call add ;сумма (X1 + X2) + 2 movlw .2 ;деление ((X1 + X2) + 2)/4 = X3 movwf tmp pdel_g1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_g1 clrf REGB3 ;загрузка числа 32768 в REGB clrf REGB2 movlw 0x80 movwf REGB1 clrf REGB0 call add ;сумма X3 + 32768 clrf REGB3 ;загрузка значения константы AC4 в REGB clrf REGB2 movf AC4_LH,W movwf REGB1 movf AC4_LL,W movwf REGB0 call multiply ;умножение AC4 * (X3 + 32768) movlw .15 ;деление (AC4 * (X3 + 32768)/2^15) = B4 movwf tmp pdel_h1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_h1 movf REGA3,W ;сохранение результата в регистре B4 movwf B4_HH movf REGA2,W movwf B4_HL movf REGA1,W movwf B4_LH movf REGA0,W movwf B4_LL movf P_HH,W ;загрузка числа UP в REGA movwf REGA3 movf P_HL,W movwf REGA2 movf P_LH,W movwf REGA1 movf P_LL,W movwf REGA0 movf B3_LL,W ;загрузка числа B3 в REGB movwf REGB0 movf B3_LH,W movwf REGB1 movf B3_HL,W movwf REGB2 movf B3_HH,W movwf REGB3 call subtract ;вычитание UP-B3 clrf REGB3 ;загрузка числа 50000 в REGB clrf REGB2 movlw 0xC3 movwf REGB1 movlw 0x50 movwf REGB0 bcf STATUS,RP0 movf oss,W ;смещение 50000 >> oss xorlw .0 bsf STATUS,RP0 btfsc STATUS,Z goto pdel_k1 bcf STATUS,RP0 movf oss,W bsf STATUS,RP0 movwf tmp pdel_j1 rlf REGB3,W rrf REGB3,F rrf REGB2,F rrf REGB1,F rrf REGB0,F decfsz tmp,F goto pdel_j1 pdel_k1 call multiply ;умножение (UP-B3) * (50000 >> oss) btfsc REGA3,7 goto rash_P1 bcf STATUS,C ;B7 < 0x80000000 (B7 * 2) rlf REGA0,F rlf REGA1,F rlf REGA2,F rlf REGA3,F movf B4_LL,W ;загрузка числа B4 в REGB movwf REGB0 movf B4_LH,W movwf REGB1 movf B4_HL,W movwf REGB2 movf B4_HH,W movwf REGB3 call divide_uns ;беззнаковое деление (B7 * 2)/B4 goto rash_P2 rash_P1 movf B4_LL,W ;B7 >= 0x80000000, загрузка числа B4 в REGB movwf REGB0 movf B4_LH,W movwf REGB1 movf B4_HL,W movwf REGB2 movf B4_HH,W movwf REGB3 call divide_uns ;беззнаковое деление B7/B4 bcf STATUS,C ;умножение (B7/B4) * 2 rlf REGA0,F rlf REGA1,F rlf REGA2,F rlf REGA3,F rash_P2 movf REGA3,W ;сохранение результата в регистре P movwf P_HH movf REGA2,W movwf P_HL movf REGA1,W movwf P_LH movf REGA0,W movwf P_LL movlw .8 ;деление P/2^8 movwf tmp pdel_l1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_l1 movf REGA3,W ;копирование результата из REGA в REGB movwf REGB3 movf REGA2,W movwf REGB2 movf REGA1,W movwf REGB1 movf REGA0,W movwf REGB0 call multiply ;умножение (P/2^8) * (P/2^8) = X1 clrf REGB3 ;загрузка числа 3038 в REGB clrf REGB2 movlw 0x0B movwf REGB1 movlw 0xDE movwf REGB0 call multiply ;умножение X1 * 3038 movlw .16 ;деление (X1 * 3038)/2^16 = X1 movwf tmp pdel_o1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_o1 movf REGA3,W ;сохранение результата в регистре X1 movwf X1_HH movf REGA2,W movwf X1_HL movf REGA1,W movwf X1_LH movf REGA0,W movwf X1_LL movlw 0xFF ;загрузка числа -7357 в REGA movwf REGA3 movlw 0xFF movwf REGA2 movlw 0xE3 movwf REGA1 movlw 0x43 movwf REGA0 movf P_LL,W ;загрузка числа P в REGB movwf REGB0 movf P_LH,W movwf REGB1 movf P_HL,W movwf REGB2 movf P_HH,W movwf REGB3 call multiply ;умножение (-7357) * P movlw .16 ;деление ((-7357) * P)/2^16 = X2 movwf tmp pdel_p1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_p1 movf X1_LL,W ;загрузка числа X1 в REGB movwf REGB0 movf X1_LH,W movwf REGB1 movf X1_HL,W movwf REGB2 movf X1_HH,W movwf REGB3 call add ;сумма (X1 + X2) clrf REGB3 ;загрузка числа 3791 в REGB clrf REGB2 movlw 0x0E movwf REGB1 movlw 0xCF movwf REGB0 call add ;сумма (X1 + X2)+3791 movlw .4 ;деление ((X1 + X2)+3791)/2^4 movwf tmp pdel_q1 rlf REGA3,W rrf REGA3,F rrf REGA2,F rrf REGA1,F rrf REGA0,F decfsz tmp,F goto pdel_q1 movf P_LL,W ;загрузка числа P в REGB movwf REGB0 movf P_LH,W movwf REGB1 movf P_HL,W movwf REGB2 movf P_HH,W movwf REGB3 call add ;сумма P + ((X1 + X2)+3791)/2^4 = P movf REGA3,W ;сохранение результата в регистре P movwf P_HH movf REGA2,W movwf P_HL movf REGA1,W movwf P_LH movf REGA0,W movwf P_LL clrf REGB3 ;загрузка числа 133 в REGB clrf REGB2 clrf REGB1 movlw 0x85 movwf REGB0 call divide ;деление P/133 получаем значение в мм.рт.столба movf REGA1,W ;сохранение результата в регистре P_M, P_L movwf P_M movf REGA0,W movwf P_L bcf STATUS,RP0 return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Интерфейс I2C на стороне микроконтроллера реализован программно. После инициализации дисплея выполняется считывание калибровочных констант из датчика в 1-й банк ОЗУ микроконтроллера, там же расположены все вспомогательные регистры, участвующие в арифметических операциях расчета температуры и давления. Под расчеты и хранение констант выделено 75 регистров, почти весь 1-й банк ОЗУ. В 0-м банке расположены регистры подпрограммы передачи данных интерфейса I2C, регистры подпрограммы преобразования двоичного числа в десятичное по разрядам, а также регистры для работы с дисплеем Nokia 5110.
Далее вызывается подпрограмма получения значения температуры rd_temp, которая отправляет на датчик команду запуска преобразования и затем считывает результат. Для получения величины давления, необходимо предварительно в регистр oss записать число от 0 до 3, в зависимости от требуемой точности результата, затем вызывается подпрограмма rd_pres.
Далее следует вызов подпрограммы расчета давления и температуры rash_T_P. Расчет выполняется при помощи арифметических подпрограмм для знаковых 32-х разрядных чисел. Из-за большого количества вычислений подпрограммы расчета занимают значительный объем памяти программ микроконтроллера PIC16F628A, около 800 слов, 40% памяти программ. Расчет длится около 15 мс, для частоты тактового генератора 4 МГц.
После получения рассчитанных значений температуры и давления выполняется преобразование результата в десятичное значение и вывод на LCD дисплей. На первой строке выводится температура, на второй давление в мм рт. ст., на третьей давление в Паскалях. Пауза между измерениями равна 1 секунде. Вся программа занимает около 1600 слов, то есть 80% памяти программ. При возникновении ошибки передачи данных по интерфейсу I2C загорается светодиод HL1, программа при этом зацикливается.
У меня было 2 экземпляра BMP180, при сравнении показаний давления с прогнозом погоды из интернета, первый датчик показывал на 1 мм рт.ст. меньше значения прогноза, второй на 3 мм рт.ст. меньше, то есть получается некоторый разброс показаний от экземпляра к экземпляру. При сравнении показаний температуры с распространенным датчиком DS18B20, оба экземпляра BMP180 выдавали меньшее значение температуры, первый на 1 градус Цельсия, второй на 1,8.
Прошивка МК и исходник для подключения датчика BMP180
Посетитель, зарегистрированный под именем Nik, отредактировал исходный файл под шрифт размером 9×14, ниже на фото представлен пример отображения температуры и давления на дисплее, исходник и прошивка в конце статьи.
Прошивка МК и исходник для BMP180, шрифт 9×14
Печатная плата разработанная посетителем сайта Печатная плата
Игорь
18 Авг 2016Добрый день Руслан.
Подскажите возможно ли увеличить размер шрифта
в 2 раза?
admin
18 Авг 2016Приветствую, да это возможно, в этом случае в одну строку уместится 8 символов, всего 3 строки, для этого надо редактировать прошивку, включить таблицу символов 9×14.
Сергей
26 Сен 2016Добрый день. Вопрос несколько не по теме, но, скажите пожалуйста, Вам встречались микроконтроллеры серии pic16, работающие при температуре минус 50 градусов Цельсия (по документации на микроконтроллер)?
admin
26 Сен 2016Здравствуйте, я посмотрел документации микроконтроллеров с которыми приходилось иметь дело, из них PIC16F84A, а также серия PIC16F87XA (всего в серии 4 микроконтроллера) могут эксплуатироваться до -55 градусов Цельсия по даташиту.
Сергей
27 Сен 2016Cпасибо.
_DDL_
17 Окт 2016а можно создать схему с виводом значения мм.рт.ст на семисегментние индикатори?
admin
17 Окт 2016Вы наверное имеете в виду вывод на индикаторы с драйвером MAX7219 , да конечно это можно реализовать
_DDL_
18 Окт 2016а как точно просто я в етом не разбераюсь можете зделать модель в протусе и отредактировать прошивку
admin
18 Окт 2016Я постараюсь выложить новую версию, но на это уйдет время, придется подождать
Nik
29 Янв 2017Uvozaemiy admin, hochu pereslat vash proekt otredaktirovahiy 9X14. na vash sait. Kak eto sdelat? Spasibo
admin
30 Янв 2017Здравствуйте, не понял вашего вопроса, пишите точнее.
Nik
30 Янв 2017Я отредактировал ваш АСМ ВМР-180 под большие буквы 9Х14 может кому-то будет интерес повторить с большим шрифтом.Вот и подумал вам переслать. Вы мне помогли с экономить время на написания протокола обмена с ВМР спасибо вам,ну и я чуть-чуть кому-то может помогу.
admin
30 Янв 2017Хорошо), пришлите на почту (почта указана на странице “Об авторе” https://radiolaba.ru/o-avtore) прошивку и исходный код, можно еще и фото как это все выглядит, я выложу в конце статьи ваши доработки.
Игорь
12 Фев 2017Здравствуйте.
Будет ли работать схема при замене BMP180 на BMP280, вроде бы
позиционируется как прямая замена?
admin
12 Фев 2017Здравствуйте, нет BMP280 не подойдет, там другие формулы для расчета давления и температуры.
Андреев Василий Максимович
24 Фев 2017Добрый день. Собрал этот прибор работает хорошо. Но есть одна проблема, купив два датчика ВМР180 китайского производства, обнаружил что у них большой разброс по показаниям и они занижают фактическое значение на несколько цифр. Нельзя ли в прошивку внести изменение, чтобы можно было корректировать значение показаний, например забить некоторую цифру к которой и будет прибавляться данные датчика. Это было бы очень здорово. С уважением В. М. Андреев.
Александр
6 Июн 2017Можно вместо дисплея 5110, установить 3310.
admin
6 Июн 2017Да можно, эти дисплеи идентичны.
Александр
6 Июн 2017Цоколевки выводов разные, или одинаковые
admin
6 Июн 2017Расположение выводов может быть разным, точно не помню, но название и назначение одинаковые.
Александр
6 Июн 2017Ок, спасибо, буду искать цоколёвку.
Александр
7 Июн 2017Прибор работает отлично, индикатор от Nokia 3310, Спасибо автору.
FDoich
7 Сен 2017Сейчас собрал на макетке, всё работает. Надо откопать ещё индикатор от 3310 попробовать с крупным шрифтом. Отличный компактный приборчик получится. Ещё бы кнопку с таймером включения на 5-10 секунд добавить в программу.
Андрей
30 Ноя 2017Помогите победить с формулами вычислений для BMP280. Ассемблер, PIC16F628A Инициализция, настройка регистров F4 & F5 сделана. Калибровочные с 88 по А1 сохраняются, считывание c F7 по FC происходит, сохраняю всё в регистрах. А вот дальше затык…
admin
30 Ноя 2017Там слишком объемные и сложные вычисления, я не берусь все это рассчитывать.
Денис
1 Янв 2018Здравствуйте. Можно ли к шине i2c прикрутить второй датчик для сравения давлений, скажем в канале вентиляции? Если да то можно в кратце какие изменения необходимо сделать в исходнике (как считывать показания двух датчиков по шине i2c, выводить на экран). Хочу сделать сравнение показаний давлений и при разнице включать сигнализацию реле. Спасибо.
admin
2 Янв 2018Здравствуйте, к одной и той же шине нельзя подключить 2 датчика, потому что они имеют одинаковый фиксированный адрес (будет коллизия). Можно просто подключить второй датчик к другим линиям микроконтроллера, и использовать одни и те же подпрограммы для считывания данных.
Надо вносить правки в код, по изменениям пока не могу сказать конкретно.
Денис
2 Янв 2018Спасибо
Антон
16 Май 2018Поправьте, если ошибаюсь, но думаю, что в расчёте давления:
pdel_k1 call multiply ;умножение (UP-B3) * (50000 >> oss)
btfsc REGB3,7
goto rash_P1
// REGB3,7 следует заменить на REGA,7 , т.к. результат умножения B7 находится в REGA
admin
16 Май 2018Приветствую, да действительно ошибка, я поправил файлы, спасибо за наблюдательность)
Виктор
30 Ноя 2018Будет ли печатка в lay ?
admin
30 Ноя 2018Разработку печатной платы для этого устройства я пока не планировал.
admin
2 Дек 2018Один из посетителей сайта прислал версию печатной платы, можно скачать в конце статьи.
ЮРИЙ
7 Мар 2020в печатке ошибка резистор R1 идет на 4 ногу контролера а по схеме на 10
Виктор
3 Дек 2018какой стабилизатор используется на печатной плате?
admin
3 Дек 2018Подойдет AMS1117-3.3 (корпус SOT-223) или аналогичный.
Виктор
8 Дек 2018назначение 4 отверстий рядом с микросхемой стаб.и pic ?
admin
8 Дек 2018Два отверстия предназначены для перемычки (общий провод), два других видимо для включения подсветки дисплея (7 вывод), но насколько я помню для включения подсветки нужно подать минус на 7 вывод, а не плюс.
Виктор
8 Дек 2018для красной китайской платы 7 нога индикатора должна быть на корпусе?
Виктор
8 Дек 2018без датчика пишет ААВВ это правильно?
admin
8 Дек 2018Без датчика на экране должно высветится три тире (—), и включится светодиод ошибки HL1 протокола I2C.
Сергей
20 Дек 2018огромное спасибо за исходник – задумал прикрутить BMP-180 к существующей конструкции и тоже пишу на асме. Посмотрел расчеты, стало грустновато… а тут вот оно! правда пик чуть другой – 876, но это уже не вопрос, тем паче модуль I2C на борту есть – бери готовые процедуры и делай! Вроде как все что касается BMP во вставке здесь? Посмотрел пока очень бегло .
admin
21 Дек 2018Приветствую! код приведенный в статье содержит все расчеты по вычислению давления и температуры, кроме подпрограмм интерфейса I2C, и дисплея Nokia 5110, полный код можно скачать в конце статьи.
Сергей
21 Дек 2018Добрый день!
“содержит все расчеты по вычислению давления и температуры” и чтение параметров из BMP180?
“кроме подпрограмм интерфейса I2C, и дисплея Nokia 5110” I2C у меня аппаратный, дисплей – двухстрочник, так что это не нужно
Сергей
21 Дек 2018в процедурах vivod_tem, vivod_p ,viv_p_mm получим числа в формате 0х31, 0х32 и т.д. , т.е. в таблице ascii символов – далее у вас идут преобразования именно для вашего LCD – я правильно понял? На двухстрочник мне нужно именно ascii символы, т.е. я могу просто из этих процедур выводить данные, или тут есть подводный камень?
admin
21 Дек 2018В подпрограммах vivod_tem, vivod_p ,viv_p_mm выполняется преобразование двоично-десятичного числа находящегося в регистрах DIGIT1-DIGIT10 в ASCII символы (путем прибавления числа 48 для каждого разряда), и вывод на дисплей. Но полученные ASCII символы не сохраняются. Сохраняется только двоично-десятичное число в регистрах DIGIT1-DIGIT10.
Температура и давление рассчитываются в подпрограмме rash_T_P, затем последовательно выводятся на дисплей, сначала температура преобразуется из десятичного числа в двоично-десятичное в подпрограмме bin2dec, затем в подпрограмме vivod_temp преобразуется в ASCII и выводится на дисплей. Далее таким же способом давление.
Сергей
21 Дек 2018благодарю за помощь, вроде разобрался, буду транслировать на свой пик
Виктор
25 Янв 2019есть ли возможность уменьшить показания темп. на2С
Сергей
31 Янв 2019после долгих танцев с бубном вокруг этой конструкции получил
1. Питание от аккумулятора – прибор работает круглые сутки, меня больше интересует как меняется давление в течении суток – рыбалка
2. график изменения давления за сутки (см п. 1)
3. естно проц пришлось заменить – 628-й забит под завязку
3. мелкие изменения типа –
err_1 bsf led ;ошибка: включить светодиод led
goto err_1 ;переход на метку err_1: за
зависание не годится для эсплуатации
получился вроде и не плохой прибор, единственно поленился поставить точку после 3-го знака паскалей. Если есть у кого интерес могу прислать программу, схему, плату хотя повторять чужую плату не есть хорошо – найти такие же элементы не всегда получится.
Выполнено на синем дисплее – такая вот интересность – на дисплее надпись – 3V-5V! Не стал пробовать т.к. следов какого либо стабилизатора не обнаружил на плате. Может есть у кого-то опыт?
FDoich
31 Янв 2019А сюда выложить?
Сергей
31 Янв 2019“А сюда выложить?”
Без проблем. Но не вижу как прикрепить файл
Сергей
23 Фев 2023Здравствуйте Сергей, вот прочитал -“Если есть у кого интерес могу прислать программу, схему, плату хотя повторять” вышлите пожалуйста – portveen@gmail.com Спасибо.
FDoich
31 Янв 2019Вы Админу напишите.
Сергей
31 Янв 2019“Админу напишите.”
он же думаю здесь, читает…
FDoich
31 Янв 2019Не факт, что постоянно отслеживает…
Владимир
9 Апр 2019Добрый день,админ.Можно ли получить уточненный HEX-файл с десятичной точкой в строке гПа и второй вопрос- имеется ли прошивка для схемы подключения pic-контроллера к модулю MAX7219 с 8 светодиодными индикаторами?
Вадим
29 Май 2019А у меня дисплей (nokia 5110 на синей платке), заливает черным, реально получилось все ок при питании 2,6 вольта, как бы отрегулировать контрастность дисплея ?
admin
29 Май 2019Надо поменять значение в строке программы:
movlw 0xC1 ;установка контрастности (напряжение Vop) 6,42В (0хB8)
call sendispcom
Затем заново откомпилировать программу.
саша
22 Авг 2019Где в расчёте и в программе используются калибровочные коэффициенты MB_LL, MB_LH ?
саша
7 Мар 2020никто не знает…. 🙁
Николаич
3 Дек 2019Перепилил код под PIC16F683 на Ассемблере для обмена данными по RS-232 (температура, давление, контрольный пример, прием/сохранение режима точности)
Николаич
26 Янв 2020Перепилил код под BME280+ W1602- I2C для PIC12F683 с использованием библиотек I2C автора. Алгоритмы расчета T, P, H, взяты из даташита BME280 и выполнены как функции на ассемблере .
ЮРИЙ
26 Мар 2020ВСЕМ ПРИВЕТ! Собрал схему барометра , неработает прошивал программатором miniPro
пробовал для BMP180, шрифт 9×14 и исходник для подключения датчика BMP180 результат оди и то же заподозрил что неисправна мс купил другую результат 0. ВОЗМОЖНО ЧТО ДЕЛО В САМОЙ ПРОШИВКЕ? Автор выложил печатку но там есть несовпадения резистор 10к R1 идёт на 10 ногу а на печатке 4. ??????? возможно обратится к автору,………
Владимир
8 Ноя 2021Не могли бы выслать исходники.
Алексей
27 Апр 2023Добрый день.
Спасибо за интересный проект. Собрал вариант с шрифтом 9х14, все работает отлично. Сравнивал давление с реальным, разница 2 единицы. Вопрос, есть возможность подправить прошивку, чтоб вместо давления гПа (нижняя строка) показывал высоту над уровнем моря?
Владимир
2 Окт 2023Спасибо за проект. Собрал вариант со шрифтом 9х14, все работает отлично. С давлением всё нормально, а температура на 1,5* выше.
Я не программист, но тоже бы хотелось что бы нижняя строка показывала высоту над уровнем моря. А то эти паскали нам ни к чему .