Unicorn |
Дата: Ср, 19.02.2020, 19:11 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 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
|
|
|
|
lev2606 |
Дата: Ср, 01.04.2020, 10:22 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 29.09.2013
Статус:
Offline
|
Скажите, а вместо PIC16F84A можно тут использовать PIC16F628A ?
|
|
|
|
Unicorn |
Дата: Ср, 01.04.2020, 12:01 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
25
Замечания:
±
На сайте с 27.10.2014
Статус:
Offline
|
Да, можно. Просто в начале программы измените настройки под Ваш контроллер и правильно назначите порты к которым подключен приемник и LCD.
|
|
|
|
Булат |
Дата: Пт, 13.11.2020, 21:34 | Сообщение # 4 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
3
Замечания:
±
На сайте с 13.11.2020
Статус:
Offline
|
Всем привет! Хочу попробовать ваш код портировать в Bascom AVR,поможете если чего не пойму? Добавлено (13.11.2020, 23:40) --------------------------------------------- Похоже форум умер...
|
|
|
|
ivan_fd |
Дата: Пт, 13.11.2020, 23:50 | Сообщение # 5 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Пробуйте, переводите. Если что то будет не ясно, спросите.
|
|
|
|
Булат |
Дата: Пн, 16.11.2020, 17:37 | Сообщение # 6 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
3
Замечания:
±
На сайте с 13.11.2020
Статус:
Offline
|
Мне вот что не понятно-программа крутится в основном цикле,когда будет принят сигнал RDS переходим на метку m2 и там крутимся,а где выход обратно в основной цикл?
|
|
|
|
ivan_fd |
Дата: Вт, 17.11.2020, 15:33 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата Булат ( ) а где выход обратно в основной цикл? Его нету. Программа только для тестирования.
Цитата Unicorn ( ) (программа написана не оптимально, по быстрому, только попробовать и посмотреть как это работает)
|
|
|
|
Булат |
Дата: Вт, 17.11.2020, 17:38 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
3
Замечания:
±
На сайте с 13.11.2020
Статус:
Offline
|
Понятно,спасибо! А то рдс сигнал пропадает и текст замирает...
|
|
|
|