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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кодирование и декодирование цифрового сигнала. КАК?


Кодирование и декодирование цифрового сигнала. КАК?

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

1

Доброго времени суток, всем кто зашел на огонек!

В процессе работы столкнулся со следующей проблемой, необходимо зашифровать передаваемую цифровую информацию (с выхода UART микроконтроллера) в следующие кодировки:
NRZ;
NRZI;
RZ;
AMI;
и пр.
http://life-prog.ru/KS/lesson26.gif

Для демонстрации принципов работы кодирования цифрового сигнала.
Ввод и вывод данных уже работает, по UART'у, между двух контроллеров инфу уже гоняю (байт - туда, байт - обратно), а вот как осуществить шифрование - ума не приложу.
Судя из выше представленной картинки, для осуществления кодировки в NRZ - необходимо просто инвертировать данные с UART, для чего можно хоть К561ЛН2 поставить.

Кто что может подсказать? Буду рад любой информации.
Может быть есть специализированные микросхемы для кодирования-декодирования сигнала?
Добавлено спустя 6 минут 12 секунд:
На картинке представлено множество кодировок, мне все не нужны, хотя бы 3-4 реализовать

Отредактировано UN8JAB (2015-05-15 06:56:45)

0

2

А в чём помочь? Расшифровать кодировки, или рассказать как ногами дёргать? Я некоторые не знаю, но логика чётко прослеживается, -
RZ-0-в минус, 1- в плюс (почти как у rs232), AMI 0-это 0, 1 - перепад напряжения. манчестер- писано - переписано(rc5)

0

3

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

А в чём помочь? Расшифровать кодировки, или рассказать как ногами дёргать? Я некоторые не знаю, но логика чётко прослеживается, -
RZ-0-в минус, 1- в плюс (почти как у rs232), AMI 0-это 0, 1 - перепад напряжения. манчестер- писано - переписано(rc5)

http://sh.uploads.ru/t/McfnQ.jpg
структурная схема примерно такая.. каждый блок - отдельный девайс..
подсказать как сделать кодер/декодер в железе, желательно на логике.

0

4

шифратор нужен чтобы засекретить информацию? или просто передать по линии информацию? Второй вариант решается при помощи MAX232(ST232). т.е переводом уровней с UART на RS232. Отлично работает в условии помех.

0

5

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

шифратор нужен чтобы засекретить информацию? или просто передать по линии информацию? Второй вариант решается при помощи MAX232(ST232). т.е переводом уровней с UART на RS232. Отлично работает в условии помех.

стенд будет демонстрационный.
кодировка для снижения влияния помех на линию связи.
кодировки нужны именно те, что указаны.

0

6

по мне, так вы изобретаете велосипед, потому как для этой цели уже существуют всем известные дешевые решения типа RS485.. (это для защиты сигнала)
а для шифрования данных тоже всё есть (AES/DES и прочие..)
если охота изобретать, то можно на DAC/ADC сделать свою систему передачи
кстати на картинке видно, что некоторые алгоритмы далеко не цифровые уже (имеют большие состояния в отличии от 0 и 1)

0

7

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

по мне, так вы изобретаете велосипед, потому как для этой цели уже существуют всем известные дешевые решения типа RS485.. (это для защиты сигнала)
а для шифрования данных тоже всё есть (AES/DES и прочие..)
если охота изобретать, то можно на DAC/ADC сделать свою систему передачи
кстати на картинке видно, что некоторые алгоритмы далеко не цифровые уже (имеют большие состояния в отличии от 0 и 1)

еще раз... мне нужен велосипед, чтоб спереди колеса были квадратные, а сзади чтоб в форме тетраедера.
это для демонстрации кодирования цифрового сигнала!!!
нужны именно эти кодировки (перечислено в первом посте).

Отредактировано UN8JAB (2015-05-16 09:35:10)

0

8

RZ, AMI MLT-3, 2B1Q - не цифровые сигналы, а "физическое кодирование"/схемные решения, надо искать в инете.

0

9

ВАУ ))) А тот же 2B1Q никак не воспроизвести 4х битным ЦАП ?
Микроконтроллеры ну никак не подходят ? ))))))))))))
RDW  у нас походу Шапокляк )))

По Манчестеру готовый код ТУТ, из него же при желании можно сделать NRZ, по остальному не подскажу- не сталкивался.
Насчет систем кодирования можно обратиться к радиорелейщикам, у них и микры специализированные есть, и пользуются всем этим чаще всего они.

Отредактировано Skull (2015-05-18 16:01:10)

-1

10

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

ВАУ ))) А тот же 2B1Q никак не воспроизвести 4х битным ЦАП ?
Микроконтроллеры ну никак не подходят ? ))))))))))))
RDW  у нас походу Шапокляк )))

По Манчестеру готовый код ТУТ, из него же при желании можно сделать NRZ, по остальному не подскажу- не сталкивался.
Насчет систем кодирования можно обратиться к радиорелейщикам, у них и микры специализированные есть, и пользуются всем этим чаще всего они.

Отредактировано Skull (Сегодня 19:01:10)

Спасибо!
NRZ уже реализовал сегодня.. думаю, если в день по кодировке делать, то через пару недель закончу... а так срок месяц =(

0

11

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

По Манчестеру готовый код ТУТ

А кода там не видно, если вы его видите не могли бы оттуда скопировать?

0

12

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

А кода там не видно, если вы его видите не могли бы оттуда скопировать?

А там регистрироваться надо. кстати, очень рекомендую, много полезностей от туда поимел уже.
Как Барнаул? Затон не сильно топило?

to ALL:

Реализацию делаю на микроконтроллерах, уже готово кодирование в NRZ, NRZI, Manchester, Dif. Manchester и декодирование из NRZ, NRZI.

сейчас над манчестерами начинаю работать.
aleksey

0

13

В этом году вроде несильно, да им привыкать чтоли, каждый год топит.

0

14

OFF TOP.
Затон расселяют. В прошлом году дали сертификаты на покупку жилья, после покупки дом нужно снести.

0

15

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

А кода там не видно, если вы его видите не могли бы оттуда скопировать?


Передатчик

$regfile = "m8def.dat"
$crystal = 8000000                                          'szybkość zegara 8MHz
$hwstack = 32
$swstack = 16
$framesize = 40

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls

Dim _flaga_10ms As Bit
_flaga_10ms = 0

Config Portd.1 = Output
Config Pind.4 = Input

Set Portd.4

Config Timer1 = Timer , Prescale = 64
Config Debounce = 5

S1 Alias Pind.4
'************************ Definiowanie Zmiennych *******************************
Declare Function Make_manchester(byval Temp As Byte) As Word

Dim Tempword As Word
Dim Nottempword As Word

Dim Synch As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim Naglowek As Byte

Dim Synchronizacja As Word
Dim Dane1 As Word
Dim Dane2 As Word

Dim Indeks As Byte

Dim Podglad As Byte

Synch = 0
Temp1 = 32
Temp2 = 56
Indeks = 0
Naglowek = &B00001110                                       '&B00000111
'************************ Kodowanie ********************************************

Synchronizacja = Make_manchester(synch)
Synchronizacja = Not Synchronizacja

Dane1 = Make_manchester(temp1)
Dane1 = Not Dane1

Dane2 = Make_manchester(temp2)
Dane2 = Not Dane2

Cls

On Timer1 Czas
Timer1 = 64286

Enable Interrupts
Enable Timer1

'**************************** Program główny ***********************************
Start Timer1
Do

   If _flaga_10ms = 1 Then
      Incr Indeks
      Portd.1 = Synchronizacja.15
      Rotate Synchronizacja , Left , 1
         If Indeks = 16 Then Indeks = 0
   _flaga_10ms = 0
   End If
If S1 = 0 Then Gosub Nadawanie
Loop
End

'********************** Czas ***************************************************
Czas:

Timer1 = 64286                                              '64285
_flaga_10ms = 1

Return

'*********************** Nadawanie *********************************************
Nadawanie:
Indeks = 0
_flaga_10ms = 0
Do
   If _flaga_10ms = 1 Then

         If Indeks < 4 Then                                 '1,2,3,4
            Portd.1 = Naglowek.3
            Rotate Naglowek , Left , 1

         Elseif Indeks > 3 And Indeks < 21 Then             '5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
            Portd.1 = Dane1.15
            Rotate Dane1 , Left , 1

         Else                                               '21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
            Portd.1 = Dane2.15
            Rotate Dane2 , Left , 1

         End If
   Podglad = Pind.1
   Lcd Podglad
   Incr Indeks
   _flaga_10ms = 0
   End If

Loop Until Indeks = 37

Indeks = 0

Return
'*************** Funkcja kodująca Manchester ***********************************
Function Make_manchester(byval Temp As Byte) As Word
  Local Bit_number As Byte
  Local Manchester As Word
   Bit_number = 8
    Do
      Shift Manchester , Left , 2
      Decr Bit_number
      If Temp.bit_number = 1 Then
         Manchester = Manchester + 1                        '01
      Else
         Manchester = Manchester + 2                        '10
      End If
    Loop Until Bit_number = 0
    Make_manchester = Manchester
End Function

Приемник

$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 32
$swstack = 16
$framesize = 40

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Cls

Declare Function Decode_manchester(byval Tempw As Word ) As Byte

Config Pind.2 = Input

Config Portd.7 = Output

Dim _flaga_timer As Bit

Dim _flaga_10ms As Bit

Dim Znacznik As Bit

'**************** Definiowanie zmiennych ***************************************
Dim Dane1 As Word
Dim Dane2 As Word
Dane1 = 0
Dane2 = 0

Dim Temp1 As Byte
Dim Temp2 As Byte

Dim Czas As Word
Dim Czas2 As Word

Dim Pop_wartosc As Byte
Dim Wartosc As Byte
Dim Notwartosc As Byte
Dim Naglowek As Byte
Dim Licznik As Byte

Naglowek = 0
Licznik = 0

Dim Synchronizacja As Word                                  '21845

Dim Temp_1 As Word
Dim Data_error As Bit

'**************** Program ******************************************************
Config Timer1 = Timer , Prescale = 8

Sync_now:

Naglowek = 0
_flaga_timer = 0
_flaga_10ms = 0
Znacznik = 0                                                'synchronizacja
Config Int0 = Rising
Timer1 = 0
Stop Timer1
Enable Interrupts
Enable Int0

On Int0 Pomiar_czasu

Main:

Do
   If _flaga_10ms = 1 Then
      If Znacznik = 0 Then
         Pop_wartosc = Pind.2
      Else
         Wartosc = Pind.2
         Notwartosc = Not Wartosc.0

         If Notwartosc = Pop_wartosc Then
            Cls
         Else
            Locate 1 , 1
            Lcd "Out of synchro"
         End If

         If Wartosc = 1 Then
            Naglowek = Naglowek + Wartosc
            Shift Naglowek , Left , 1
         Else
            If Naglowek = 14 Or Naglowek = 30 Then
               _flaga_10ms = 0

               Naglowek = 0
               Goto Odbior_danych
            Else
               Naglowek = 0
            End If
         End If
      End If
      Pop_wartosc = Wartosc
      Znacznik = 1
      Portd.7 = Wartosc
      _flaga_10ms = 0
   End If
Loop
End

'************************ Odbiór danych ****************************************
Odbior_danych:
Licznik = 0
Dane1 = 0
Dane2 = 0
Do
If _flaga_10ms = 1 Then
Cls
Wartosc = Pind.2
Incr Licznik
   If Licznik < 17 Then

      Dane1 = Dane1 + Wartosc
      If Licznik < 16 Then Shift Dane1 , Left , 1

   Elseif Licznik > 16 Then

      Dane2 = Dane2 + Wartosc
      If Licznik < 33 Then Shift Dane2 , Left , 1

   End If

Portd.7 = Wartosc
_flaga_10ms = 0
End If
Loop Until Licznik = 33
Goto Dekodowanie
Return

'************************** Dekodowanie ***************************************
Dekodowanie:
Znacznik = 0
Stop Timer1

Dane1 = Not Dane1
Dane2 = Not Dane2

Temp1 = Decode_manchester(dane1)

Temp2 = Decode_manchester(dane2)

Cls
Lcd Temp1
Lowerline
Lcd Temp2
Wait 2
Goto Sync_now

Return
'******************** Pomiar czasu *********************************************
Pomiar_czasu:

If _flaga_timer = 1 Then
   Stop Timer1
   Disable Int0
   Disable Interrupts
   Czas = Timer1
   _flaga_timer = 0
   Goto Synchronizacja_odbiornika
   Return
End If

Start Timer1

_flaga_timer = 1
Return
'******************************* Synchronizacja Odbiornika *********************
Synchronizacja_odbiornika:

   Czas = Czas \ 2                                          'Czas trwania impulsu
   Czas2 = Czas \ 8                                         '1/8 czasu trwania impulsu
   Czas = 65536 - Czas
   Czas2 = 65536 - Czas2
   On Timer1 Program1
   Timer1 = Czas2
   Enable Interrupts
   Enable Timer1
   Start Timer1

   Goto Main

Return

'*************************** Program1 ******************************************
Program1:

Timer1 = Czas                                               '64285
_flaga_10ms = 1

Return

'******************* Funkcja dekodująca Manchester *****************************
Function Decode_manchester(byval Tempw As Word ) As Byte
   Local Bit_number As Byte
   Local Manchester As Word
   Bit_number = 8
   Do
   Shift Manchester , Left , 1
   Decr Bit_number
   Temp_1 = Tempw And &B1100_0000_0000_0000
   If Temp_1 = &B0100_0000_0000_0000 Then Incr Manchester   '01
   If Temp_1 = &B1100_0000_0000_0000 Or Temp_1 = 0 Then Set Data_error       '11 or 00
   Shift Tempw , Left , 2
   Loop Until Bit_number = 0
   If Data_error = 0 Then
      Decode_manchester = Manchester
   Else
      Decode_manchester = 0
   End If
   Reset Data_error
End Function

0

16

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

OFF TOP.
Затон расселяют. В прошлом году дали сертификаты на покупку жилья, после покупки дом нужно снести.


OFF top
ППЦ!

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кодирование и декодирование цифрового сигнала. КАК?