• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

RDS Text auf RDS Radio Display / GC Station

fulbrich

Geocacher
Moin zusammen,
ich wollte Euch mal was zeigen :shock: ... nette Spielerei was :D
Da werden doch automatisch Cachehinweise als Text im Display eines RDS Autoradios angezeigt.



Habt Ihr sowas schon mal gesehen ?
 
OP
F

fulbrich

Geocacher
Ich zeig mal wie es geht. Ich habe es einmal ganz kurz ausprobiert um mal zu sehen, ob es praktisch tatsächlich funktioniert.
Die Schaltung kommt aus der ELEKTOR 5/2007 S.24 "ATtiny als RDS-Testsender" und besteht hauptsächlich aus 2 ICs... sehr übersichtlich.



Der ATTiny 2313 wird in C programmiert und sendet in UKW seine RDS Kennung, bzw. Fließtext. Wie hier nochmal auf einen portablen UKW RDS Radio dargestellt.

Die Sache ist natürlich höchst illegal, weswegen ich das Ding natürlich sofort wieder auseinandergenommen habe. Wäre aber trotzdem lustig als GC Station auf einem Parkplatz :D
 

Sir Cachelot

Geoguru
Windi schrieb:
Was für eine Reichweite hat denn der Sender?
Ist doch bestimmt nicht postalisch.

nee, siehe oben
Die Sache ist natürlich höchst illegal, weswegen ich das Ding natürlich sofort wieder auseinandergenommen habe. Wäre aber trotzdem lustig als GC Station auf einem Parkplatz
 

bitcompressor

Geocacher
Hallo zusammen

das finde ich richtig spannend, mal ne Frage an die Spezis.

Mal die Postalischen Sachen kurz außer acht gelassen. Wenn ich das Teil zusammen löte bzw. den fertigen Bausatz kaufe (wird dort ja angeboten) muß das Teil doch noch programmiert werden, wie geht das, was benötigt man dann noch, ist dafür tiefgreifendes Wissen in C notwendig oder versteh man das?
:?:

Da ja nichts senden darf was die Post/Telekom oder wer auch immer zugelassen hat, ist die Frage was denn mit den ganzen Transmittern für die MP3 Player ist die dürfen doch scheinbar auch "alle", wenn denn nun die Reichweite sehr gering ist und nur z.b. für nur wenige Minuten.

Ich hatte daran gedacht einen Multi Cache zu machen bei dem ein bestimmter Punkt angefahren oder gelaufen werden muß und dann dort die cords für die nächste Station übermittelt werden.

Er wird dann wohl doch nur bei der Idee bleiben.

bis dahin und Gruß bitcompressor
 

radioscout

Geoking
bitcompressor schrieb:
Da ja nichts senden darf was die Post/Telekom oder wer auch immer zugelassen hat, ist die Frage was denn mit den ganzen Transmittern für die MP3 Player ist die dürfen doch scheinbar auch "alle", wenn denn nun die Reichweite sehr gering ist und nur z.b. für nur wenige Minuten.
Die haben in .de seit kurzem eine Zulassung durch die BNetzA erhalten. Allerdings auch nicht alle sondern nur die mit einer sehr kleinen Senderleistung (10 uW?). Nicht jedes Importgerät darf hier benutzt werden.


bitcompressor schrieb:
Ich hatte daran gedacht einen Multi Cache zu machen bei dem ein bestimmter Punkt angefahren oder gelaufen werden muß und dann dort die cords für die nächste Station übermittelt werden.
Das ist keine bestimmungsgemäße Verwendung. Diese Transmitter dürfen nur benutzt werden, um Musik (und Sprache) von tragbaren Audiogeräten zu einem Radio ohne Audioeingang (i.A. ein Autoradio) zu übertragen.

Auch wenn aufgrund der geringen Reichweite keiner gestört wird, wenn auf einer "freien" UKW-Frequenz irgendwo im Wald im Umkreis von 3 Metern eine Ansage zu hören ist: Irgendein Muggel wird beim Googeln auf Deine Cachebeschreibung stoßen und das der Behörde melden.
 

Windi

Geoguru
radioscout schrieb:
Irgendein Muggel wird beim Googeln auf Deine Cachebeschreibung stoßen und das der Behörde melden.
Das hätte ich jetzt keine Angst. Dann schreibt man in die Cachebeschreibung halt nur dass man ein Autoradio mit RDS benötigt. Was man dann genau machen muss kann man ja irgendwo vor Ort deponieren.
 

Sir Cachelot

Geoguru
Die Leistung ist meines Wissens 10nW.
10 millionstel watt - bei der leistung kannste theoretisch den cache mit dem radio suchen (ohne richtantenne und dämpfer) , da die reichweite kaum größer als 5 meter ist.
 
OP
F

fulbrich

Geocacher
Ich wurde gefragt, wie man einen AVR programmiert und möchte zum Einlesen diesen Link posten :
http://www.mikrocontroller.net/articles/AVR_In_System_Programmer

Er beschäftigt sich mit Programmern und Programmiersoftware, um die .hex files auf den Chip zu brennen.

Eine kleine Einführung :
http://www.roboternetz.de/wissen/index.php/AVR-Einstieg_leicht_gemacht
 
OP
F

fulbrich

Geocacher
So sieht der Original Quellcode von dem Elektor-Verlag aus, den man anpassen muß. Der Quellcode zu diesem Projekt ist frei herunterladbar.
http://www.elektor.de

Der Stationsname und der RDS Text wird so definiert :
char name[] = "ELEKTOR."; // im RAM !!
char text[] = "RADIOTEXT IST OK"; // im RAM !!

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>


// Hardware connections:
// 20 pin ATtiny 2313

// pin 5  XTAL1  input  : 11.592 MHz VXCO clock input
// pin 6  PD2    output : 57 kHz interrupt signal
// pin 7  PD3    output : RDS Bit Clock 1.1875kHz
// pin 8  PD4    output : CRC-Calc active high
// pin 9  PD5    output : Frame-sync for test-sequence
// pin 12 PB0    input  : TA traffic-announcement, low-active
// pin 13 PB1    input  : TP traffic-programme, high-active
// pin 14 PB2    input  : set Test-Mode, low-active
// pin 15 PB3 (OC1A) out: RDS modulation signal


// parameters for 11.0592 MHz clock
// 11.059200MHz/57kHz=194.021052.... truncated gives 194
//   0.021052...*2^15=689.85...      rounded gives 690


// this is the fractional value for PWM adjustment
#define deltaDDS 690

// the following two values are used for PWM control
#define TOP1 194 
#define TOP2 193 

// this defines the middle of the pwm signal, approximately 50 % duty cycle
#define MIDTH 97

// change PWM polarity by switching between these two values
#define MODE1 0b10000010 
#define MODE2 0b11000010

uint16_t DDS ;            // fractional 57kHz generation adder
uint8_t  BITtimer ;       // count 57 kHz cycles
uint16_t ShiftReg ;       // shift out RDSbits MSB first
uint16_t HoldReg ;        // hold register loads shift register
uint8_t  BitsInShiftReg ; // bits left to shift out
uint8_t  BitsInHoldReg ;  // bits copied into shift-register

uint8_t RDSbit ;          // differentially coded bit stream enters here, value 0 or 1 !!


// intrrupt rate is 57 kHz !!


ISR(TIMER1_OVF_vect) {
	asm volatile (" sbi 18,2 \n\t" ) ; 	// 18=PORTD  , signal interrupt on PD.2


// 15 bit DDS fractional generator
	DDS += deltaDDS ;
	if (DDS & 0x8000 )  { 
		ICR1 =TOP1 ;  }    // on overflow change PWM width
	  else { 
	    ICR1 =TOP2  ;} ; 
	DDS &=0x7fff ;         // wrap around

	 
	BITtimer++ ;
	if (BITtimer==24) { 
		asm volatile (" sbi 18,3 \n\t" ) ; 
		asm volatile (" sbi 18,5 \n\t" ) ; 	// 18=PORTD  	
		if (ShiftReg & 0x8000 ) { 
			RDSbit=1-RDSbit ; } ;
		if (RDSbit) { TCCR1A=MODE1 ; } else { TCCR1A=MODE2 ; } ;
		ShiftReg=ShiftReg<<1 ;
		BitsInShiftReg-- ;
	
		}
	  else if (BITtimer==48) { 
	 	BITtimer=0 ;  
		asm volatile (" cbi 18,3 \n\t" ) ; 	
		if (RDSbit) { TCCR1A=MODE2 ; } else { TCCR1A=MODE1 ; } ;
		if (BitsInShiftReg==0) { 
			BitsInShiftReg=BitsInHoldReg ; 
			ShiftReg=HoldReg ; 
			BitsInHoldReg=0 ; }
		} ;

	asm volatile (" cbi 18,2 \n\t" ) ; 		// 18=PORTD	signal end interrupt on PD.2
}




uint16_t Syndrom ; // rightmost 10 bits used ;

void PutBlock(uint16_t w , uint16_t ofs){
uint8_t j ;
	while(BitsInHoldReg!=0){} ; HoldReg=w ; BitsInHoldReg=16 ;
	
/**/asm volatile (" sbi 18,4 \n\t" ) ; 	// 18=PORTD  
	Syndrom=0 ;
	for (j=0 ; j<16 ; j++) {
		Syndrom=Syndrom<<1 ; // outgoing bi is at mask 0x0400
		if (w & 0x8000) { Syndrom ^= 0x0400 ; } // exor into outgoing bit
		w=w<<1 ;
		if ( Syndrom & 0x0400 ) { Syndrom ^= 0x1B9 ; }
		} ;
    Syndrom=(Syndrom^ofs)<<6 ;
/**/asm volatile (" cbi 18,4 \n\t" ) ; 	// 18=PORTD  

	while(BitsInHoldReg!=0){} ; HoldReg=Syndrom ; BitsInHoldReg=10 ;
	}


void SendGroup(uint16_t a,uint16_t b,uint16_t c,uint16_t d){
	PutBlock(a,0x00fc) ; // block A
	PutBlock(b,0x0198) ; // block B
	PutBlock(c,0x0168) ; // block C
	PutBlock(d,0x01b4) ; // block D
	} 


void send_test(){
	asm volatile (" cbi 18,5 \n\t" ) ; 	// 18=PORTD  
	while(BitsInHoldReg!=0){} ; 
	HoldReg=0x8CF8 ; BitsInHoldReg=16 ;
	}

char name[] = "ELEKTOR.";         // im RAM !!
char text[] = "RADIOTEXT IST OK"; // im RAM !!
uint8_t ms ;
uint8_t ta ;
uint8_t tp ;
uint16_t blkB ;

#define AFfiller 0xCDCD
#define PIcode   0x1234
#define GRP0A    0x0000
#define GRP2A    0x2000
#define PTY      0x1

void send_group0(uint8_t k){
	blkB=(PTY<<5)+(ms<<3)+(tp<<10)+(ta<<4) ;
	SendGroup(PIcode,blkB+GRP0A+k, AFfiller, name[2*k+1]+(name[2*k+0]<<8) ) ;	
}

void send_group2(uint8_t k){
	blkB=(PTY<<5)+(tp<<10) ;
	SendGroup(PIcode,blkB+GRP2A+k, text[4*k+1]+(text[4*k+0]<<8),text[4*k+3]+(text[4*k+2]<<8)) ;
}


int main(){

  DDRD =0b11111100 ; // enable outputs , bit 0,1=input
  PORTD=0b11111111 ; // pullups on on input pins
  
  DDRB =0b11111000 ; // enable outputs , bits 0,1 input
  PORTB=0b11111111 ; // pullups on on input pins
  

  					  // TIMER1 settings
  TCCR1A=0b10000010 ; // fast PWM TOP=ICR1
  TCCR1B=0b00011001	; // ck=XTAL
  OCR1A=MIDTH ;       // approx 1:1 duty cycle
  ICR1 = TOP1 ;       // TOP for fast PWM

  RDSbit=0 ;
  BITtimer=0 ;
  HoldReg=0x7 ;
  // Interupt enable for Timer1-Overflow 0100B 
  // TIMSK=0b00000100 ; // atmetga 8
  TIMSK=0b10000000 ; // at tiny 2313
  sei() ;


  while(1){ 
    ms=1 ;
	
    if (PINB & 1) { ta=0 ; } else { ta=1 ; } ;
	if (PINB & 2) { tp=1 ; } else { tp=0 ; } ;
	if (PINB & 4) {
		send_group0(0) ;
		send_group0(1) ;
		send_group0(2) ;
		send_group0(3) ;

		send_group2(0) ;
		send_group2(1) ;
		send_group2(2) ;
		send_group2(3) ;
		}
	  else {
	    send_test() ;
		}

	} ;
  return(0) ;
 }
 
Hallo,
mir gefällt die Idee immer mehr. Und wie steht im Heft der Elektor ("Obwohl der Testsender im UKW-Bereich nur eine sehr geringe Leistung
abstrahlt, sollte man seinen Ausgang über ein Stück Koaxkabel direkt mit
dem Antenneneingang des RDS-Radios verbinden. So wird die Abstrahlung des doch recht breiten Frequenzspektrum des Testsenders unterbunden und damit dem Telekommunikationsgesetz Genüge getan")
Also einfach den hinweis geben das sie es mit der Autoantenne verbiden sollen .... damit auch nicht der Sheriff ins spiel kommt :)

fulbrich könntest du noch ein Foto von der oberseite und der unterseite deiner Lochrasterplatine einstellen. (Ich will alles ganz genau sehen)
Leider verstehe ich noch nicht alles, bin ja einfach nicht von der Materie.
Es sind ja 2 Dateien. Eine .c Datei und eine .hex datei.
Welche Datei muss auf welchen Chip. (Chip 1 Atmel, Chip 2 ? )
Wie heist der 2 Chip ?
Und welchen Chipprogrammer hast du ?
Wie lange kann der Text maximal sein den ich eintragen kann ?

Mfg TeamWelleLager
 

bitcompressor

Geocacher
Hallo zusammen

Es hat mir keine Ruhe gelassen, ich habe mir gerade mal die Anleitung gezogen, versteh aber den Schaltplan nicht richtig, habe da noch einen Knoten im Hirn.

Da ich kein richtiger Elektroniker bin (hab damit mal in der Ausbildung ein bisschen zu tun gehabt, ist schon ne ganze Zeit her) muß ich mal Fragen.

Wo ist das Poti P1 das im Schaltplan eingezeichnet ist geblieben? und was schliesse ich an die beiden Pins unter dem Poti an(bezeichnet sind die mit RDS) oder was muß damit passieren. Gruß bitcompressor
 
Oben