Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Передача данных по радиоканалу Atmega8


Передача данных по радиоканалу Atmega8

Сообщений 1 страница 16 из 16

1

Добрый день! Прошу помощи у специалистов. Планируется сделать устройство на Atmega8, суть в следующем: при изменении состояния входов микроконтроллер будет генерировать код состоящий из индивидуального номера устройства 3 байта и его состоянии 6 байт. Байты состоят только из цифровых значений от 0 до 9, следовательно для их кодирования будет использоваться 4 бита (в калькулятор вводим десятичное значение и переводим в двоичное). Приемная сторона принимает посылку и выводит в СОМ порт стандартным UART в формате 9600,8,N,1. Возможно потребуется ввести стартовый бит\байт для инициализации приема. В качестве приемо-передатчиков будут использоваться радиостанции не имеющие встроенного модема. Канал односторонний. То есть на передатчике выход МК подключен на вход радиостанции, возможно через ФНЧ фильтр, что бы преобразовать в нечто похожее на синус. На приемной стороне радиостанция выходом динамика подключена на компаратор, который преобразует синус в нечто похожее на меандр, а микроконтроллер считает импульсы и если посылка имеет смысл (а не мусор из эфира) отправляет на компьютер.

Какие мысли:

1. Использовать стандартный UART преобразовав его ФНЧ в синус, а на приемной стороне компаратор и МК. Но получается в стандартном уарте слишком много лишней информации старт\стоп биты и видимо байт состоит из 8 бит, получается избыточность.
2. Намного лучший вариант, но не могу понять как его реализовать в коде. Передающий МК генерит два разных сигнала с частотой 600 и 1200 герц (как пример) 600 герц это 0, 1200 герц это 1. Меандр выводим в синус ФНЧ, отправляем по эфиру, компаратором возвращаем в меандр и расшифровываем.
Загвоздка возникла на самом первом пути: для генерирования сигнала пробовал код типа:
Do
    port=1
    waitms=1
    port=0
    waitms=1
Loop

Синус получил, довольно правильный, но только при значениях waitms=0.8 около 500 Герц. Дальнейшие изменения не позволяют получить сигнал с частотой 1000-1200, видимо МК не успевает работать с такими задержками.

Пробовал Sound, но не могу рассчитать корректные значения что бы издать звук с частотой 600 Герц длительностью 1 мс и 1200 такой же длительностью.

Так же нет понимания как реализовать приемную сторону по 2 варианту. МК измеряет количество импульсов за определенное время, если их N, то это 600, если 2N, то 1200.

Может кто подскажет еще варианты или отрезок кода по реализации обоих проектов. Заранее спасибо.

0

2

RA3MAH написал(а):

Добрый день! Прошу помощи у специалистов. Планируется сделать устройство на Atmega8...

Это читали ? Это только первое, что поиск дал...
Работа с радиомодулями HM-R868S и HM-Т868S
Двунаправленная передача данных через i2c
Как декодировать манчестерский код "вручную"?

0

3

RA3MAH написал(а):

Использовать стандартный UART преобразовав его ФНЧ в синус, а на приемной стороне компаратор и МК.

Уже глупо, т.к. радиомодули прекрасно гоняют цифровой сигнал без всяких "синусов"...
Дальше еще веселее...
Возрождаете начало 20 века ? ;)

0

4

Nord
Радиомодули имеют мощность 10-100 мВт, радиостанция 5-50 Вт. Стандартные радиомодули отпадают, так как с ними не передать информацию на требуемые 10-15 км. К тому же, так как, радиомодули выполнены по сверхрегенеративной схеме, подключить внешнюю эффективную антенну нереально, будет срыв генерации, забитие по соседнему каналу и т.д. то есть перестанет работать.

0

5

RA3MAH написал(а):

NordРадиомодули имеют мощность 10-100 мВт, радиостанция 5-50 Вт. Стандартные радиомодули отпадают, так как с ними не передать информацию на требуемые 10-15 км. К тому же, так как, радиомодули выполнены по сверхрегенеративной схеме, подключить внешнюю эффективную антенну нереально, будет срыв генерации, забитие по соседнему каналу и т.д. то есть перестанет работать.

Насколько я знаком с принципами передачи информации по радиоканалу - мощность передатчика имеет вторичное, а то и далее значение...
Носимая р/ст 100 мВт и стационар 10кВт одинаково удачно передают сигнал с банального микрофона.
Вопрос дальности - не обсуждаем.

Уже не один десяток лет радиолюбители пользуются пакетной радиосвязью.
Чем она отличается от вашей задачи (если не считать мудреностей в плане синусов, ФНЧ и т.п.) ?..

0

6

Nord
Я и не спорю, что получается по сути пакетная передача, она мне и нужна, вот и прошу помощи в наставлении на путь истинный.

0

7

RA3MAH написал(а):

NordЯ и не спорю, что получается по сути пакетная передача, она мне и нужна, вот и прошу помощи в наставлении на путь истинный.

Банально, но - поиск рулит... ;)
Даже в этом разделе - не одна тема по радиомодулям, я даже какие-то ссылки дал...
Вот я этими - http://chipster.ru/catalog/arduino-and- … /2062.html проблем не имел.
Работают, "как часы". ;)

0

8

RA3MAH написал(а):

Добрый день! Прошу помощи у специалистов. Планируется сделать устройство на Atmega8, суть в следующем: при изменении состояния входов микроконтроллер будет генерировать код состоящий из индивидуального номера устройства 3 байта и его состоянии 6 байт. Байты состоят только из цифровых значений от 0 до 9, следовательно для их кодирования будет использоваться 4 бита (в калькулятор вводим десятичное значение и переводим в двоичное). Приемная сторона принимает посылку и выводит в СОМ порт стандартным UART в формате 9600,8,N,1. Возможно потребуется ввести стартовый бит\байт для инициализации приема.

Применительно к указанным:
- отправляем посылку с адресом
- один из приемников идентифицирует свой адрес и принимает следующую посылку (остальные ждут)
- принимающий выполняет действия, определенные посылкой (остальные ждут)
- все ждут очередной посылки с адресом...

Вот и вся логика... ;)
Пока работает...
На целой шахте... ;)

0

9

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

0

10

в общем, набросал код. раскидывает 4 значный номер объекта по 1 цифре, далее каждую цифру по байтам и генерирует  меандр с частотой при значении 0 - 800 Гц, при 1-1600 Гц. Но пугает очень большой код уже. Может можно проще разобрать число по цифрам и далее по байтам?

Код:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb.0 = Output

Declare Sub Tx
Declare Sub Pred
Dim Ob As Integer                                           'Объектовый номер
Dim Bp As Integer                                           'Последовательность байт
Dim Dat(16) As Integer                                      'Массив байт
Dim B1 As Integer
Dim B2 As Integer
Dim B3 As Integer
Dim B4 As Integer



Ob = 0123
Do

   Call Pred
   Call Tx
   Wait 10
Loop
End

Sub Pred


    B1 = Ob / 1000
    B1 = Abs(b1)
    B2 = Ob Mod 1000
    B2 = B2 / 100
    B2 = Abs(b2)
    B3 = Ob Mod 100
    B3 = B3 / 10
    B3 = Abs(b3)
    B4 = Ob Mod 10
    B4 = Abs(b4)


Select Case B1
                     Case 0 : Dat(1) = 0
                     Dat(2) = 0 : Dat(3) = 0 : Dat(4) = 0
                     Case 1 : Dat(1) = 0
                     Dat(2) = 0 : Dat(3) = 0 : Dat(4) = 1
                     Case 2 : Dat(1) = 0
                     Dat(2) = 0 : Dat(3) = 1 : Dat(4) = 0
                     Case 3 : Dat(1) = 0
                     Dat(2) = 0 : Dat(3) = 1 : Dat(4) = 1
                     Case 4 : Dat(1) = 0
                     Dat(2) = 1 : Dat(3) = 0 : Dat(4) = 0
                     Case 5 : Dat(1) = 0
                     Dat(2) = 1 : Dat(3) = 0 : Dat(4) = 1
                     Case 6 : Dat(1) = 0
                     Dat(2) = 1 : Dat(3) = 1 : Dat(4) = 0
                     Case 7 : Dat(1) = 0
                     Dat(2) = 1 : Dat(3) = 1 : Dat(4) = 1
                     Case 8 : Dat(1) = 1
                     Dat(2) = 0 : Dat(3) = 0 : Dat(4) = 0
                     Case 9 : Dat(1) = 1
                     Dat(2) = 0 : Dat(3) = 0 : Dat(4) = 1
End Select

Select Case B2
                     Case 0 : Dat(5) = 0
                     Dat(6) = 0 : Dat(7) = 0 : Dat(8) = 0
                     Case 1 : Dat(5) = 0
                     Dat(6) = 0 : Dat(7) = 0 : Dat(8) = 1
                     Case 2 : Dat(5) = 0
                     Dat(6) = 0 : Dat(7) = 1 : Dat(8) = 0
                     Case 3 : Dat(5) = 0
                     Dat(6) = 0 : Dat(7) = 1 : Dat(8) = 1
                     Case 4 : Dat(5) = 0
                     Dat(6) = 1 : Dat(7) = 0 : Dat(8) = 0
                     Case 5 : Dat(5) = 0
                     Dat(6) = 1 : Dat(7) = 0 : Dat(8) = 1
                     Case 6 : Dat(5) = 0
                     Dat(6) = 1 : Dat(7) = 1 : Dat(8) = 0
                     Case 7 : Dat(5) = 0
                     Dat(6) = 1 : Dat(7) = 1 : Dat(8) = 1
                     Case 8 : Dat(5) = 1
                     Dat(6) = 0 : Dat(7) = 0 : Dat(8) = 0
                     Case 9 : Dat(5) = 1
                     Dat(6) = 0 : Dat(7) = 0 : Dat(8) = 1
End Select

Select Case B3
                     Case 0 : Dat(9) = 0
                     Dat(10) = 0 : Dat(11) = 0 : Dat(12) = 0
                     Case 1 : Dat(9) = 0
                     Dat(10) = 0 : Dat(11) = 0 : Dat(12) = 1
                     Case 2 : Dat(9) = 0
                     Dat(10) = 0 : Dat(11) = 1 : Dat(12) = 0
                     Case 3 : Dat(9) = 0
                     Dat(10) = 0 : Dat(11) = 1 : Dat(12) = 1
                     Case 4 : Dat(9) = 0
                     Dat(10) = 1 : Dat(11) = 0 : Dat(12) = 0
                     Case 5 : Dat(9) = 0
                     Dat(10) = 1 : Dat(11) = 0 : Dat(12) = 1
                     Case 6 : Dat(9) = 0
                     Dat(10) = 1 : Dat(11) = 1 : Dat(12) = 0
                     Case 7 : Dat(9) = 0
                     Dat(10) = 1 : Dat(11) = 1 : Dat(12) = 1
                     Case 8 : Dat(9) = 1
                     Dat(10) = 0 : Dat(11) = 0 : Dat(12) = 0
                     Case 9 : Dat(9) = 1
                     Dat(10) = 0 : Dat(11) = 0 : Dat(12) = 1
End Select

Select Case B4
                     Case 0 : Dat(13) = 0
                     Dat(14) = 0 : Dat(15) = 0 : Dat(16) = 0
                     Case 1 : Dat(13) = 0
                     Dat(14) = 0 : Dat(15) = 0 : Dat(16) = 1
                     Case 2 : Dat(13) = 0
                     Dat(14) = 0 : Dat(15) = 1 : Dat(16) = 0
                     Case 3 : Dat(13) = 0
                     Dat(14) = 0 : Dat(15) = 1 : Dat(16) = 1
                     Case 4 : Dat(13) = 0
                     Dat(14) = 1 : Dat(15) = 0 : Dat(16) = 0
                     Case 5 : Dat(13) = 0
                     Dat(14) = 1 : Dat(15) = 0 : Dat(16) = 1
                     Case 6 : Dat(13) = 0
                     Dat(14) = 1 : Dat(15) = 1 : Dat(16) = 0
                     Case 7 : Dat(13) = 0
                     Dat(14) = 1 : Dat(15) = 1 : Dat(16) = 1
                     Case 8 : Dat(13) = 1
                     Dat(14) = 0 : Dat(15) = 0 : Dat(16) = 0
                     Case 9 : Dat(13) = 1
                     Dat(14) = 0 : Dat(15) = 0 : Dat(16) = 1
End Select

End Sub

Sub Tx
    For Bp = 1 To 16
    If Dat(bp) = 1 Then
    Sound Portb.0 , 10 , 414
    Waitms 1
    Else
    Sound Portb.0 , 5 , 831
    Waitms 1
    End If
    Next


End Sub

0

11

RA3MAH написал(а):

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

Я использовал имеющиеся возможности модулей, без дополнительных наворотов, при реализации I2C.
Модулированный он был или нет - меня не интересовало.
Сигнал принимается и отправляется.
Логика описана выше.

Отредактировано Nord (2017-03-04 21:42:45)

0

12

RA3MAH, а попробуйте DTMF. В баскоме есть функция, работает точно.

0

13

DTMF очень медленно... Кто подскажет как посчитать импульсы теперь? Длительность импульсов 3мс, при логическом 0 их 5 периодов, при логической 1 их 10.

0

14

Таймер и счётчик помогут в подсчёте импульсов.

0

15

Антон, черканите мне на pic-avr @ yandex тчк Ru
Александр, ex UA3YQJ

0

16

Подскажите, пожалуйста, образец кода по БПФ. Толком ничего найти не могу...

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Передача данных по радиоканалу Atmega8