RDS matematika

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
msar
Příspěvky: 357
Registrován: 22 dub 2006, 00:00
Bydliště: Hradec Králové

#16 Příspěvek od msar »

Snad se v tom vyznáš, je to část přijmu

Kód: Vybrat vše

;BUFFER1,BUFFER1+1,BUFFER2,BUFFER2+1,RDSDA,RDSCL nadefinovány na začátku programu
RDS:   MOV DPTR,#05B9h ;=0000010110111001b
   MOV R1,#26   ; počet přijímaných bitů
   MOV A,#0
   MOV R0,#3   ;přijmi 3 bity
   CALL RDSCTI   ;přijímací rutina
   MOV B,#0
   XCH A,B      ;v B vyšší bajt   
   MOV R0,#8   ;přijmi 8 bitů
   CALL RDSCTI
   XCH A,B      ;v A nižší bajt
TST1:   JNB B.2,DOPLN   ;pokud je 2^10 nulový, doplň bit
TST2:   XRL A,DPL   ;XOR A a nižšího bajtu DPTR
   XCH A,B      ;provádí XRL B,DPH
   XRL A,DPH
   XCH A,B
   DJNZ R1,DOPLN   ;dokud není 26bitů, doplňuje
   MOV BUFFER1,A    ;v BUFFER1 nižší bajt   
   MOV BUFFER1+1,B ;v BUFFER1+1 vyšší bajt

   MOV R1,#26   ;to samé jako výše
   MOV R0,#3   
   CALL RDSCTI
   MOV B,#0
   XCH A,B      ;v B vyšší bajt   
   MOV R0,#8   
   CALL RDSCTI
   XCH A,B      ;v A nižší bajt
TST3:   JNB B.2,DOPLN
TST4:   XRL A,DPL
   XCH A,B      ;provádí XRL B,DPH
   XRL A,DPH
   XCH A,B
   DJNZ R1,DOPLN
   MOV BUFFER2,A    ;v BUFFER2 nižší bajt   
   MOV BUFFER2+1,B;v BUFFER2+1 vyšší bajt
   JMP POROVN
DOPLN:   CALL RDSCTI1   ;do C přijatý bit
   RLC A      ;rotuj A
   XCH A,B      ;provádí RLC B
   RLC A
   XCH A,B
   JNB B.2,DOPLN   ;pokud je 2^10 nulový, doplň bit
   JMP TST4
RDSCTI:         ;přečte tolik bitů, kolik je v R0   
CTI1:   JB RDSCL,CTI10   ;čekej na náběžnou hranu
   JMP CTI1
CTI10:   MOV C,RDSDA   ;data bit vlož do C
   DEC R1      ;odečti R1
CTI20:   JNB RDSCL,CTI100 ;čekej na spádovou hranu
   JMP CTI20
CTI100:   RLC A      ;rotuj A přes C
   DJNZ R0,CTI1   ;proveď tolikrát, kolik je v R0
KONC:   RET

RDSCTI1:      ;přečte 1 bit      
CTI2:   JB RDSCL,CTI30   ;čekej na náběžnou hranu
   JMP CTI2
CTI30:   MOV C,RDSDA   ;data bit vlož do C
   DEC R1      ;odečti R1
CTI40:   JNB RDSCL,CTI50   ;čekej na spádovou hranu
   JMP CTI40
CTI50:   RET
POROVN:   MOV A,BUFFER1
   XRL A,BUFFER2   ;porovnej BUFFER1 a BUFFER2
   JNZ RDSS                   ;při neshodě provádí celé čtení znova
   MOV A,BUFFER1+1     ;porovnej BUFFER1+1 a BUFFER2+1
   XRL A,BUFFER2+1      ;při neshodě provádí celé čtení znova
   JNZ RDS      ;(při nenulovosti A provede skok)
   CALL ZOBRAZ    ;zobraz na LCD výsledky

Piitr

#17 Příspěvek od Piitr »

Máš tam chyby:
Třeba to JNB u TST1 skáče na DOPLN. To je do jiného cyklu.
Těch 11 bitů načtených na začátku nepočítáš a načteš k nim dalších 26.
Ten cyklus máš stavěnej nějak divně. Nulový bity ti to nepočítá.

Já bych to udělal nějak takhle:
Ten offset jsem vzal 0011111100, to je ten první.
Do BUFFER1 by se měla dát nula. Ale pokud má být jinej offset, tak vyjde asi něco jiného.

Kód: Vybrat vše

RDS:   MOV DPTR,#05B9h   ;polynom 101 1011 1001
   MOV R1,#26   ;pocet prijimanych bitu
   MOV A,#0   ;nuluj zbytek
   MOV B,#0
DALSI:   CALL RDSCTI1   ;dalsi bit do C
   RLC A      ;nasun do zbytku
   XCH A,B
   RLC A
   XCH A,B
   JNB B.2,NULA   ;testuj bit 2 na 10
   XRL A,DPL   ;xor
   XCH A,B
   XRL A,DPH
   XCH A,B
NULA:   DJNZ R1,DALSI   ;zkus dalsi bit
   XRL A,#0FCh   ;pridej offset, nizsi bajt
   XCH A,B
   XRL A,#000h   ;vyssi bajt offsetu
   ORL A,B      ;testuj BA na nulu
   MOV BUFFER1,A   ;uloz vysledek, mel by byt nula
Piitr

#18 Příspěvek od Piitr »

Ještě, pokud použiješ ten můj kód, tak vyndej z toho RDSCTI1 tu instrukci DEC R1. To by se to odečítalo 2x. Správně se má odečítat jen tím DJNZ.
Uživatelský avatar
msar
Příspěvky: 357
Registrován: 22 dub 2006, 00:00
Bydliště: Hradec Králové

#19 Příspěvek od msar »

Díky moc, už to funguje. :D Program budu muset ještě hodně vyladit (načtení celého názvu stanice trvalo asi 5 minut). Na fotce je mé zkušební zapojení, frekvenci 96,2MHz jsem si nastavil a RDS načetlo název stanice.
Přílohy
rds_radio.JPG
(127.77 KiB) Staženo 82 x
Piitr

#20 Příspěvek od Piitr »

Za málo. To je bezva, že to šlape. Jestli je to pomalý kvůli tomu, že to má při příjmu hodně velkou chybovost, tak byl možná pomohlo opravovat jednu chybu. Asi nejjednodušší řešení je, že pokud ti nevyjde součet, tak postupně projdeš všech 26 bitů a zkusíš, jestli není chyba zrovna v něm. To uděláš tak, že ho otočíš a spočítáš znova celý kontrolní součet. Když to pomůže, je hotovo. Když to nepomůže, tak ten bit vrátíš a zkusíš otočit zase jiný. Pokud nepomůže otočit ani jeden, tak to neopravíš, protože tam je víc chyb.
Uživatelský avatar
msar
Příspěvky: 357
Registrován: 22 dub 2006, 00:00
Bydliště: Hradec Králové

#21 Příspěvek od msar »

Už jsem opravil chybu. V případě že kontrolní výsledek nevyjde 0 jsem 26 bitů načítal znova, ale musí se udělat zpozdění v délce 1 přijímaného bitu abych nenačítal totéž chybné slovo, ale těch 26bitů posunutých o 1bit. Takhle trvá načtení informace asi 5 sekund.
Další věc je že na některých stanicích se název stanice přepisuje chybnými písmeny. Nebo vypisuje nesmysly. Počítám totiž jen kontrolní výpočet z prvních 26 bitů, a ne z dalších třech 26 bit slov. Tam se asi musí počítat s jiným slovem z annexu.
Odpovědět

Zpět na „Poradna“