Sparrow-Anzeige für ein Scan-Radio    

von Hermann Nieder                          
Elektronik-Labor  Projekte  AVR  Sparrow          



Das Bild zeigt ein Scan-Radio mit einem KT0837 , das es einmal im Zeitschriftenhandel zu kaufen gab. Auf der Platine  wurden drei kleine Miniaturtaster angelötet und von den Pins GND, AVDD, SCL und SDA des Radio-ICs Leitungen nach außen geführt, wie es Burkhard Kainka  an anderer Stelle (KT0837.html) erläutert hat.

 


Dieses Bild zeigt die Oberseite der am Scan-Radio zur Aufnahme einer Sparrow-Platine befestigten Lochrasterplatine. Auf der Unterseite der Mikrocontroller-Platine sind  zu diesem Zweck Adapterstifte angelötet. Auf der Lochrasterplatine befinden sich Reihen mit Präzisionskontakten, in die man die  Sparrow-Platine mit dem Adapter einstecken kann. Vier Leitungen Schaltdraht verbinden die Pins GND, AVDD, SCL sowie SDA des Scan-Radios mit den Anschlüssen GND, Vcc, PB3 und PB4 des ATtiny13. Zwei Micro-Zellen zu je 1,5 V dienen als Spannungsversorgung für das kleine Radio und die Sparrow-Platine.  Es werden außer einem kleinen Schalter, der es erlaubt, die Mikrocontroller-Platine gesondert ein- und auszuschalten, keine weiteren Bauteile benötigt.  



Dieses Bild zeigt die Unterseite der Lochrasterplatine.

Es ist mir gelungen, den ATtiny13 auf der Sparrow-Platine  in C so zu programmieren, dass für das Scan-Radio wahlweise eine  Frequenz- oder eine Lautstärkeanzeige möglich ist. Die Leuchtdiode am Portpin PB1, dem PWM-Ausgang, dient dabei als Anzeigeelement. Ein Teil des  C-Programm-Listings  für den ATtiny13 auf der Sparrow-Platine wurde in Anlehnung an dasjenige für dasSparrow-Voltmeter (SparrowContest3.html) gestaltet. Die Funktionen für die Darstellung der Ziffern sind ähnlich ausgeführt.



Wird das Scan-Radio eingeschaltet, „läuft“ es zunächst auf „voller“ Lautstärke. Unmittelbar nach dem Einschalten der Platine mit dem ATtiny13 stellt dieser die Lautstärke auf einen „angenehmen“ Wert, hier 8,  ein. Nun kann man die Scan-Taste am Radio drücken, bis ein Sender gefunden worden ist. Betätigt man danach auf der Sparrow-Platine Taste S1 („Freq.“), blinkt zunächst die grüne LED im Rhythmus des Morsezeichens „F“ (Frequenz), und dann folgen die Zeichen zur Anzeige der Ziffern für die Empfangsfrequenz, und zwar mit dem Zeichen für einen Dezimalpunkt. Drückt man die Taste S2 („Lautst.“), wird das Morsezeichen „L“ für Lautstärke „geblinkt“, und darauf folgen die Zeichen für den gerade eingestellten Wert derselben. Bei der Fequenz- und der Laustärkeanzeige  werden „unnötige“ Nullen jeweils „ausgeblendet“. Hat man den gewünschten Sender eingestellt und sich dessen Sendefrequenz anzeigen lassen, kann die Spannungsversorung zur Sparrow-Platine wieder mithilfe des oben erwähnten kleinen Schalters unterbrochen werden, z. B. um Energie zu sparen. Es wurde bewusst die PWM-Ausgabe an Pin PB2 des ATtiny13 auf der Sparrow-Platine verwendet, damit auch z.B.   mithilfe eines Piezo-Schallgebers die oben erwähnten Morsezeichen  auch hörbar gemacht werden können. Die Nutzung dieser Option empfiehlt sich allerdings nicht, wenn man einmal mit dem Scan-Radio nachts „heimlich“ Radiosendungen hören möchte, während die Partnerin schläft. In diesem Fall genügt die „Lichtanzeige“, die sich abschalten lässt, wenn der gewünschte Sender gefunden ist..


Download: Sp_ScanRD_T13.zip


Sparrow APP

share.cheepit.net


/* Sp_freq2.c */
/* 21.03.2015*/
#include <avr/io.h>
#include <util/delay.h>
unsigned int F;
unsigned char Ziffer,Hi,Lo,wert,times,dat,j,R;

#define setbit(P,BIT) ((P) |= (1<<(BIT)))
#define clearbit(P,BIT) ((P) &=~(1<<(BIT)))

// SDA PORTB.4
// SCL PORTB.3

void Blink_gn_k()
{
OCR0B=80;
_delay_ms(150);
OCR0B=0;
_delay_ms(150);
}

void Blink_gn_L()
{
OCR0B=80;
_delay_ms(450);
OCR0B=0;
_delay_ms(150);
}

void Tonausgabe()
{
switch(Ziffer)
{
case 0:
Blink_gn_L();// Bezeichnungen in Anlehnung
Blink_gn_L();// an Sparrow-Programm
Blink_gn_L();// mit "LED-Morsezeichen"
Blink_gn_L();
Blink_gn_L();
_delay_ms(300);
break;
case 1:
Blink_gn_k();
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
_delay_ms(300);
break;
case 2:
Blink_gn_k();
Blink_gn_k();
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
_delay_ms(300);
break;
case 3:
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_L();
Blink_gn_L();
_delay_ms(300);
break;
case 4:
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_L();
_delay_ms(300);
break;
case 5:
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
_delay_ms(300);
break;
case 6:
Blink_gn_L();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
_delay_ms(300);
break;
case 7:
Blink_gn_L();
Blink_gn_L();
Blink_gn_k();
Blink_gn_k();
Blink_gn_k();
_delay_ms(300);
break;
case 8:
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
Blink_gn_k();
Blink_gn_k();
_delay_ms(300);
break;
case 9:
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
Blink_gn_L();
Blink_gn_k();
_delay_ms(300);
break;
default:
break;
}
}


void mydelay(int times)
{
while(times--)
{
_delay_ms(1);
}
}

void I2c_init()

{
setbit(PORTB,4); //SDA=1
//mydelay(1);
setbit(PORTB,3);// SCL=1
}

void pulse_SCL()
{
setbit(PORTB,3);//SCL=1
//mydelay(1);
clearbit(PORTB,3);//SCL=0
//mydelay(1);
}

void I2c_start()
{
clearbit(PORTB,4);//SDA=0
//mydelay(1);
clearbit(PORTB,3);//SCL=0
}

void I2c_stop()
{
clearbit(PORTB,4);//SDA=0
//mydelay(1);
setbit(PORTB,3);//SCL=1
//mydelay(1);
setbit(PORTB,4);//SDA=1
}

void I2c_ack()
{
clearbit(PORTB,4);//SDA=0
pulse_SCL();

}

void I2c_noack()
{
setbit(PORTB,4);//SDA=1
//mydelay(1);
pulse_SCL();
}

void I2c_write(wert)
{
setbit(DDRB,4);//PORTB.4 ist Ausgang
dat=wert;
for (j=0;j<8;j++)
{
if(dat & 128)
{
setbit(PORTB,4);//SDA=1
//A_Reg=1;
}
else
{
clearbit(PORTB,4);//SDA=0
//A_Reg=0;
}

//mydelay(1);
pulse_SCL();
dat=dat<<1; // 1 Bit nach links
}
clearbit(PORTB,4);//SDA=0
pulse_SCL();
}

void I2c_read()
{
dat=0;
clearbit(DDRB,4); //PORTB.4 ist hier Eingang
//mydelay(1);
for(j=0;j<8;j++)
{
dat=dat<<1; // 1 Bit nach links
//mydelay(1);
setbit(PORTB,3);//SCL=1
//mydelay(1);
if (PINB & 0b00010000) //if(SDA)
{
//A_Reg=1;

dat=dat+1;
}

mydelay(1);
clearbit(PORTB,3);//SCL=0
//mydelay(1);
}
setbit(DDRB,4); //PORTB.4 ist wieder Ausgang

}


void Reg_write(wert)
{
I2c_write(wert);
//mydelay(1);
I2c_init(); //neu
//mydelay(1);
I2c_start();
}

void Read_reg(R)
{
I2c_start();
//mydelay(1);
I2c_write(0x6E);
Reg_write(R);
I2c_init();//
I2c_start();
I2c_write(0x6F);
I2c_read();
//mydelay(1);
Hi=dat;
I2c_ack();
I2c_read();
Lo=dat;
//mydelay(1);
I2c_noack();
mydelay(1);
I2c_stop();
}



int main(void)
{
DDRB=0b00011010; // PORTB.1 .. PORTB.4 sind Ausgaenge

TCCR0A=0b00100011; // PWM b
TCCR0B=0b00000010; // Vorteiler /8
OCR0B=0;

I2c_init();

//Zuerst Lautstaerke auf "angenehmen Wert" einstellen
R = 4;
I2c_start();
I2c_write(0x6E);
I2c_write(R);
I2c_write(0x40);
I2c_write(0x08);
I2c_stop();


while(1)
{
if(!(PINB &(1<<PB2)))//if 0
{
Blink_gn_k();//Zeichen "L"
Blink_gn_L();//fuer Lautstaerke
Blink_gn_k();
Blink_gn_k();
_delay_ms(300);
Read_reg(0x04);
//A_Reg=Lo;
Ziffer=Lo/10; // 1. Ziffer
//Null "ausblenden"
if(Ziffer>0)
{
Tonausgabe();
_delay_ms(300);
}
Ziffer=Lo%10;
Tonausgabe();
_delay_ms(300);
}//end if 0

if(!(PINB &(1<<PB0)))//if 1
{
Blink_gn_k();//Zeichen "F"
Blink_gn_k();// fuer Frequenz
Blink_gn_L();
Blink_gn_k();
_delay_ms(300);
//Frq_lesen();
Read_reg(0x13);
//Umrechnung in 'brauchbare' Werte
F=Hi*256;
F=F+Lo;
F=F*5;
F=F+6400; //F ist z. B. bei 104.7 MHz 10470

Ziffer=F/10000;
if(Ziffer>0) // Null "ausblenden"
{ // bei Frequenzen unter 100 MHz
Tonausgabe();
_delay_ms(300);
}
F=F%10000;//F_wert=F%10000;
Ziffer=F/1000;//Ziffer=F_wert/1000
F=F%1000;//F=F_wert%1000
Tonausgabe();
Ziffer=F/100;//Ziffer =F/100
Tonausgabe();
F=F%100;//F_wert=F%100
Blink_gn_k();//"Dezimalpunkt"
Blink_gn_L();//
Blink_gn_k();
Blink_gn_L();
Blink_gn_k();
Blink_gn_L();
_delay_ms(300);
Ziffer=F/10;
Tonausgabe();

}
} // end while(1)
} // end main



Elektronik-Labor  Projekte  AVR  Sparrow