/* 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