Sir Cachelot schrieb:Da freu ich mich ja schon auf gefakte TMC-Infos in deiner Nähe 8)![]()
Windi schrieb:Was für eine Reichweite hat denn der Sender?
Ist doch bestimmt nicht postalisch.
Genau so was in der Art schwebt mir vor.Sir Cachelot schrieb:Wäre aber trotzdem lustig als GC Station auf einem Parkplatz [/i]
wallace&gromit schrieb:Auchhabenwill!
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: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.
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.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 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.radioscout schrieb:Irgendein Muggel wird beim Googeln auf Deine Cachebeschreibung stoßen und das der Behörde melden.
#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) ;
}