Hallo ich bins nochmal, der "egal"
Ich habe damals als Ausgangspunkt ne Arduino Library gehabt die
eigentlich recht gut implementiert war, bis eben auf die blockierende
RDS Funktion was müll war.
Ich habe die dann umgeschrieben:
1 | void Si4703_Breakout::readRDS(char* buffer)
|
2 | {
|
3 |
|
4 | readRegisters();
|
5 | byte blockerrors = (si4703_registers[STATUSRSSI] & 0x0600) >> 9;
|
6 | if (blockerrors!=0) return;
|
7 | if(si4703_registers[STATUSRSSI] & (1<<RDSR)){
|
8 |
|
9 | byte Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl;
|
10 | Ah = (si4703_registers[RDSA] & 0xFF00) >> 8;
|
11 | Al = (si4703_registers[RDSA] & 0x00FF);
|
12 |
|
13 | Bh = (si4703_registers[RDSB] & 0xFF00) >> 8;
|
14 | Bl = (si4703_registers[RDSB] & 0x00FF);
|
15 |
|
16 | Ch = (si4703_registers[RDSC] & 0xFF00) >> 8;
|
17 | Cl = (si4703_registers[RDSC] & 0x00FF);
|
18 |
|
19 | Dh = (si4703_registers[RDSD] & 0xFF00) >> 8;
|
20 | Dl = (si4703_registers[RDSD] & 0x00FF);
|
21 |
|
22 |
|
23 | //Gruppe 0
|
24 | if ( (Bh&0xF0)==0 && (Bl&0x10)==0) {
|
25 | unsigned int number = (Bl&0x03);
|
26 |
|
27 | if (number==0) {
|
28 | buffer[0]=Dh;
|
29 | buffer[1]=Dl;
|
30 |
|
31 | }
|
32 | if (number==1) {
|
33 | buffer[2]=Dh;
|
34 | buffer[3]=Dl;
|
35 | }
|
36 | if (number==2) {
|
37 | buffer[4]=Dh;
|
38 | buffer[5]=Dl;
|
39 | }
|
40 | if (number==3) {
|
41 | buffer[6]=Dh;
|
42 | buffer[7]=Dl;
|
43 | }
|
44 |
|
45 | }
|
46 |
|
47 |
|
48 | delay(40); //Wait for the RDS bit to clear
|
49 | }
|
50 | else {
|
51 | delay(30); //From AN230, using the polling method 40ms should be sufficient amount of time between checks
|
52 | }
|
53 |
|
54 |
|
55 | buffer[8] = '\0';
|
56 | }
|
Diese Funktion musst du in Dauerschleife aufrufen. Sie blockiert vor
allem nicht mehr. Der übergebene Buffer füllt sich dann mit der Zeit
nach und nach je nachdem wie die Pakete reinkommen.
Am besten du überprüfst ob sich in dem Char-Buffer irgendwas geändert
hat und verbindest das dann mit einem Update auf dem Display.