Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Расшифровка RDS на FM радиоприемнике RDA5807M
Unicorn Дата: Ср, 19.02.2020, 19:11  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Пример расшифровки и отображения названия радиостанций и времени, передаваемых в системе RDS по радио. В общем, последовательность действий такая:
- провести процедуру инициализации включения и настройки RDA5807M (включить функцию обработки RDS=1 бит 4 регистр 02, задать частоту радиостанции и диапазон в регистре 03)
- проверить достоверность принимаемых данных по RDS (биты RDSR=1 и RDSS=1 в регистре 0А, биты BLERA=0 и BLERB=0 в регистре 0В)
- определить тип группы передаваемых данных (биты 16-12 в регистре 0D)
- в зависимости от типа принятой группы, провести расшифровку данных по соответствующему алгоритму и вывести результат на дисплей
В примере, представлена расшифровка группы 0A или 0B (название радиостанции) и 4A (дата и время). Расшифровка даты не производилась, т.к. она требует работы с большими числами с плавающей запятой, что накладывает существенные ограничения на ресурсы PIC16F84A и возможности PBP.
Некоторые наблюдения. Достоверность данных RDS возможна только при хорошем уровне принимаемого радиосигнала, на это влияет антенна и метеоусловия. Иначе на дисплее появляется "мусор" из не читаемых символов. Многие радиостанции передают RDS условно придерживаясь правил стандарта EN50067, что при расшифровке некоторых групп приводит к "мусору" на дисплее или отображению неверной информации. При настройке на радиостанции, название которых состоит из нескольких слов, первые 30-60 сек. на дисплее отображается хаотично меняющийся "мусор" и только потом появляются связанные слова. У радиостанций, в название которых только одно слово, такого эффекта не замечено.

(программа написана не оптимально, по быстрому, только попробовать и посмотреть как это работает)

Код
'----------------------------
'RDS Radio RDA5807M
'PIC16F84A + LCD 1602
'----------------------------
@ device xt_osc, wdt_off, protect_off, pwrt_off
DEFINE OSC 4

TRISB = %00000000
PORTB = %00000000
TRISA = %00000000
PORTA = %00000000

'--- типовая инициализация LCD 1602 ---
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 4
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
'--------------------------------------

PAUSE 500
LCDOUT $fe,$01 'очистка дисплея LCD

SCL VAR PORTB.4 'шина I2C, такт SCL
SDA VAR PORTB.5 'шина I2C, данные SDA

RG02 VAR WORD 'переменные хранения кодов
RG03 VAR WORD 'инициализации и настройки
RG04 VAR WORD 'приемника RDA5807M
RG05 VAR WORD
RG06 VAR WORD

REG_A VAR WORD 'переменные хранения кодов
REG_B VAR WORD 'получаемых данных RDS
RDS_A VAR WORD 'блок А
RDS_B VAR WORD 'блок B
RDS_C VAR WORD 'блок C
RDS_D VAR WORD 'блок D
RDS_DH VAR BYTE 'блок D, старшие биты
RDS_DL VAR BYTE 'блок D, младшие биты
MINUT VAR WORD 'время, минуты
HOUR VAR WORD 'время, часы
VREM VAR WORD 'времянка

SYMB_1 VAR BYTE 'переменные хранения кодов
SYMB_2 VAR BYTE 'символов текста названия
SYMB_3 VAR BYTE 'радиостанции
SYMB_4 VAR BYTE 'коды соответствую
SYMB_5 VAR BYTE 'кодировки ASCII
SYMB_6 VAR BYTE
SYMB_7 VAR BYTE
SYMB_8 VAR BYTE

'--- инициализация и настройка приемника ---
RG02 = %1100000000001001 'в 3-ем бите 1 это включение RDS
RG03 = %0000110110010000 '92.4 МГц радиостанция Маяк
RG04 = %0000000000000000
RG05 = %1000100010001111
RG06 = %0000000000000000
I2CWRITE SDA,SCL,$20,[RG02,RG03,RG04,RG05,RG06]
PAUSE 3000 'пауза, чтобы приемник успел настроиться
'на радиостанцию и обновить данные RDS в
'регистрах 0A-0F
'-------------------------------------------

'--- проверка условий достоверного приема данных RDS ---
m1
I2CREAd SDA,SCL,$23,$0A,[REG_A] 'чтение регистра 0А для извлечения RDSR и RDSS
I2CREAd SDA,SCL,$23,$0B,[REG_B] 'чтение регистра 0B для извлечения BLERA и BLERB
REG_A = REG_A & $9000 'накладываем фильтр и выделяем биты RDSR и RDSS
REG_B = REG_B & $000F 'накладываем фильтр и выделяем биты BLERA и BLERB
IF REG_A = $9000 AND REG_B = 0 THEN 'если RDS принят и ошибок нет то
GOTO m2 'переход на определение типа передаваемой группы RDS
ELSE
PAUSE 10
ENDIF
GOTO m1 'ожидание достоверных данных RDS
'-------------------------------------------------------------

'--- определение типа группы передаваемых данных ---
m2
PAUSE 50 'пауза 40-90ms необходимая для обновления регистров
I2CREAd SDA,SCL,$23,$0D,[RDS_B] 'читаем содержимое блок B
VREM = RDS_B >> 11 'выделяем первые 5 бит определяющих тип группы
IF VREM = 0 OR VREM = 1 THEN 'определение группы 0А или 0В
GOSUB Txt 'подпрограмма декодирования группы 0А или 0В
LCDOUT $fe,$80,SYMB_1,SYMB_2,SYMB_3,SYMB_4,SYMB_5,SYMB_6,SYMB_7,SYMB_8
'вывод названия радиостанции на дисплей в 1-ю строку (слово из 8 символов)
ELSE
IF VREM = 8 THEN 'определение группы 4А
GOSUB Vr 'подпрограмма декодирования группы 4А
LCDOUT $fe,$C0,DEC2 HOUR,":",DEC2 MINUT
'вывод времени на дисплей во 2-ю строку
ELSE
ENDIF
ENDIF
GOTO m2 'ожидание передачи группы 0A или 0B или 4A
'--------------------------------------------------

'--- подпрограмма декодирования группы 0А или 0В (название радиостанции) ---
Txt:
IF RDS_B.Bit1 = 0 AND RDS_B.Bit0 = 0 THEN 'определение номеров передаваемых символов
I2CREAd SDA,SCL,$23,$0F,[RDS_DH,RDS_DL] 'чтение блока D
SYMB_1 = RDS_DH 'прием 1-го символа слова
SYMB_2 = RDS_DL 'прием 2-го символа слова
ELSE
GOTO m3
ENDIF
GOTO m2 'номера символов слова определяются только если передается группа 0А или 0В

m3
IF RDS_B.Bit1 = 0 AND RDS_B.Bit0 = 1 THEN
I2CREAd SDA,SCL,$23,$0F,[RDS_DH,RDS_DL]
SYMB_3 = RDS_DH 'прием 3-го символа слова
SYMB_4 = RDS_DL 'прием 4-го символа слова
ELSE
GOTO m4
ENDIF
GOTO m2

m4
IF RDS_B.Bit1 = 1 AND RDS_B.Bit0 = 0 THEN
I2CREAd SDA,SCL,$23,$0F,[RDS_DH,RDS_DL]
SYMB_5 = RDS_DH 'прием 5-го символа слова
SYMB_6 = RDS_DL 'прием 6-го символа слова
ELSE
GOTO m5
ENDIF
GOTO m2

m5
IF RDS_B.Bit1 = 1 AND RDS_B.Bit0 = 1 THEN
I2CREAd SDA,SCL,$23,$0F,[RDS_DH,RDS_DL]
SYMB_7 = RDS_DH 'прием 7-го символа слова
SYMB_8 = RDS_DL 'прием 8-го символа слова
ELSE
GOTO m2
ENDIF
RETURN

'--- подпрограмма декодирования группы 4А (дата и время) ---
Vr:
I2CREAd SDA,SCL,$23,$0E,[RDS_C] 'чтение блока C
I2CREAd SDA,SCL,$23,$0F,[RDS_D] 'чтение блока D
MINUT = (RDS_D >> 6)& $3F 'выделение байтов минут
RDS_D = RDS_D >> 12 'выделение байтов часов
RDS_D.Bit4 = RDS_C.Bit0 'перенос байта из одно регистра в другой
HOUR = RDS_D + 3 'местное время = UTC + 3 часа
RETURN
'----------------------------------------------------------

END


Фото содержимого дисплея при приеме разных радиостанций.




описание RDS регистров RDA5807M


схема подключения


описание стандарта передачи данные по RDS
Прикрепления: 1484571.jpg (90.6 Kb) · 5094411.jpg (128.2 Kb) · 1627639.jpg (148.6 Kb) · EN50067_RDS_Sta.pdf (646.1 Kb) · 7015056.jpg (194.0 Kb) · 1375877.jpg (39.6 Kb)
ЯНДЕКС Дата: 19.02.2020
lev2606 Дата: Ср, 01.04.2020, 10:22  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 29.09.2013

Статус: Offline

Скажите, а вместо PIC16F84A можно тут использовать PIC16F628A ?
Unicorn Дата: Ср, 01.04.2020, 12:01  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Да, можно. Просто в начале программы измените настройки под Ваш контроллер и правильно назначите порты к которым подключен приемник и LCD.
Булат Дата: Пт, 13.11.2020, 21:34  |                                                                                                                Сообщение # 4
Группа: Пользователи
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 13.11.2020

Статус: Offline

Всем привет! Хочу попробовать ваш код портировать в Bascom AVR,поможете если чего не пойму?

Добавлено (13.11.2020, 23:40)
---------------------------------------------
Похоже форум умер...

ivan_fd Дата: Пт, 13.11.2020, 23:50  |                                                                                                                Сообщение # 5
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Пробуйте, переводите. Если что то будет не ясно, спросите.
Булат Дата: Пн, 16.11.2020, 17:37  |                                                                                                                Сообщение # 6
Группа: Пользователи
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 13.11.2020

Статус: Offline

Мне вот что не понятно-программа крутится в основном цикле,когда будет принят сигнал RDS переходим на метку m2 и там крутимся,а где выход обратно в основной цикл?
ivan_fd Дата: Вт, 17.11.2020, 15:33  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата Булат ()
а где выход обратно в основной цикл?

 Его нету. Программа только для тестирования.

Цитата Unicorn ()
(программа написана не оптимально, по быстрому, только попробовать и посмотреть как это работает)
Булат Дата: Вт, 17.11.2020, 17:38  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 13.11.2020

Статус: Offline

Понятно,спасибо!
А то рдс сигнал пропадает и текст замирает...
  • Страница 1 из 1
  • 1
Поиск: