/* Sp_Spg1.c */
/* 08.03.2015*/
#include <avr/io.h>
#include <util/delay.h>
unsigned long AD_wert,U_wert,Ur_wert;
int AD_dat,Ziffer,U,U_anzg,Urest;
#define setbit(P,BIT) ((P) |= (1<<(BIT)))
#define clearbit(P,BIT) ((P) &=~(1<<(BIT)))
void Blink_grn_k()//kurzes Blinken gruene LED
{
setbit(PORTB,PB1);
_delay_ms(150);
clearbit(PORTB,PB1);
_delay_ms(150);
}
void Blink_grn_L()//langes Blinken gruene LED
{
setbit(PORTB,PB1);
_delay_ms(450);
clearbit(PORTB,PB1);
_delay_ms(150);
}
void Blink_rt_k()//kurzes Blinken rote LED
{
setbit(PORTB,PB3);
_delay_ms(150);
clearbit(PORTB,PB3);
_delay_ms(150);
}
void Blink_rt_L()// langes Blinken rote LED
{
setbit(PORTB,PB3);
_delay_ms(450);
clearbit(PORTB,PB3);
_delay_ms(150);
}
void Blinkanzeige()// Blinkanzeige von Ziffern
{ // in Form von "sichtbaren"
switch(Ziffer) // Morsezeichen
{
case 0:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 1:
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 2:
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 3:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
Blink_rt_L();
_delay_ms(300);
break;
case 4:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_L();
_delay_ms(300);
break;
case 5:
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 6:
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 7:
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 8:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
Blink_rt_k();
_delay_ms(300);
break;
case 9:
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_L();
Blink_rt_k();
_delay_ms(300);
break;
default:
break;
}
}
void AD_start()
{
ADCSRA |= (1<<ADSC); // ADC starten
while(ADCSRA & (1<<ADSC));// warten, bis ADSC wieder auf Null
ADCSRA |=(1<<ADSC);
while(ADCSRA & (1<<ADSC));
}
void Anzeige_bt()// "Byteanzeige"
{
_delay_ms(2000);
AD_dat=ADCH;
Ziffer=AD_dat/100;
Blinkanzeige();
U=AD_dat%100;
U_anzg=U/10;
Urest=U%10;
Ziffer=U_anzg;
Blinkanzeige();
Ziffer=Urest;
Blinkanzeige();
_delay_ms(300);
Blink_grn_L(); // Zeichen "D"
Blink_grn_k(); // fuer "dezimale"
Blink_grn_k(); // Anzeige eines Bytes
}
int main(void)
{
DDRB=0b00001010; // PORTB.1 und PORTB.3 sind Ausgaenge
ADCSRA =(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);// Division Fact. 8
ADMUX=(1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //int . Referenz, 8-Bit-Messung
// ADC2 (PB4)
while(1)
{
if(!(PINB &(1<<PB0)))//if 1
{
AD_start(); // Wenn S1 gedrueckt,
Anzeige_bt(); // Anzeige eines
// Bytes
} // end if 1
if(!(PINB &(1<<PB2)))//if 2
{ // Wenn S2 gedrueckt,
AD_start(); // Anzeige der Spannung
_delay_ms(1000); // in Volt
AD_wert=ADCH;
AD_wert=AD_wert*43;//wegen 1.1/255=0.0043
AD_wert=AD_wert*11; // Umrechnungsfaktor,
Ziffer=AD_wert/10000;//mithilfe von
Blinkanzeige(); //D.-Multimeter ermittelt
Blink_grn_k();//"Dezimalpunkt"
Blink_grn_L();// mit gruener LED
Blink_grn_k();
Blink_grn_L();
Blink_grn_k();
Blink_grn_L();
_delay_ms(300);
U_wert=AD_wert%10000;
Ziffer=U_wert/1000;
Ur_wert=U_wert%1000;
Blinkanzeige();
Ziffer=Ur_wert/100;
Blinkanzeige();
Blink_grn_k(); //Zeichen "V" fuer "Volt"
Blink_grn_k(); // mit gruener LED
Blink_grn_k(); //
Blink_grn_L();
_delay_ms(300);
}//end if 2
} // end while(1)
} // end main