Радиомодули HC-12 построены на трансивере Si4463, и микроконтроллере серии STM8S, трансивер (приемопередатчик) обеспечивает двунаправленную радиосвязь, а микроконтроллер образует прозрачный интерфейс передачи данных, что позволяет с помощью двух модулей организовать беспроводной UART интерфейс. Максимальная заявленная дальность связи может достигать 1,8 км на открытой местности.
Я приобрел модули в Китае, заказать можно здесь, с виду представляют собой миниатюрную плату, размером 27,4х13,2 мм, на которой расположены микросхема трансивера, микроконтроллер, кварцевый генератор, антенный разъем, стабилизатор напряжения.
Модуль HC-12 поддерживает многоканальный режим передачи данных в пределах 433,4-473,0 МГц, с шагом 400 кГц, всего 100 каналов. Максимальная мощность передатчика составляет 100 мВт (+20 дБм), чувствительность приемника лежит в пределах -124…-100 дБм, в зависимости от скорости передачи данных.
Напряжение питания модуля может варьироваться в пределах 3,2…5,5 В, максимальный потребляемый ток составляет 100 мА (в режиме передатчика при максимальной мощности +20 дБм). Модуль имеет 5 выводов: VCC и GND для подключения питания, выводы TX и RX для передачи данных по интерфейсу UART, а также вывод SET для настройки модуля с помощью AT команд.
Радиомодули HC-12 позиционируются в качестве беспроводной замены физического (проводного) полудуплексного соединения UART, полудуплекс означает, что модуль не может вести прием и передачу данных одновременно.
Режимы передачи данных модуля HC-12
Модуль имеет 4 режима передачи данных: FU1, FU2, FU3, FU4, которые различаются скоростью передачи данных, и энергопотреблением в режиме ожидания. По умолчанию задействован режим FU3. Модули с разными режимами не могут передавать данные друг другу, необходимо выбрать одинаковые режимы, наиболее подходящие по требованиям к конкретной ситуации. Кроме режима, одинаковыми должны быть скорость передачи данных порта UART, и номер канала.
Количество передаваемых данных (байт) не ограничено (только для режимов FU1, FU3), но следует знать, что при непрерывной передаче большого количества данных, несколько байт могут быть утеряны, из-за воздействия различных помех и других факторов.
В режиме FU3 модуль функционирует на максимальной скорости, ток потребления в режиме ожидания составляет 16 мА. В этом режиме скорость передачи данных по радиоканалу автоматически регулируется в зависимости от установленной скорости порта UART, соотношение скоростей приведено в таблице ниже:
Скорость порта UART, Бит/сек | 1200 | 2400 | 4800 | 9600 | 19200 | 38400 | 57600 | 115200 |
Скорость по радиоканалу, Бит/сек | 5000 | 15000 | 58000 | 236000 |
Для увеличения дальности связи, рекомендуется снизить скорость передачи данных порта UART.
В следующей таблице представлены данные по чувствительности приемника, в зависимости от скорости передачи данных по радиоканалу:
Скорость по радиоканалу, Бит/сек | 500 | 5000 | 15000 | 58000 | 236000/250000 |
Чувствительность приемника, дБм | -124 | -116 | -111 | -106 | -100 |
Как правило, чувствительность уменьшается на 6…10 дБ, а дальность связи в 2 раза. Максимальная дальность связи на открытой местности (по технической документации) для режима FU3 составляет 1000 м.
Режим FU1 является энергосберегающим, ток потребление в режиме ожидания составляет 3,6 мА. Здесь также можно установить 8 различных скоростей порта UART (как в режиме FU3), но скорость передачи по радиоканалу фиксирована, и составляет 250000 Бит/сек, дальность связи небольшая, до 100 м.
FU2 – режим энергосбережения со сверхнизким энергопотреблением, ток потребления в режиме ожидания составляет около 80 мкА. Этот режим поддерживает следующие значения скорости порта UART: 1200, 2400, 4800 Бит/сек. Если до этого UART порт функционировал на более высокой скорости, то модуль автоматически снизить скорость порта до 4800 Бит/сек, изменения вступят в силу после выхода из режима настроек.
Передача данных возможна только небольшими пакетами (не более 20 байт), интервал времени между пакетами не должен быть слишком коротким (желательно не менее 2 сек), иначе возможна потеря данных. Скорость передачи по радиоканалу и дальность связи такие же, как и в режиме FU1.
Режим FU4 предназначен для максимальной дальности связи, ток потребления в режиме ожидания составляет 16 мА. Поддерживается только самая низкая скорость порта UART: 1200 Бит/сек, если установлена более высокая скорость UART порта, то модуль автоматически снизить ее. Скорость передачи по радиоканалу фиксирована и составляет 500 Бит/сек. Передача данных возможна только небольшими пакетами (не более 60 байт), интервал времени между пакетами не должен быть менее 2 сек, иначе возможна потеря данных. Дальность связи на открытой местности может достигать 1800 м.
В следующей таблице представлены характеристики радиомодуля HC-12 при различных режимах:
Режим | FU1 | FU2 | FU3 | FU4 | |
Ток потребления в режиме ожидания | 3,6 мА | 80 мкА | 16 мА | 16 мА | |
Время передачи данных | 15…25 мс | 500 мс | 4…80 мс | 1 сек | Передача одного байта |
Задержка цикла (время от передачи и до получения пакета данных) | 31 мс | Скорость UART 9600 Бит/сек Передача одного байта | |||
31 мс | Скорость UART 9600 Бит/сек Передача 10-ти байт | ||||
Дальность связи при максимальной мощности передатчика +20 дБм | 100 м | 100 м | 600 м при 9600 Бит/сек | 1800 м при 1200 Бит/сек | Значения даны для идеальных условий на открытой местности |
1000 м при 2400 Бит/сек |
Измерение задержки цикла производится, когда на одном модуле замкнуты вывода RX и TX (то есть принятые модулем данные снова отправляются), а с помощью второго модуля отправляют и принимают данные.
Описание AT команд и настройка параметров модуля HC-12
Модуль может функционировать в двух режимах, которые задаются выводом SET. При высоком логическом уровне на входе SET, модуль находится в режиме передачи данных, все байты, переданные по UART, будут отправлены по радиоканалу (прозрачный режим).
Второй режим (командный) предназначен для настройки параметров и управления функциями модуля. Переключение в этот режим осуществляется установкой низкого логического уровня на входе SET. Имеется два способа входа в командный режим:
- Установка низкого логического уровня на входе SET, во время нормальной работы модуля (питание все время присутствует).
- Установка низкого логического уровня на входе SET (подключение к шине GND), перед подачей питания на модуль.
Любой из этих способов приведет к переключению модуля в командный режим, отличие второго способа в том, что модуль примет фиксированные настройки порта UART, а именно: скорость 9600 Бит/сек, 8 бит данных, без проверки четности, 1 стоп-бит (8N1). Таким образом, этот способ удобен, когда настройки порта UART неизвестны.
При входе в командный режим (после установки низкого уровня на входе SET) необходимо выдержать паузу не менее 40 мс, перед тем как передавать команды на модуль. После изменения параметров модуля, новые настройки вступят в силу после выхода из командного режима. Для выхода из командного режима и переключения в режим передачи данных, необходимо установить высокий логический уровень на входе SET, после чего выдержать паузу не менее 80 мс, необходимую для применения новых настроек и переключения режимов.
Вывод SET подтянут к высокому логическому уровню внутри модуля, для управления требуется выход с открытым коллектором.
В командном режиме модуль HC-12 поддерживает стандартные AT команды, любая команда начинается с символов AT, в конце команды должен присутствовать символ возврата каретки <CR> (шестнадцатеричное значение 0x0D, в языках программирования “\r”). Ответное сообщение модуля отличается от стандарта AT команд, ответ непосредственно начинается с сообщения и заканчивается символами <CR> и <LF>, в то время в стандарте, ответное сообщение начинается и заканчивается символами <CR><LF>, где <LF> – символ перевода строки, шестнадцатеричное значение 0x0A, в языках программирования “\n”. С помощью USB-UART преобразователя модуль можно подключить к компьютеру и установить соединение, например, с помощью терминальной программы Terminal 1.9b.
Ниже представлены все основные команды модуля:
Описание | Тестовая команда |
Формат | AT |
Ответ | ОК |
Описание | Команда установки скорости порта UART | |
Формат | AT+B<скорость передачи> | |
Параметр | <скорость передачи>: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 Бит/сек | |
Пример команды | AT+B4800 | |
Ответ | OK+B4800 | Скорость порта UART равна 4800 Бит/сек |
Примечание | По умолчанию скорость равна 9600 Бит/сек |
Описание | Команда установки номера канала | |
Формат | AT+С<номер канала> | |
Параметр | <номер канала>: 001…127 | |
Пример команды | AT+C001 | |
Ответ | OK+C001 | Номер канала равен 001 |
Примечание | По умолчанию номер канала равен 001, рабочая частота 433,4 МГц Каналу под номером 100, соответствует частота 473,0 МГц, шаг канала 400 кГц Не рекомендуется устанавливать канал с номером более 100 |
Описание | Команда установки режима передачи данных | |
Формат | AT+FU<номер> | |
Параметр | <номер>: 1…4 | |
Пример команды | AT+FU2 | |
Ответ | OK+FU2 | Установлен режим передачи данных FU2 |
OK+FU2,B4800 | Установлен режим FU2, автоматическая установка скорости 4800 Бит/сек (только после выхода из командного режима), при условии, что команда передана на скорости более 4800 Бит/сек. | |
Пример команды | AT+FU4 | |
Ответ | OK+FU4 | Установлен режим передачи данных FU4 |
OK+FU4,B1200 | Установлен режим FU4, автоматическая установка скорости 1200 Бит/сек (только после выхода из командного режима), при условии, что команда передана на скорости более 1200 Бит/сек. |
Описание | Команда установки мощности передатчика | |
Формат | AT+P<значение> | |
Параметр | <значение>: 1=-1 дБм (0,8 мВт) 2=+2 дБм, (1,6 мВт) 3=+5 дБм (3,2 мВт) 4=+8 дБм, (6,3 мВт) 5=+11 дБм, (12 мВт) 6=+14 дБм, (25 мВт) 7=+17 дБм, (50 мВт) 8=+20 дБм (100 мВт) | |
Пример команды | AT+P6 | |
Ответ | OK+P6 | Мощность передатчика равна 14 дБм |
Примечание | По умолчанию мощность передатчика равна +20 дБм Падение мощности на 6…10 дБм, пропорционально уменьшению дальности связи в 2 раза |
Описание | Команда запроса значения параметра | |
Формат | AT+R<параметр> | |
Параметр | <параметр>: B–скорость порта UART, C–номер канала, F–режим передачи данных, P–мощность передатчика | |
Пример команды | AT+RF | |
Ответ | OK+FU3 | Текущий режим передачи данных равен FU3 |
Описание | Команда запроса всех параметров | |
Формат | AT+RX | |
Ответ | OK+B9600 OK+RC001 OK+RP:+20dBm OK+FU3 | скорость порта UART 9600 Бит/сек номер канала 001 мощность передатчика +20 дБм режим передачи данных FU3 |
Описание | Команда установки параметров порта UART | |
Формат | AT+U<параметр1><параметр2><параметр3> | |
Параметр | <параметр1>: 8 – 8 бит данных, 9 – 9 бит данных <параметр2>: N – без бита четности, E – с битом проверки на четность, O – с битом проверки на нечетность <параметр3>: 1 – 1 стоп бит, 2 – 2 стоп бита, 3 – 1,5 стоп бита | |
Пример команды | AT+U8O1 | |
Ответ | OK+U8O1 | 8 бит данных, бит проверки на нечетность, один стоповый бит |
Описание | Команда проверки версии программного обеспечения модуля | |
Формат | AT+V | |
Ответ | HC-12_V2.3 | Версия 2.3 |
Описание | Команда перехода в спящий режим | |
Формат | AT+SLEEP | |
Ответ | OK+SLEEP | Спящий режим активирован |
Примечание | После передачи команды, необходимо выйти из командного режима, после чего модуль перейдет в спящий режим, ток потребления составляет 22 мкА. В спящем режиме модуль не реагирует на данные передаваемые по UART. Для выхода из спящего режима, необходимо заново войти в командный режим. |
Описание | Команда возврата к заводским настройкам | |
Формат | AT+DEFAULT | |
Ответ | OK+DEFAULT | заводские настройки восстановлены |
Примечание | Заводские настройки: скорость порта UART 9600 Бит/сек, номер канала 001, режим передачи данных FU3, мощность передатчика +20 дБм |
Все настройки модуля сохраняются в энергонезависимой памяти, и не сбиваются при отключении питания.
Подключение модуля HC-12 к микроконтроллеру
Для тестирования я использовал микроконтроллеры PIC16F628A, из-за наличия аппаратного USART модуля, что упрощает подключение радиомодулей HC-12. Схема подключения представлена ниже:
В схеме передатчика с помощью двух кнопок (SB1, SB2) можно управлять двумя каналами на приемнике, к которым подключены светодиоды HL3 (1 канал) и HL2 (2 канал). Я реализовал обратную связь между передатчиком и приемником, при получении команды включения/выключения приемник активирует соответствующий канал и передает сигнал подтверждения, передатчик принимает сигнал и включает двухцветный светодиод HL2, зеленый цвет – канал включен, красный – выключен. Таким образом, модули HC-12 построенные на трансивере Si4463 предоставляют возможность контроля состояния каналов при отсутствии прямого обзора.
В программы микроконтроллеров заложены функции настройки и автоматического соединения с радиомодулями по UART интерфейсу, то есть сначала микроконтроллер перебирает значения скорости порта UART в пределах 1200-19200 кБит/сек, пока не получит правильный ответ от модуля. Если скорость порта радиомодуля выше 19200 кБит/сек, то микроконтроллер не сможет установить соединение, так как USART модуль микроконтроллера не поддерживает высокие скорости при тактовой частоте 4 МГц.
После определения скорости выполняется настройка параметров модуля. Настройки зависят от выбранного режима передачи данных, который необходимо предварительно запрограммировать в EEPROM микроконтроллера. В ячейку EEPROM с адресом 0x00 необходимо записать число от 1 до 4, что соответствует режимам FU1-FU4, если в ячейку ничего не записано, по умолчанию будет выбран режим FU3.
Настройки режимов в основном отличаются скоростью порта UART, но два параметра одинаковы и задаются для всех режимов, это номер канала – 001, и мощность передатчика +20 дБм. Для режима FU3 задается скорость 2400 кБит/сек, чтобы обеспечить наибольшую дальность связи. Для режима FU4 доступна лишь одна скорость: 1200 кБит/сек, для остальных режимов 4800 кБит/сек.
Микроконтроллер записывает настройки в модуль HC-12 при включении (после подачи питания), успешная настройка подтверждается однократным миганием светодиода HL1 в течение одной секунды, данное оповещение имеется у обоих устройств (передатчик/приемник). Если в процессе настройки произошла ошибка, либо нет соединения с модулем, то светодиод HL1 начнет непрерывно мигать, и на этом программа зациклится.
В целях энергосбережения микроконтроллер в передатчике переходит в спящий режим, если в течение определенного времени не будут нажаты кнопки SB1, SB2. Для режимов FU1, FU3 время ожидания для перехода в “сон” составляет 1,5 секунды, для FU2 – 3 секунды, FU4 – 5 секунд. Перед уходом в “сон” все светодиоды гаснут, радиомодуль переводится в спящий режим, общий ток потребления устройства снижается до 26 мкА. В микроконтроллере включены прерывания по изменению уровня на входах RB4-RB7, к которым подключены кнопки, незадействованная линия RB7 настроена на выход с низким логическим уровнем, в целях устранения ложного “пробуждения” микроконтроллера, так как индивидуальная настройка прерываний для каждой линии отсутствует.
В схеме приемника переключателями SA1, SA2 можно задать режим работы соответствующего канала. В разомкнутом состоянии действует режим чередования, то есть, каждое нажатие кнопки на передатчике вызывает поочередное включение/выключение канала. Замкнутое состояние переключателей активирует режим повторения, канал включен, пока нажата кнопка на передатчике.
Примечание из даташита: если модуль продолжительное время работает в режиме передатчика при напряжении питания более 4,5В, то в разрыв цепи питания необходимо установить диод, в целях снижения перегрузки стабилизатора напряжения на плате модуля.
Программы передатчика и приемника (неполный код) представлены ниже:
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 | ;Программа передатчика #include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F10' errorlevel -302 ; suppress message 302 from list file Sec equ 0020h ;перечисление регистров общего назначения Sec0 equ 0021h Sec1 equ 0022h ;присвоение названий адресам регистров shet_t1 equ 0023h ;счетчик временной задержки tmr1 tmp_byte equ 0024h ;счетчик принятых байт var_tab equ 0025h ;вспомогательный регистр приема/передачи сообщений UART nomer equ 0026h ;вспомогательный регистр чтения из таблицы данных regim equ 0027h ;регистр хранения режима приемопередатчика data_rx equ 0061h ;регистры приемо-передачи данных по UART (используется косвенная аддресация) ;всего 15 регистров до адреса 0070h tmp_reg equ 007Ah ; flag equ 007Bh ; FSR_temp equ 007Ch ;регистры для временного хранения значений FSR_prer equ 007Dh ;во время прерываний W_temp equ 007Eh ; STATUS_temp equ 007Fh ; #DEFINE set_hc12 PORTB,0 ;линия set модуля hc-12 #DEFINE knp_1 PORTB,4 ;кнопка 1 #DEFINE knp_2 PORTB,5 ;кнопка 2 #DEFINE led_grn PORTA,1 ;светодиод зеленый #DEFINE led_red PORTA,0 ;светодиод красный #DEFINE led PORTB,6 ;светодиод ;flag,0 - флаг получения сообщения по UART ;flag,1 - флаг синхронизации при получении сообщения по UART, для определения правильного пакета данных ;flag,2 - флаг окончания временной задержки ;flag,3 - вспомогательный флаг для передачи сообщения из таблицы по UART ;flag,4 - флаг совпадения принятого сообщения с таблицой данных ;flag,5 - флаг успешного соединения с модулем по UART ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Частота тактового генератора 4 МГц, машинный цикл 1 мкс org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h movwf W_temp ;сохранение регистров STATUS и W swapf STATUS,W movwf STATUS_temp clrf STATUS btfsc PIR1,RCIF ;опрос флага прерывания приемника UART goto priem_uart btfsc PIR1,TMR1IF goto prov_tmr1 goto exxit_1 priem_uart movf FSR,W ;сохранение значения регистра FSR, и восстановление movwf FSR_temp ;ранее сохраненного значения в предыдущей обработке movf FSR_prer,W ;запись содержимого регистра FSR_prer в movwf FSR ;регистр FSR movf RCREG,W ;считывание байта полученного по USART и movwf INDF ;сохранение в регистре INDF btfss set_hc12 ;опрос линии ввода команд приемопередатчика goto otvet ; линия = 0 прием ответа от приемопередатчика xorlw .64 ;проверка первого корректного байта btfss STATUS,Z goto rx_5 ;байт не соответствует первому в пакете данных btfsc flag,1 ;проверка флага разрешения приема последующих байтов goto rx_4 ;для корректного приема одинаковых байтов movlw .3 ;установка счетчика принятия байтов после первого корректного байта movwf tmp_byte bsf flag,1 ;установка флага разрешения записи последующих байтов после первого корректного goto rx_4 rx_5 btfss flag,1 ;проверка флага разрешения приема последующих байтов goto exxit rx_4 incf FSR,F decfsz tmp_byte,F ;декремент счетчика байтов пакета данных goto exxit movlw data_rx movwf FSR bcf flag,1 ;сброс флага разрешения записи последующих байтов после первого корректного bsf flag,0 ;установка флага получения пакета данных фиксированной длины goto exxit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; otvet xorlw 0x0A ;поиск конца ответа btfss STATUS,Z goto otv_1 bsf flag,0 ;установка флага получения ответа bcf flag,1 ;сброс флага разрешения записи последующих байтов после первого корректного movlw data_rx movwf FSR goto exxit otv_1 incf FSR,F movlw data_rx ;проверка на переполнение буфера приема данных addlw .15 movwf tmp_byte movf FSR,W subwf tmp_byte,W btfsc STATUS,C goto exxit movlw data_rx movwf FSR exxit movf FSR,W ;запись содержимого регистра FSR в movwf FSR_prer ;регистр FSR_prer movf FSR_temp,W ;запись содержимого регистра FSR_osn в movwf FSR ;регистр FSR goto exxit_1 prov_tmr1 decfsz shet_t1,F goto t_1 bsf flag,2 ;установка флага окончания задержки bcf T1CON,TMR1ON ;выключение TMR1 clrf TMR1L clrf TMR1H t_1 bcf PIR1,TMR1IF ;сброс флага прерывания tmr1 exxit_1 swapf STATUS_temp,W ;восстановление регистров STATUS и W movwf STATUS swapf W_temp,F swapf W_temp,W retfie ;выход из подпрограммы прерывания ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b'00000001' movwf PORTB ;очистка выходных защелок портов A и B clrf PORTA ; movlw b'00000111' ;выключение компараторов movwf CMCON bsf STATUS,RP0 ;выбрать 1-й банк movlw b'00111111' ;настройка линий ввода\вывода порта B movwf TRISB ;RB0-RB5 - на вход, остальные на выход movlw b'11111100' ;настройка линий ввода\вывода порта A movwf TRISA ;RA0-RA2 - на выход, остальные на вход movlw .25 ;скорость UART 9600 бит/сек (4 МГц) movwf SPBRG ; ; movlw b'00100100' ;настройка модуля USART: выбор асинхронного movwf TXSTA ;высокоскоростного режима USART, ;настройка модуля передатчика USART: 8-ми битная ;передача, разрешение передачи bcf STATUS,RP0 ;выбрать 0-й банк movlw b'10010000' ;настройка модуля USART: включение модуля USART movwf RCSTA ;настройка модуля приемника USART: 8-ми битный ;прием, разрешение приема movlw b'00100000' ;предд. TMR1 1:4, внутренн источник movwf T1CON bcf PIR1,TMR1IF ;сброс флага прерывания tmr1 movlw data_rx movwf FSR_prer clrf flag ;очистка регистра flag bsf STATUS,RP0 ;считывание режима из EEPROM movlw 0x00 movwf EEADR bsf EECON1,RD movf EEDATA,W bcf STATUS,RP0 movwf regim movf RCREG,W ;считывание регистра RCREG movf RCREG,W ;считывание регистра RCREG bsf STATUS,RP0 ;выбрать 1-й банк bsf PIE1,RCIE ;разрешение прерываний от приемника USART bsf PIE1,TMR1IE ;разрешение прерываний таймера TMR1 bcf STATUS,RP0 ;выбрать 0-й банк bsf INTCON,PEIE ;разрешение прерывания периферийных модулей bsf INTCON,GIE ;глобальное разрешение прерываний call zap_regim ;вызов подпрограммы установки параметров модуля HC-12 son call enter_slp ;вызов подпрограммы перевода модуля HC-12 в спящий режим son_1 bcf led_red ; bcf led_grn ; bcf INTCON,GIE ;запрет глобальных прерываний bcf INTCON,RBIF ;сброс флага прерываний по входу RB4-RB7 bsf INTCON,RBIE ;разрешение прерываний по входу RB4-RB7 SLEEP bcf INTCON,RBIE ;запрет прерываний по входу RB4-RB7 bsf INTCON,GIE ;глобальное разрешение прерываний met_2 btfsc knp_1 ;опрос кнопки knp_1 goto met_1 ; movlw .1 ;сохранение номера нажатой кнопки в регистр tmp_reg movwf tmp_reg goto met_4 met_1 btfss knp_2 ;опрос кнопки knp_2 goto met_3 call paus_50 ;кнопки не нажаты, вызов паузы 50 мс goto son_1 ;переход в на метку son_1 met_3 movlw .2 ;сохранение номера нажатой кнопки в регистр tmp_reg movwf tmp_reg met_4 call exit_slp ;вызов подпрограммы пробуждения модуля HC-12 movlw .1 ;определение номера нажатой кнопки xorwf tmp_reg,W btfss STATUS,Z goto met_5 call send_knp1 ;вызов подпрограммы передачи кода кнопки knp1 goto met_10 met_5 call send_knp2 ;вызов подпрограммы передачи кода кнопки knp2 goto met_10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; met_6 movlw .4 ;проверка режима считанного из EEPROM xorwf regim,W btfss STATUS,Z goto met_6a ;режим не равен 4 (FU4), переход на метку met_6a movlw .20 ;режим равен 4 (FU4), запуск временной задержки 5 сек call pusk_tmr1 goto met_7 met_6a movlw .2 ;проверка режима считанного из EEPROM xorwf regim,W btfss STATUS,Z goto umen_paus ;режим не равен 2 (FU2), переход на метку umen_paus movlw .12 ;режим равен 2 (FU2), запуск временной задержки 3 сек call pusk_tmr1 goto met_7 umen_paus movlw .6 ;запуск временной задержки 1,5 сек call pusk_tmr1 met_7 btfsc knp_1 goto met_8 call send_knp1 ;вызов подпрограммы передачи кода кнопки knp1 btfsc knp_2 goto met_10 call send_knp2 ;вызов подпрограммы передачи кода кнопки knp2 goto met_10 met_8 btfsc knp_2 goto met_9 call send_knp2 ;вызов подпрограммы передачи кода кнопки knp2 btfsc knp_1 goto met_10 call send_knp1 ;вызов подпрограммы передачи кода кнопки knp1 goto met_10 met_9 btfsc flag,0 ;проверка флага получения ответа call prov_otvet ;флаг=1, принят ответ, вызов подпрограммы проверки btfss flag,2 ;проверка флага окончания временной задержки goto met_7 goto son met_10 movlw .1 ;запуск временной задержки 0,25 сек call pusk_tmr1 met_11 btfsc flag,0 ;проверка флага получения ответа call prov_otvet ;флаг=1, принят ответ, вызов подпрограммы проверки btfss flag,2 ;проверка флага окончания временной задержки goto met_11 goto met_6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prov_otvet bcf flag,0 ;сброс флага получения сообщения по UART movlw data_rx ;загрузка начального адреса ответного сообщения movwf FSR movlw .64 ;проверка на совпадение с числом 64 (ascii вариант - @) xorwf INDF,W btfss STATUS,Z return incf FSR,F movlw .79 ;проверка на совпадение с числом 79 (ascii вариант - O) xorwf INDF,W btfss STATUS,Z return incf FSR,F movlw .78 ;проверка на совпадение с числом 78 (ascii вариант - N) xorwf INDF,W btfss STATUS,Z goto prv_otv1 bcf led_red ;ответ совпал с кодом (ascii вариант - @ON), выключаем красный светодиод bsf led_grn ;включаем зеленый светодиод return prv_otv1 movlw .70 ;проверка на совпадение с числом 70 (ascii вариант - F) xorwf INDF,W btfss STATUS,Z return bcf led_grn ;ответ совпал с кодом (ascii вариант - @OF), выключаем зеленый светодиод bsf led_red ;включаем красный светодиод return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; send_knp1 movlw .64 ;передача кода кнопки knp1 по UART (ascii вариант - @01) call send_byte movlw .48 call send_byte movlw .49 call send_byte return send_knp2 movlw .64 ;передача кода кнопки knp2 по UART (ascii вариант - @02) call send_byte movlw .48 call send_byte movlw .50 call send_byte return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; zap_regim call set_at ;вызов подпрограммы входа в командный режим bcf flag,0 ;сброс флага получения сообщения по UART call kont_hc12 ;вызов подпрограммы установки соединения с модулем HC-12 btfsc flag,5 ;опрос флага соединения с модулем hc-12 goto fu3_rgm0 ; call kont_hc12 ;вызов подпрограммы установки соединения с модулем HC-12 btfss flag,5 ;опрос флага соединения с модулем hc-12 goto err_hc12 ;ошибка соединения, переход на метку error fu3_rgm0 movlw .3 ;проверка режима считанного из EEPROM xorwf regim,W btfss STATUS,Z goto fu4_rgm0 ;режим не равен 3 (FU3), переход на метку fu4_rgm0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;режим равен 3 (FU3), настройка режима fu3_rgm1 movlw .103 ;запись числа для генератора скорости UART (скорость 2400 Кбит/сек) movwf tmp_reg movlw .26 ;посылка команды AT+FU3 call message movlw .1 ;запуск временной задержки 0,25 сек call pusk_tmr1 fu3_a2 btfsc flag,0 ;проверка флага получения ответа goto fu3_a1 ;флаг=1 переход на метку fu3_a1 btfss flag,2 ;проверка флага окончания временной задержки goto fu3_a2 ;флаг=0, переход на метку fu3_a2 goto err_hc12 ;флаг=1, истекло время ожидания, переход на метку error fu3_a1 bcf flag,0 ;сброс флага получения сообщения по UART movlw .26 ;проверка полученного сообщения на совпадение с "OK+FU3" call sravn_otv btfss flag,4 ;опрос флага совпадения goto err_hc12 ;флаг=0, нет совпадения, переход на метку error fu3_rgm2 movlw .49 ;посылка команды AT+B2400, скорость 2400 Кбит/сек call message movlw .1 ;запуск временной задержки 0,25 сек call pusk_tmr1 fu3_b2 btfsc flag,0 ;проверка флага получения ответа goto fu3_b1 ;флаг=1 переход на метку fu3_b1 btfss flag,2 ;проверка флага окончания временной задержки goto fu3_b2 ;флаг=0, переход на метку fu3_b2 goto err_hc12 ;флаг=1, истекло время ожидания, переход на метку error fu3_b1 bcf flag,0 ;сброс флага получения сообщения по UART movlw .49 ;проверка полученного сообщения на совпадение с "OK+B2400" call sravn_otv btfss flag,4 ;опрос флага совпадения goto err_hc12 ;флаг=0, нет совпадения, переход на метку error goto fu_rgm0 ................... ................... ................... ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; kont_hc12 bsf STATUS,RP0 movlw .25 ;скорость UART 9600 бит/сек (4 МГц) movwf SPBRG ; bcf STATUS,RP0 call test_mess ;вызов подпрограммы передачи/получения тестовых сообщений по UART btfsc flag,5 ;опрос флага соединения с модулем hc-12 return ;соединение с модулем установлено, выход из подпрограммы bsf STATUS,RP0 movlw .12 ;скорость UART 19200 бит/сек (4 МГц) movwf SPBRG ; bcf STATUS,RP0 call test_mess ;вызов подпрограммы передачи/получения тестовых сообщений по UART btfsc flag,5 ;опрос флага соединения с модулем hc-12 return ;соединение с модулем установлено, выход из подпрограммы bsf STATUS,RP0 movlw .51 ;скорость UART 4800 бит/сек (4 МГц) movwf SPBRG ; bcf STATUS,RP0 call test_mess ;вызов подпрограммы передачи/получения тестовых сообщений по UART btfsc flag,5 ;опрос флага соединения с модулем hc-12 return ;соединение с модулем установлено, выход из подпрограммы bsf STATUS,RP0 movlw .103 ;скорость UART 2400 бит/сек (4 МГц) movwf SPBRG ; bcf STATUS,RP0 call test_mess ;вызов подпрограммы передачи/получения тестовых сообщений по UART btfsc flag,5 ;опрос флага соединения с модулем hc-12 return ;соединение с модулем установлено, выход из подпрограммы bsf STATUS,RP0 movlw .207 ;скорость UART 1200 бит/сек (4 МГц) movwf SPBRG ; bcf STATUS,RP0 call test_mess ;вызов подпрограммы передачи/получения тестовых сообщений по UART return ;соединение с модулем установлено, выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; test_mess movlw data_rx movwf FSR_prer test_m bcf flag,5 ;сброс флага соединения с модулем hc-12 movlw .0 ;посылка команды AT call message movlw .1 ;запуск временной задержки 0,25 сек call pusk_tmr1 tst_mes2 btfss flag,0 ;проверка флага получения ответа goto tst_mes1 ;флаг=0 переход на метку tst_mes1 bcf flag,0 ;флаг=1, сообщение получено movlw .0 ;проверка полученного сообщения на совпадение с "OK" call sravn_otv btfsc flag,4 ;опрос флага совпадения bsf flag,5 ;флаг=1, сообщение совпало с "OK", установка флага соединения с модулем hc-12 return ;флаг=0, сообщение не совпало, возврат из подпрограммы tst_mes1 btfss flag,2 ;проверка флага окончания временной задержки goto tst_mes2 ;флаг=0, переход на метку tst_mes2 return ;флаг=1, временная задержка истекла, возврат из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; exit_slp call set_at ;вызов подпрограммы входа в командный режим bcf flag,0 ;сброс флага получения ответа call test_mess ;посылка тестового сообщения AT btfss flag,5 ;опрос флага соединения с модулем hc-12 goto err1_hc12 ;ошибка соединения, переход на метку err1_hc12 call exit_at ;вызов подпрограммы выхода из командного режима return err1_hc12 bsf led ;ошибка соединения, медленное мигание светодиодом call paus_200 call paus_200 call paus_200 call paus_200 bcf led call paus_200 call paus_200 call paus_200 call paus_200 goto err1_hc12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; enter_slp call set_at ;вызов подпрограммы входа в командный режим bcf flag,0 ;сброс флага получения ответа movlw data_rx ;установка начального адреса для приема ответа movwf FSR_prer movlw .3 ;посылка команды AT+SLEEP call message movlw .1 ;запуск временной задержки 0,25 сек call pusk_tmr1 ent_a2 btfsc flag,0 ;проверка флага получения ответа goto ent_a1 ;флаг=1 переход на метку ent_a1 btfss flag,2 ;проверка флага окончания временной задержки goto ent_a2 ;флаг=0, переход на метку ent_a2 goto err1_hc12 ;флаг=1, истекло время ожидания, переход на метку error ent_a1 bcf flag,0 ;сброс флага получения сообщения по UART movlw .3 ;проверка полученного сообщения на совпадение с "OK+SLEEP" call sravn_otv btfss flag,4 ;опрос флага совпадения goto err1_hc12 ;флаг=0, нет совпадения, переход на метку error call exit_at ;вызов подпрограммы выхода из командного режима return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;вход в командный режим set_at bcf set_hc12 ;переключение приемопередатчика в командный режим bsf STATUS,RP0 ;выбрать 1-й банк bcf TRISB,0 bcf STATUS,RP0 ;выбрать 0-й банк call paus_50 ;пауза 50 мс return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;выход из командного режима exit_at bsf STATUS,RP0 ;выбрать 1-й банк bsf TRISB,0 bcf STATUS,RP0 ;выбрать 0-й банк bsf set_hc12 ;переключение приемопередатчика в режим передачи данных по радиоканалу call paus_100 ;пауза 100 мс return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pusk_tmr1 movwf shet_t1 ;загрузка значения задержки bcf T1CON,TMR1ON ;выключение TMR1 bcf flag,2 ;сброс флага окоончания задержки clrf TMR1L clrf TMR1H bcf PIR1,TMR1IF ;сброс флага прерыва tmr1 bsf T1CON,TMR1ON ;включение TMR1 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма передачи байта по USART send_byte movwf TXREG ;запись байта для передачи по UART bsf STATUS,RP0 ; snd_b1 btfss TXSTA,TRMT ;опрос бита TRMT на факт окончания передачи goto snd_b1 ;по USART bcf STATUS,RP0 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма отправки символов из таблицы данных по USART message movwf nomer ;загрузка идентификатора AT сообщения bcf flag,3 mess_3 call table ;вызов подпрограммы таблицы данных movwf var_tab xorlw 0x0D btfss STATUS,Z goto mess_2 bsf flag,3 ;установить флаг наличия символа 0x0D mess_2 movf var_tab,W movwf TXREG ;запись символа полученного из таблицы данных bsf STATUS,RP0 ;в регистр передатчика USART mess_1 btfss TXSTA,TRMT ;опрос бита TRMT на факт окончания передачи goto mess_1 ;по USART bcf STATUS,RP0 btfsc flag,3 return incf nomer,F ;инкремент регистра nomer (счетчик символов) goto mess_3 ;для получения следующего символа из таблицы ;данных table movlw high tab ;подпрограмма извлечения символов из таблицы movwf PCLATH ;данных movf nomer,W ; addlw low tab ; btfsc STATUS,C ; incf PCLATH,F ; movf nomer,W ; addwf PCL,F ; tab dt 'A', 'T', 0x0D; ;0 таблица данных с символами dt 'A', 'T', '+', 'S', 'L', 'E', 'E', 'P', 0x0D; ;3 dt 'A', 'T', '+', 'F', 'U', '1', 0x0D; ;12 dt 'A', 'T', '+', 'F', 'U', '2', 0x0D; ;19 dt 'A', 'T', '+', 'F', 'U', '3', 0x0D; ;26 dt 'A', 'T', '+', 'F', 'U', '4', 0x0D; ;33 dt 'A', 'T', '+', 'B', '1', '2', '0', '0', 0x0D; ;40 dt 'A', 'T', '+', 'B', '2', '4', '0', '0', 0x0D; ;49 dt 'A', 'T', '+', 'B', '4', '8', '0', '0', 0x0D; ;58 dt 'A', 'T', '+', 'B', '9', '6', '0', '0', 0x0D; ;67 dt 'A', 'T', '+', 'B', '1', '9', '2', '0', '0', 0x0D; ;76 dt 'A', 'T', '+', 'P', '8', 0x0D; ;86 dt 'A', 'T', '+', 'C', '0', '0', '1', 0x0D; ;92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма сравнения сообщений полученных по USART с символами в таблице sravn_otv movwf nomer bcf flag,4 ;сброс флага совпадения ответа movlw data_rx ;загрузка начального адреса ответного сообщения movwf FSR srav_2 call table1 ;вызов подпрограммы таблицы данных movwf var_tab xorlw 0x0A btfss STATUS,Z goto srav_1 bsf flag,4 ;установка флага совпадения ответа return srav_1 movf var_tab,W xorwf INDF,W btfsc STATUS,Z goto srav_3 return ;нет совпадения, выход srav_3 incf FSR,F incf nomer,F goto srav_2 table1 movlw high tab1 ;подпрограмма извлечения символов из таблицы movwf PCLATH ;данных movf nomer,W ; addlw low tab1 ; btfsc STATUS,C ; incf PCLATH,F ; movf nomer,W ; addwf PCL,F ; tab1 dt 'O', 'K', 0x0A; ;0 dt 'O', 'K', '+', 'S', 'L', 'E', 'E', 'P', 0x0A; ;3 dt 'O', 'K', '+', 'F', 'U', '1', 0x0A; ;12 dt 'O', 'K', '+', 'F', 'U', '2', 0x0A; ;19 dt 'O', 'K', '+', 'F', 'U', '3', 0x0A; ;26 dt 'O', 'K', '+', 'F', 'U', '4', 0x0A; ;33 dt 'O', 'K', '+', 'B', '1', '2', '0', '0', 0x0A; ;40 dt 'O', 'K', '+', 'B', '2', '4', '0', '0', 0x0A; ;49 dt 'O', 'K', '+', 'B', '4', '8', '0', '0', 0x0A; ;58 dt 'O', 'K', '+', 'B', '9', '6', '0', '0', 0x0A; ;67 dt 'O', 'K', '+', 'B', '1', '9', '2', '0', '0', 0x0A; ;76 dt 'O', 'K', '+', 'P', '8', 0x0A; ;86 dt 'O', 'K', '+', 'C', '0', '0', '1', 0x0A; ;92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
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 | ;Программа приемника #include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F10' errorlevel -302 ; suppress message 302 from list file Sec equ 0020h ;перечисление регистров общего назначения Sec0 equ 0021h Sec1 equ 0022h ;присвоение названий адресам регистров shet_t1 equ 0023h ;счетчик временной задержки tmr1 tmp_byte equ 0024h ;счетчик принятых байт var_tab equ 0025h ;вспомогательный регистр приема/передачи сообщений UART nomer equ 0026h ;вспомогательный регистр чтения из таблицы данных regim equ 0027h ;регистр хранения режима приемопередатчика kan1_tmp equ 0028h ;счетчик временной задержки 1-го канала kan2_tmp equ 0029h ;счетчик временной задержки 2-го канала data_rx equ 0061h ;регистры приемо-передачи данных по UART (используется косвенная аддресация) ;всего 15 регистров до адреса 0070h tmp_reg equ 0079h ; flag1 equ 007Ah ; flag equ 007Bh ; FSR_temp equ 007Ch ;регистры для временного хранения значений FSR_prer equ 007Dh ;во время прерываний W_temp equ 007Eh ; STATUS_temp equ 007Fh ; #DEFINE set_hc12 PORTB,0 ;линия set модуля hc-12 #DEFINE kan1_led PORTB,4 ;выход 1-го канала #DEFINE kan2_led PORTB,5 ;выход 2-го канала #DEFINE reg_kan1 PORTA,2 ;вход выбора режима работы 1-го канала #DEFINE reg_kan2 PORTA,3 ;вход выбора режима работы 2-го канала #DEFINE led PORTB,6 ;светодиод ;flag,0 - флаг получения сообщения по UART ;flag,1 - флаг синхронизации при получении сообщения по UART, для определения правильного пакета данных ;flag,2 - флаг окончания временной задержки ;flag,3 - вспомогательный флаг для передачи сообщения из таблицы по UART ;flag,4 - флаг совпадения принятого сообщения с таблицой данных ;flag,5 - флаг успешного соединения с модулем по UART ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Частота тактового генератора 4 МГц, машинный цикл 1 мкс org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h movwf W_temp ;сохранение регистров STATUS и W swapf STATUS,W movwf STATUS_temp clrf STATUS btfsc PIR1,RCIF ;опрос флага прерывания приемника UART goto priem_uart btfsc PIR1,TMR1IF goto prov_tmr1 btfsc INTCON,T0IF goto prov_tmr0 goto exxit_1 priem_uart movf FSR,W ;сохранение значения регистра FSR, и восстановление movwf FSR_temp ;ранее сохраненного значения в предыдущей обработке movf FSR_prer,W ;запись содержимого регистра FSR_prer в movwf FSR ;регистр FSR movf RCREG,W ;считывание байта полученного по USART и movwf INDF ;сохранение в регистре INDF btfss set_hc12 ;опрос линии ввода команд приемопередатчика goto otvet ; линия = 0 прием ответа от приемопередатчика xorlw .64 ;проверка первого корректного байта btfss STATUS,Z goto rx_5 ;байт не соответствует первому в пакете данных btfsc flag,1 ;проверка флага разрешения приема последующих байтов goto rx_4 ;для корректного приема одинаковых байтов movlw .3 ;установка счетчика принятия байтов после первого корректного байта movwf tmp_byte bsf flag,1 ;установка флага разрешения записи последующих байтов после первого корректного goto rx_4 rx_5 btfss flag,1 ;проверка флага разрешения приема последующих байтов goto exxit rx_4 incf FSR,F decfsz tmp_byte,F ;декремент счетчика байтов пакета данных goto exxit movlw data_rx movwf FSR bcf flag,1 ;сброс флага разрешения записи последующих байтов после первого корректного bsf flag,0 ;установка флага получения пакета данных фиксированной длины goto exxit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; otvet xorlw 0x0A ;поиск конца ответа btfss STATUS,Z goto otv_1 bsf flag,0 ;установка флага получения ответа bcf flag,1 ;сброс флага разрешения записи последующих байтов после первого корректного movlw data_rx movwf FSR goto exxit otv_1 incf FSR,F movlw data_rx ;проверка на переполнение буфера приема данных addlw .15 movwf tmp_byte movf FSR,W subwf tmp_byte,W btfsc STATUS,C goto exxit movlw data_rx movwf FSR exxit movf FSR,W ;запись содержимого регистра FSR в movwf FSR_prer ;регистр FSR_prer movf FSR_temp,W ;запись содержимого регистра FSR_osn в movwf FSR ;регистр FSR goto exxit_1 prov_tmr1 decfsz shet_t1,F goto t_1 bsf flag,2 ;установка флага окончания задержки bcf T1CON,TMR1ON ;выключение TMR1 clrf TMR1L clrf TMR1H t_1 bcf PIR1,TMR1IF ;сброс флага прерывания tmr1 goto exxit_1 prov_tmr0 btfss flag1,2 goto t0_1 decfsz kan1_tmp,F goto t0_1 bcf flag1,2 bcf kan1_led ; выключаем 1-й канал bcf flag1,0 ;сброс флага поочередности 1-го канала bsf flag1,4 ;установка флага выключения канала t0_1 btfss flag1,3 goto t0_2 decfsz kan2_tmp,F goto t0_2 bcf flag1,3 bcf kan2_led ; выключаем 2-й канал bcf flag1,1 ;сброс флага поочередности 2-го канала bsf flag1,4 ;установка флага выключения канала t0_2 bcf INTCON,T0IF ;сброс флага прерывания TMR0 exxit_1 swapf STATUS_temp,W ;восстановление регистров STATUS и W movwf STATUS swapf W_temp,F swapf W_temp,W retfie ;выход из подпрограммы прерывания ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b'00000001' movwf PORTB ;очистка выходных защелок портов A и B clrf PORTA ; movlw b'00000111' ;выключение компараторов movwf CMCON bsf STATUS,RP0 ;выбрать 1-й банк movlw b'10001111' ;настройка линий ввода\вывода порта B movwf TRISB ;RB4-RB6 - на выход, остальные на вход movlw b'11111111' ;настройка линий ввода\вывода порта A movwf TRISA ;все лини на вход movlw .25 ;скорость UART 9600 бит/сек (4 МГц) movwf SPBRG ; ; movlw b'00100100' ;настройка модуля USART: выбор асинхронного movwf TXSTA ;высокоскоростного режима USART, ;настройка модуля передатчика USART: 8-ми битная ;передача, разрешение передачи movlw b'10000100' ;коэффициент предделителя TMR0 1:32, внутрен. movwf OPTION_REG ;тактовый сигнал bcf STATUS,RP0 ;выбрать 0-й банк movlw b'10010000' ;настройка модуля USART: включение модуля USART movwf RCSTA ;настройка модуля приемника USART: 8-ми битный ;прием, разрешение приема movlw b'00100000' ;предд. TMR1 1:4, внутренн источник movwf T1CON bcf PIR1,TMR1IF ;сброс флага прерывания tmr1 movlw data_rx movwf FSR_prer clrf flag ;очистка регистра flag clrf flag1 ;очистка регистра flag bsf STATUS,RP0 ;считывание режима из EEPROM movlw 0x00 movwf EEADR bsf EECON1,RD movf EEDATA,W bcf STATUS,RP0 movwf regim movf RCREG,W ;считывание регистра RCREG movf RCREG,W ;считывание регистра RCREG bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 bsf STATUS,RP0 ;выбрать 1-й банк bsf PIE1,RCIE ;разрешение прерываний от приемника USART bsf PIE1,TMR1IE ;разрешение прерываний таймера TMR1 bcf STATUS,RP0 ;выбрать 0-й банк bsf INTCON,PEIE ;разрешение прерывания периферийных модулей bsf INTCON,GIE ;глобальное разрешение прерываний call zap_regim ;вызов подпрограммы установки параметров модуля HC-12 met_1 btfss flag,0 ;опрос флага получения команды по радиоканалу goto met_2 call prov_otvet met_2 btfss flag1,4 ;опрос флага выключения канала goto met_1 ; bcf flag1,4 ;канал выключен, сброс флага call potv_off ;вызов подпрограммы передачи по радиоканалу потверждения ВЫКЛючения канала goto met_1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prov_otvet bcf flag,0 ;сброс флага получения сообщения по UART movlw data_rx ;загрузка начального адреса ответного сообщения movwf FSR movlw .64 ;проверка на совпадение с числом 64 (ascii вариант - @) xorwf INDF,W btfss STATUS,Z return incf FSR,F movlw .48 ;проверка на совпадение с числом 48 (ascii вариант - 0) xorwf INDF,W btfss STATUS,Z return incf FSR,F movlw .49 ;проверка на совпадение с числом 49 (ascii вариант - 1) xorwf INDF,W btfss STATUS,Z goto prv_otv1 ;получена команда активации 1-го канала (ascii вариант - @01) btfsc reg_kan1 ;опрос режима 1-го канала goto prv_otv4 bsf kan1_led ;включаем 1-й канал bsf flag1,0 ;установка флага поочередности 1-го канала movlw .37 ;запись значения временной задержки включения 1-го канала (303 мс) movwf kan1_tmp bsf flag1,2 ;установка флага запуска отчета временной задержки 1-го канала call potv_on ;вызов подпрограммы передачи по радиоканалу потверждения ВКЛючения канала return prv_otv4 btfsc flag1,0 ;режим поочередного включения канала, проверка предыдущего состояния goto prv_otv2 bsf kan1_led ;предыдущее состояние канала 0, включаем 1-й канал bsf flag1,0 ;установка флага поочередности 1-го канала call potv_on ;вызов подпрограммы передачи по радиоканалу потверждения ВКЛючения канала return prv_otv2 bcf kan1_led ;предыдущее состояние канала 1, выключаем 1-й канал bcf flag1,0 ;сброс флага поочередности 1-го канала call potv_off ;вызов подпрограммы передачи по радиоканалу потверждения ВЫКЛючения канала return prv_otv1 movlw .50 ;проверка на совпадение с числом 50 (ascii вариант - 2) xorwf INDF,W btfss STATUS,Z return ;получена команда активации 2-го канала (ascii вариант - @02) btfsc reg_kan2 ;опрос режима 2-го канала goto prv_otv5 bsf kan2_led ;включаем 1-й канал bsf flag1,1 ;установка флага поочередности 2-го канала movlw .37 ;запись значения временной задержки включения 1-го канала (303 мс) movwf kan2_tmp bsf flag1,3 ;установка флага запуска отчета временной задержки 2-го канала call potv_on ;вызов подпрограммы передачи по радиоканалу потверждения ВКЛючения канала return prv_otv5 btfsc flag1,1 ;режим поочередного включения канала, проверка предыдущего состояния goto prv_otv3 bsf kan2_led ;предыдущее состояние канала 0, включаем 2-й канал bsf flag1,1 ;установка флага поочередности 2-го канала call potv_on ;вызов подпрограммы передачи по радиоканалу потверждения ВКЛючения канала return prv_otv3 bcf kan2_led ;предыдущее состояние канала 1, выключаем 2-й канал bcf flag1,1 ;сброс флага поочередности 2-го канала call potv_off ;вызов подпрограммы передачи по радиоканалу потверждения ВЫКЛючения канала return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; potv_on movlw .64 ;передача кода потверждения ВКЛючения канала (ascii вариант - @ON) call send_byte movlw .79 call send_byte movlw .78 call send_byte return potv_off movlw .64 ;передача кода потверждения ВЫКЛючения канала (ascii вариант - @OF) call send_byte movlw .79 call send_byte movlw .70 call send_byte return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; zap_regim call set_at ;вызов подпрограммы входа в командный режим ................. ................. ................. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; kont_hc12 bsf STATUS,RP0 ................. ................. ................. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; test_mess movlw data_rx ................. ................. ................. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;вход в командный режим set_at bcf set_hc12 ;переключение приемопередатчика в командный режим bsf STATUS,RP0 ;выбрать 1-й банк bcf TRISB,0 bcf STATUS,RP0 ;выбрать 0-й банк call paus_50 ;пауза 50 мс return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;выход из командного режима exit_at bsf STATUS,RP0 ;выбрать 1-й банк bsf TRISB,0 bcf STATUS,RP0 ;выбрать 0-й банк bsf set_hc12 ;переключение приемопередатчика в режим передачи данных по радиоканалу call paus_100 ;пауза 100 мс return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pusk_tmr1 movwf shet_t1 ;загрузка значения задержки bcf T1CON,TMR1ON ;выключение TMR1 bcf flag,2 ;сброс флага окоончания задержки clrf TMR1L clrf TMR1H bcf PIR1,TMR1IF ;сброс флага прерыва tmr1 bsf T1CON,TMR1ON ;включение TMR1 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма передачи байта по USART send_byte movwf TXREG ;запись байта для передачи по UART bsf STATUS,RP0 ; snd_b1 btfss TXSTA,TRMT ;опрос бита TRMT на факт окончания передачи goto snd_b1 ;по USART bcf STATUS,RP0 return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма отправки символов из таблицы данных по USART message movwf nomer ;загрузка идентификатора AT сообщения ................. ................. ................. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;подпрограмма сравнения сообщений полученных по USART с символами в таблице sravn_otv movwf nomer ................. ................. ................. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
В программах много общего, так как используются одинаковые подпрограммы автоматической настройки модуля HC-12, а также подпрограммы приема и передачи данных по UART.
Как я и говорил, в микроконтроллере задействован аппаратный USART, прием данных от радиомодуля ведется в подпрограмме обработки прерываний, полученные данные сохраняются в регистры ОЗУ (начиная с регистра data_rx) с помощью косвенной аддресации. В командном режиме (когда на линии микроконтроллера set_hc12 низкий лог. уровень) данные по UART принимаются до получения символа <LF> (0x0A), который является завершающим в сообщении. Далее устанавливается флаг получения ответа от модуля flag,0. Сообщение анализируется с помощью подпрограммы sravn_otv, где происходит сравнение с правильными ответами, которые хранятся в таблице данных tab1.
В прозрачном режиме (когда линия set_hc12 настроена на вход) по UART ведется прием данных, полученных по радиоканалу от другого модуля. Длину пакета данных, которыми обмениваются радиомодули, я установил на уровне 3-х байт (в счетчик tmp_byte записывается число 3), причем первый байт синхронизирующий, его значение всегда равно 64 (ASCII вариант @). Только после приема синхронизирующего байта, разрешается прием остальных двух байт, это сделано на случай потери синхронизации, например, если один или несколько байтов в пакете данных будут утеряны. После приема правильного пакета данных, устанавливается ранее упомянутый флаг flag,0.
AT команды передаются с помощью подпрограммы message, команды хранятся в таблице данных tab. Перед вызовом подпрограммы, в аккумулятор (W) надо записать число: порядковый номер первого символа соответствующей команды в таблице данных, то же самое справедливо и для подпрограммы сравнения ответов sravn_otv.
Подпрограмма настройки режимов zap_regim выполняет автоматическое соединение с радиомодулем, путем перебора скорости UART микроконтроллера в пределах 1200-19200 Бит/сек, при этом проверяется правильный ответ от модуля (OK) на команду AT, после чего определяется режим передачи данных, считанный ранее из EEPROM (ячейка 0x00) в регистр regim. Далее в соответствии с режимом выполняется настройка параметров радиомодуля.
Большинство временных задержек организованы на основе таймера TMR1, в частности кнопки SB1, SB2 опрашиваются не ранее 250 мс с момента последнего нажатия. В программе приемника дополнительно используется таймер TMR0, для организации задержки включенного состояния выходного канала в режиме повторения (канал включен, пока нажата кнопка на передатчике), задержка составляет 300 мс.
Настало время тестирования, и я провел измерение дальности связи модулей HC-12 в условиях городской застройки для различных режимов и условий, результаты объединил в следующую таблицу:
Внешние условия, тип антенны | Режим передачи данных | |||
FU1 | FU2 | FU3 | FU4 | |
Прямая видимость, штыревая антенна | 150 м (450 м) | 150 м (400 м) | 600 м (1 км) | 1 км * |
Прямая видимость, спиральная антенна | 100м (250 м) | 100м (200 м) | 400 м (550 м) | |
Непрямая видимость (среди многоэтажек), штыревая антенна | ~200 м | ~500 м | ||
* Примечание | На расстоянии более 1 км измерения не проводились |
Таблица содержит данные по дальности уверенной связи, а в скобках указано максимальное расстояние, на котором удалось поймать сигнал обратной связи (зона слабого и неуверенного приема). В качестве штыревой антенны использовался медный одножильный проводник длиной 17 см.
Режим FU4 отличается значительной задержкой передачи данных, около 1 сек, то есть для получения ответа от приемника после отправки команды потребуется не менее 2 сек, кроме этого не рекомендуется отправлять пакет данных чаще, чем один раз в 2 сек. Данные особенности не позволяют использовать режим повторения (канал включен пока нажата кнопка на передатчике) для каналов на приемнике, только режим чередования. То же самое относится к режиму FU2 (режим сверхнизкого потребления), где задержка передачи данных составляет 0,5 сек. У меня не было возможности протестировать модули на расстоянии более 1 км, мешала городская застройка, не было прямой видимости, поэтому пока не могу судить о максимальной дальности связи (для режима FU4 заявленная дальность составляет 1,8 км).
В режиме FU2 я заметил особенность, при снижении скорости UART модуля до 1200-2400 Бит/сек, сигнал обратной связи от приемника начинал пропадать, и не достигал передатчика (независимо от расстояния), хотя команда до приемника доходила. На скорости 4800 Бит/сек таких проблем не возникало.
В устройствах (передатчик/приемник) микроконтроллеры работают от внутреннего тактового генератора в 4 МГц, при больших перепадах температуры окружающего воздуха лучше использовать внешний кварцевый резонатор, так как возможен уход рабочей частоты и нарушение функционирования UART интерфейса между модулем и микроконтроллером.
В общем радиомодули HC-12 показали себя очень хорошо, обладают широко распространенным интерфейсом связи UART, достаточно простые настройки, большая дальность связи, возможность реализации обратной связи. До этого я тестировал радиомодули WL101-341 WL102-341, а также комплект XY-MK-5V FS1000A, это простые менее навороченные модули, и значительно дешевле по стоимости.
Заказать модули можно по следующей ссылке HC-12
Прошивка МК и исходник передатчика и приемника
По ссылке ниже представлена модифицированная прошивка, изменена скорость передачи данных для режима FU3 на 4800 Бит/сек.
Модифицированная версия прошивки
Обновление от 24.02.18:
Частота внутреннего генератора микроконтроллера зависит от напряжения питания и температуры окружающей среды, поэтому возможен уход частоты и некорректная работа UART модуля микроконтроллера. Поэтому для большей надежности к микроконтроллеру в передатчике и приемнике можно дополнительно подключить кварцевый резонатор на 4 МГц, схема подключения представлена ниже:
Ниже приведены ссылки на прошивки под кварцевый резонатор:
Прошивка передатчика и приемника под кварцевый резонатор 4МГц
Модифицированная версия под кварцевый резонатор, изменена скорость передачи данных для режима FU3 4800 Бит/сек.
Модифицированная версия под кварцевый резонатор 4МГц
Александр
26 Окт 2017Круто!!!
Мои HC-12 уже три недели едут с Али.Подпрыгиваю от нетерпения.
Буду пробовать.UART по проводу я делал.
Работает без ошибок.
Александр
26 Окт 2017И как бы увеличить скорость передачи данных.
Читай-уменьшить время передачи до минимума?
Пусть в ущерб дальности.
admin
26 Окт 2017Максимальная скорость передачи данных обеспечивается в режиме FU3, при скорости порта UART от 57600 Бит/сек, исходя из таблиц в спецификации минимальное время передачи 4 мс, быстрее никак)
Александр
26 Окт 2017Решаю тему работы пяти трансиверов,объединеных в сеть.
Каждый должен общаться с каждым.Может возникнуть ситуация одновременного включения передатчиков.Но расхронизация может в 0.01 секунды.Никак не могу обойти коллизию.
Может что посоветуете?
admin
26 Окт 2017Если передача данных организована так, что каждый трансивер передает данные регулярно через определенный период времени, то можно установить часы на каждый трансивер, и организовать передачу данных по расписанию. При этом период передачи каждого трансивера будет одинаковым, и смещенным по отношению друг к другу.
Другой вариант, если один трансивер начнет передавать, то все остальные начнут принимать данные, получив первый байт, никто из них не должен будет передавать данные, до тех пор пока пакет данных не будет полностью получен (при фиксированной длине пакета). Но этот вариант полностью не исключает коллизию, а уменьшает вероятность ее появления, так как от начала передачи и до приема 1-го байта проходит некоторое время, в течении которого другой трансивер может начать передачу.
n
9 Окт 2019здравствуйте.
как синхронизировать часы на разных девайсах ?
тоже ситуация когда может быть несколько трансов и все должны общаться.
возможно по ходу работы некоторые могут вырубаться и врубаться, т.е нужно подстроиться под общее расписание. но эта ситуация на дальнейшее
sslobodyan
28 Окт 2017У вас ошибочка в таблице чувствительности в первой колонке. Вместо 5000 должно быть 500.
admin
31 Окт 2017Исправил, спасибо
sslobodyan
28 Окт 2017У меня версия прошивки 2.4. На скоростях выше 2400 в FU3 работает нормально (ожидаемо). А вот на 1200 и 2400 вообще не работает. Менял каналы, устанавливал мощность передачи пониже – не связываются. Только подниму скорость на 4800 – коннект моментальный. Так и не понял причину нестыковки.
По поводу взаимодействия нескольких трансиверов.
Дело в том, что 4463 это пакетный полудуплексный трансивер. То есть пока он не примет весь пакет, он не выставит сигнал наличия данных в приемном буфере. Соответственно, только сканируя наличие входящих данных, невозможно узнать наличие передачи в данный момент с другого модуля. Поэтому, кмк, единственным решением разграничения времени передачи разными трансиверами будет передача только в своем тайм-слоте и коррекция таймслота по предыдущим передачам других модулей.
Поясню. Пускай ширина таймслота 10мс. Каждому трансиверу назначаем номер и в пакете передаем номера источника и получателя. Все стоят на приеме. Как только получен пакет, смотрим на отправителя. Допустим, мы номер 5. А пакет пришел от номера 2. Значит мы еще ждем (5-2-1) = 2*10 = 20мс (то есть пока передадут 3 и 4 модули). А если принят пакет от 4 модуля, то осталось ждать (5-4-1) = 0мс, то есть уже надо передавать. Таким образом, вся сеть постоянно подстраивается под таймслот и выпадение одного из трансиверов не остановит передачу другим, просто будет пропущен один таймслот вхолостую.
admin
31 Окт 2017У меня модули версии 2.3, режим FU3 на скорости 2400 Бит/сек функционирует нормально, пока ничего не могу сказать по вашей проблеме, если попадутся модули версии 2.4 обязательно проверю.
Вы описали интересный способ передачи данных в сети из нескольких трансиверов, возьму на заметку.
sslobodyan
31 Окт 2017Вам повезло больше 😉 А проверяли на столе рядышком? Я в терминалке все смотрел и модули рядом на столе. Попробую еще разнести их подальше, может оглушают друг друга.
admin
31 Окт 2017Да на близком расстоянии около 15-20 см, и вплоть до 1 км. Я в терминале не смотрел, у меня собраны передатчик и приемник описанные в этой статье.
Александр
22 Ноя 2017Иными словами-пока все не примет передача невозможна?
То есть на очереди передачи он на втором месте.
И на оборот.
Александр
12 Ноя 2017Афигеть!!!!
Получил наконец свои модули.
Прописал UART на передатчик и на приемник на разных макетках.
И оно все заработало.
Брал с потолка разные цифры (123,112,42 и т.д.) и посылал передатчиком.
Контролировал индикатором TIC55.
И оно все принимает.Без ошибок.Никаких танцев с бубном.Даже скушно.
Будем развивать тему дальше.
И это после почти двух-трех безрезультатных месяцев стражений с NRF24L01.
admin
12 Ноя 2017Отлично! Все верно здесь ничего сложного нет, модули просты в подключении. А NRF24L01 там целые дебри в даташите, замучаешься все изучать, поэтому у меня даже желания не возникло возиться с ними.
Александр
12 Ноя 2017И все же.
Спасибо вам Руслан.
Хоть пинаете в нужную сторону.
А то ведь часто не знаешь где взять и с чего начать.
А тут посмотришь что люди делают и …….
Александр
24 Ноя 2017Руслан.
Признаться я новичок по работе с АТ командами.
Не могли бы вы написать подробную статью по этому поводу?
Что то ничего не могу найти в интернете.
Очень хочется пообщаться с HC-12.
Да и вообще восполнить этот пробел.
admin
24 Ноя 2017А что конкретно в командах вам не понятно? Все команды для модулей я привел в этой статье. И основное отличие от стандарта AT команд тоже указал.
Александр
24 Ноя 2017AT+SLEEP так нужно отправлять?
Последовательно по буквам?
A .129 B’10000001′ 0X81
T .148 B’10010100′ 0X94
+ .107 B’01101011′ 0X6B
S .147 B’10010011′ 0X93
L .140 B’10001100′ 0X8C
E .133 B’10000101′ 0X85
E .133 B’10000101′ 0X85
P .144 B’10010000′ 0X90
Александр
25 Ноя 2017Все я напутал.
Но въехал все же…
Андрей
20 Ноя 2017Я заказал E30-ttl10 – при питании 3.3В и дефолтных настройках дальность составила в прямой видимости около 500 метров(антенна кручёная спиралька)! После установки на сервер антенны – прямой штырь и питании 5В – дальность стала около 700 метров! Если скорость радиоканала не поднимать – работает изюмительно!(проверял на максимальной скорости – дальность падает почти в два раза)
По потреблению – в режиме сна – вообще мкамперы, передача 6 байт- по времени около 30млсек – дальше опять спать!
Почему я с ними начал работать – из 5 NRF24l01 – только одна дала заявленный ток в спящем режиме – а так до 6 млА доходила! При батарейном питании – это смерти подобно!
sslobodyan
21 Ноя 2017Серию E30 китайцы сделали на много правильнее, чем НС-12. У НС-12 основная проблема в том, что скорость в эфире зависит от скорости порта. При односторонней связи это еще катит, но когда обмен типа “запрос-ответ”, то теряем слишком много времени. К примеру, работаем на низкой скорости и один пакет передается 10мс. Значит тратим 10мс на закачку в НС-12, затем он передает до 10мс (от чего зависит не знаю, то он сразу передает, то ждет наполнения буфера), и опять 10мс на выкачку приемником из буфера. Если должна быть ответка, то опять 10 мс закачка, эфир и 10мс выкачка. А вот E30 позволяет закачку-выкачку делать на максимальной скорости, то есть в нашем случае только на эфир тратим 10+10, а на обмен в разы меньше. Ди а вариантов скорости в эфире у E30 больше, что позволяет балансировать дальность-скорость. Жаль, цена больше, хотя внутри там тот же трансивер и мелкий дешевый МК.
Виктор
12 Май 2018По поводу NRF24l01. У меня уже больше двух лет работают три разных устройства на батарейном питании.
Самое прожорливое при питании од двух батареек АА в режиме сна “кушают” около 2,3мкА (ATMega168P, nRF24L01+, BMP085, SHT10). Батарейки за два года разрядились 3,25V до 3,07V, так как на протяжении всей работы, проводились эксперименты по продолжительности времени между пробуждениями МК.
Олег
10 Июн 2019Здравствуйте, Виктор! Подскажите где взять рабочий вариант схемы с NRF24L01 с прошивками? Какие вы делали.
Виктор
23 Июл 2019Здравствуйте, Олег! Не знаю, смогу ли вам помочь. Я писал тогда на AlgorithmBuilder под свои проекты.
ss2
1 Фев 2018собрал приемник и передатчик по вашей схеме проверил установки hc-12 с помощью терминал
при включении все как описано, светодиоды включаются на секунду при загрузке,но передачи нет,ток передатчика при нажатии кнопок 18 миллиампер, перепрошил ,перепроверил правильность монтажа, hc-12 проверял в режиме U3. пару раз включались светодиоды на приемнике когда я передатчик держал в руке.Питание от сетевых источников +5в.
admin
1 Фев 2018Если светодиод загорается на 1 сек, значит микроконтроллер соединяется с модулем и прописывает в него настройки. Возможно передатчик и приемник настраиваются на разные режимы, надо выставлять одинаковые режимы и на передатчике и на приемнике, то есть в EEPROM микроконтроллера записывать одинаковые цифры для обоих микроконтроллеров.
Попробуйте стереть EEPROM и ничего туда не записывать, в этом случае по умолчанию должен установиться режим FU3.
Попробуйте запитать передатчик и приемник от аккумуляторов либо батареек, отдельно для передатчика и приемника.
Может дело в антеннах, используйте для начала одножильный провод длиной 17 см.
ss2
1 Фев 2018OK+B9600[.][.]OK+RC001[.][.]OK+RP:+20dBm[.][.]OK+FU3[.][.]
это это я записываю в hc-12 ,выпаиваю и проверяю hc-12, вместо B9600 записано B2400
может это записывает микроконтроллер.
admin
1 Фев 2018Да, это записывает микроконтроллер (скорость 2400 кБит/сек для режима FU3), вы статью читали? Я специально написал такой код чтобы микроконтроллер все сам настраивал.
ss2
1 Фев 2018да спасибо ,я все читал.Версия hc-12_v2.4 ,будем работать над проблемой
Макс
3 Фев 2018Если несколько HC-12 настроенs на один канал, при передаче с одного принимать будут все? То есть устанавливается ли связь устройство-устройство или все видят всех? Хочу сделать беcпроводное подобие RS-485.
ss2
19 Фев 2018здравствуйте,проверял команды AT на модуле HC-12 , не проходит команда AT+U801 отвечает ошибка ,с другими командами все ok. может нужно перепрошить HC-12
верси_v2.4
admin
19 Фев 2018В команде AT+U801, после цифры 8 должна быть буква, а не число, например N – без бита четности, E – с битом проверки на четность, O – с битом проверки на нечетность, вы случаем цифру не поставили вместо буквы?
И хотел узнать, у вас заработали прошивки приемника и передатчика? В комментариях пользователь sslobodyan писал что у него модули не связывались в режиме FU3 на скорости 2400 Бит/сек, версия его модулей была также 2.4, по его словам связь устанавливалась только на скорости 4800 Бит/сек и выше, может у вас такая же проблема? Просто у меня нет модулей с версией 2.4, есть только 2.3, и проверить я не могу пока.
Может мне стоит подредактировать прошивки и поднять скорость для режима FU3 до 4800 Бит/сек (на данный момент в прошивках скорость для FU3 2400 Бит/сек).
ss2
19 Фев 2018спасибо за внимание. пока запустить не удалось , точно команду записал неправильно .
если у вас есть возможность подредактировать прошивки было хорошо. очень нужен ваш проект.
admin
20 Фев 2018Я модифицировал прошивку, скачать можно в конце статьи, пробуйте.
ss2
23 Фев 2018перепрошил и все заработало. спасибо за помощь, питание блоков от мобильных зарядников.модифицированная прошивка помогла,буду пристраивать в корпус,на дальность проверить пока нет возможности.антенна провод 17см ,проверю и с витой антенной.
ss2
23 Фев 2018проверял на дальность,работает не далее семи -восьми метров.Дальше явно теряется раборчивость приема .Ток потребления во время передачи 16ma.Подключал разные антенны. Не понравилось управления включение -выключение,при одном нажатии может два -три раза включится и выключится управление, а с дальностью не понятно ,явно не выходит на штатную мощность .
admin
24 Фев 2018Возможно уходит частота внутреннего генератора микроконтроллера, и от этого невысокая дальность связи (срывается синхронизация UART модуля), подключите кварцевый резонатор на 4 МГц к микроконтроллерам в передатчике и приемнике, и прошейте новыми прошивками под кварц, я все описал в конце статьи.
При кратковременном нажатии кнопки передатчика, выход приемника не может включится выключится много раз, может вы что-то путаете? именно на выходе приемника срабатывает много раз?
В программе стоит пауза как минимум 0,25 сек на опрос кнопок в передатчике, так что при кратковременном нажатии (которое длиться примерно 0,1 сек) выход приемника не успеет много раз переключится, если кнопку удерживать то выход приемника будет постоянно переключаться минимум каждые 0,25 сек.
Может вы неправильно представляете работу обратной связи, при нажатии кнопки на передатчике, включается выходной канал приемника, далее сигнал обратной связи поступает на передатчик, где включается зеленый светодиод, оповещающий о том что включился один из выходных каналов на приемнике, потом светодиод гаснет, потому что передатчик переходит в спящий режим, так как новых нажатий кнопок не было, но это не означает что выход приемника отключился!
Когда снова нажимаем кнопку на передатчике, выходной канал на приемнике отключается, сигнал обратной связи поступает на передатчик, где включается красный светодиод, который оповещает о том, что один из каналов на приемнике отключился. Далее если кнопки не будут нажаты, передатчик переходит в спящий режим и отключает светодиод. Красный и зеленый это сигнал обратной связи, зеленый – означает что включился один каналов на приемнике, при этом не важно какой из 2-х каналов, красный означает что один из каналов выключился. Надеюсь понятней стало.
ss2
24 Фев 2018Здравствуйте.хочу обяснить, по срабатыванию кнопок .При коротком нажатии кнопок все нормально срабатывает,но если я зажимаю кнопку присходит постоянное переключение
команд вкл выкл.Если это возможно изменить команду . Чтобы при нажатии кнопки выполнялся один цикл .Нажал команда выполнена,отпустил кнопка готова к выполнению следующей команды .Или увеличить время опроса кнопок.Вы уж меня извините за назойливость.Прошивку скачал детали есть попробую с внешним генератором.Сообщу.Спасибо.
ss2
25 Фев 2018прошивка с внешним генератором не пошла совсем , загружается, но связи нет.
Вторая с внешним генератором FU3-4800_xt4Mxz работает один канал. Кнопка передачи на 10 контакт при включении срабатывает примерно через 1 сек не останавливаясь. Видимо прблемы с hc_12.Дальность связи примерно метров 7.с уважением CC.
admin
25 Фев 2018Даже не знаю в чем еще может быть проблема, возможно модули неисправны. Чтобы выяснить надо модули подключить к двум разным компьютерам через USB-COM преобразователи, и просто вручную с одного компьютера послать данные на второй компьютер.
А режим не пробовали менять? при программировании микроконтроллера в ячейку EEPROM с адресом 0x00 необходимо записать число от 1 до 4, что соответствует режимам FU1-FU4, по умолчанию если ничего не записано включается режим FU3. Попробуйте режим FU1, он почти идентичен режиму FU3, только дальность связи до 100м, и потребление меньше в 4 раза.
Может быть у вас при программировании микроконтроллеров в EEPROM записываются разные данные? посмотрите какие данные записывается в EEPROM при программировании.
Илья
2 Сен 2018У меня сейчас абсолютно такая же проблема, только с ардуинами. Передаю байтики от одной к другой. Дальность передачи в районе 6 метров, при том уже на расстоянии 5 метров рука становится преградой сигналу. Тоже думаю в чем может быть дело
Александр
2 Сен 2018Читайте сообщение admin выше.
Проверьте все терминалом.
Александр
6 Сен 2018Вот шикарная программа.
К сожалению платная.
Но месяц можно пробовать.
http://www.compt.ru/ru/index.php
ss2
27 Фев 2018при программировании в EEPROM ничего не записывается , с миганием канала мой косяк, замкнула дорожка.
Александр
26 Июл 2018Подскажите, есть подобный модуль с возможностью выставления нестандартных скоростей? Например скорость 31 250 бит/сек.
Ravil Buraev
2 Апр 2019Здравствуйте !
в описании модуля указано что при подаче лог. “0” на вход SET HC-12 он переходит в режим с фиксированными параметрами связи – 9600,8n1, на самом деле если Вы заранее изменили параметры скорости или четности командами АТ , то связаться с фиксированными параметрами не удаться.При изучении листинга программы при вызове функции kont_hc12, начиная со скорости 9600 Вы пытайтесь получить ответ от модуля, при отсутствии ответа начинайте перебирать скорости.Вот это непонятно для чего это сделано или производитель HC-12 просто обманывает о фиксированной скорости ?
admin
2 Апр 2019Приветствую, в коде просто идет перебор скорости, позволяющий автоматически установить связь с модулем HC-12, без предварительной настройки. То есть, если скорость порта модуля HC-12 находится в пределах 1200-19200 Бит/сек, то микроконтроллер подберет скорость автоматически.
Функция модуля с фиксированными настройками здесь в коде не используется. Чтобы использовать эту функцию, нужно установить лог.0 на входе SET модуля до ПОДАЧИ ПИТАНИЯ! Чтобы это реализовать микроконтроллер должен еще дополнительно управлять питанием модуля.
Егор
21 Сен 2022Здраствуйте) Скажите, возможно ли создать модель HC-12 для работы в протиус и могли бы вы это сделать?
Станислав
11 Окт 2019Здравствуйте! Появилась необходимость использовать модули для считывания водянных счетчиков (через сухой контакт) в режиме переключателей, FU2 для экономии энергии. Есть ли модифицированные прошивки с уникальным идентификатором модуля, и возможно ли это сделать, например, указав свой номер через AT комманду, и чтобы к каждой строке приписывался идентификатор модуля?? чтобы можно было бы их отличать на приемнике? спасибо
E86HY6PBHN59 www.yandex.ru
13 Окт 20190HMxdAid
Константин
20 Июл 2020Здраствуйте! Использую hc12 для получения технической информации до 1200 м со скважин. В жару летят модули. Думаю уходит частота. Не могу разобраться как залить прошивку на 4мГц кварц. Если есть возможность, напишите, как залить прошивку через USBASP или иным способом, какая нужна программа для заливки, как расключить ноги.
xxx
28 Окт 2023кто нибудь работал с этим модулем только транс si4438? какие отличия?
oleg
8 Фев 2024олег
Уважаемый admin, у модулей из разных партий часта кварца 30 Мгц не всегда равна 30 , а имеет разброс + -, а так как si умножает частоту раз в 14 происходит сдвиг рабочей частоты канала да 20 Кгц. Ширина канала всего 15 Кгц, соответственно резко подает дальность связи или полная потеря связи.
Вопрос: может ВЫ встречали возможность корректировки с помощью АТ команд, регистра si отвечающего за умножитель частоты. Или возможно есть альтернативные прошивки STMки с такой возможностью.