/***************************************************** Project : FG2206 Version : 001 Date : 06.01.2011 Author : Alexander C. Frank Company : ETH Zürich, QuantumOptics Comments: DISCLAIMER: EVEN THE AUTHOR WORKS AT A FAMOUS UNIVERSITY DOES NOT IMPLY GENIOUS SOURCE-CODE !!! Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 4.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include #include #include #include unsigned long int overrun; // counts overflow of counter 0 unsigned int loop; // counts loops :-) #define Hz PORTB.2 #define kHz PORTB.1 #define SEGMENT_A PORTC.5 #define SEGMENT_B PORTC.3 #define SEGMENT_C PORTC.1 #define SEGMENT_D PORTD.0 #define SEGMENT_E PORTD.1 #define SEGMENT_F PORTC.4 #define SEGMENT_G PORTC.2 #define SEGMENT_DP PORTC.0 #define ZIFF1 PORTB.0 #define ZIFF2 PORTD.7 #define ZIFF3 PORTD.6 #define ZIFF4 PORTD.5 unsigned char stelle; // selects number of display 1,2,3,4 unsigned int time; // 1-10, counts rounds, 4 digits * 5 ms * 10 rounds = measurement period "gate" = 200 ms unsigned char decimal; // position of decimal point 1,2,3,4 unsigned char ziffer[5]; // holds the digits unsigned long int impulse; unsigned long int frequenz; float freq; unsigned char next; bit someone_switched_power_on = 1; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here } // Timer 0 overflow interrupt service routine ............................................................... interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // INCREMENT COUNTER :-) overrun++; } // Timer1 output compare A interrupt service routine >>> happens all 2 ms ............................. interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // set next compare value ( 1000 * 1/500kHz = 2 ms) OCR1A = OCR1A + 1000; // proceed to next digit ... stelle++; if (stelle > 4) {stelle = 1;}; // New measurement ready ... after 250 x 2 ms = 500 ms time++; if (time >= 250) { impulse = 256 * overrun + TCNT0; TCNT0=0; frequenz = 2 * impulse ; if ((frequenz >= 1)&&(frequenz < 10)) { freq = frequenz * 1000; decimal=1; Hz=1; kHz=0; }; if ((frequenz >= 10)&&(frequenz < 100)) { freq = frequenz * 100; decimal=2; Hz=1; kHz=0; }; if ((frequenz >= 100)&&(frequenz < 1000)) { freq = frequenz * 10; decimal=3; Hz=1; kHz=0; }; if ((frequenz >= 1000)&&(frequenz < 10000)) { freq = frequenz ; decimal=1; Hz=0; kHz=1; }; if ((frequenz >= 10000)&&(frequenz < 100000)) { freq = frequenz / 10; decimal=2; Hz=0; kHz=1; }; if (frequenz >= 100000) { freq = frequenz / 100; decimal=3; Hz=0; kHz=1; }; ziffer[1]=floor(freq/1000); freq=freq-1000*ziffer[1]; ziffer[2]=floor(freq/100); freq= freq-100*ziffer[2]; ziffer[3]=floor(freq/10); freq=freq-10*ziffer[3]; ziffer[4]=floor(freq); overrun = 0; time=0; }; } // FUNCTIONS void grussbotschaft (void) { SEGMENT_A=0;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=0;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=1; // H ZIFF4=0; ZIFF1=1; delay_ms(5); SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=0; // O ZIFF1=0; ZIFF2=1; delay_ms(5); SEGMENT_A=0;SEGMENT_B=0;SEGMENT_C=0;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=0; // L ZIFF3=1; ZIFF2=0; delay_ms(5); SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=0;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=1; // A ZIFF4=1; ZIFF3=0; delay_ms(5); ZIFF4=0; }; void displaytest (void) { SEGMENT_DP=1; Hz=1; kHz=1; SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=1; // 8 ZIFF4=0; ZIFF1=1; delay_ms(5); ZIFF1=0; ZIFF2=1; delay_ms(5); ZIFF3=1; ZIFF2=0; delay_ms(5); ZIFF4=1; ZIFF3=0; delay_ms(5); ZIFF4=0; Hz=0; kHz=0; SEGMENT_DP=0; }; void output (unsigned char zeichen) { if (zeichen == 0 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=0; }; if (zeichen == 1 ) { SEGMENT_A=0;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=0;SEGMENT_E=0;SEGMENT_F=0;SEGMENT_G=0; }; if (zeichen == 2 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=0;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=0;SEGMENT_G=1; }; if (zeichen == 3 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=0;SEGMENT_F=0;SEGMENT_G=1; }; if (zeichen == 4 ) { SEGMENT_A=0;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=0;SEGMENT_E=0;SEGMENT_F=1;SEGMENT_G=1; }; if (zeichen == 5 ) { SEGMENT_A=1;SEGMENT_B=0;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=0;SEGMENT_F=1;SEGMENT_G=1; }; if (zeichen == 6 ) { SEGMENT_A=1;SEGMENT_B=0;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=1; }; if (zeichen == 7 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=0;SEGMENT_E=0;SEGMENT_F=0;SEGMENT_G=0; }; if (zeichen == 8 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=1;SEGMENT_F=1;SEGMENT_G=1; }; if (zeichen == 9 ) { SEGMENT_A=1;SEGMENT_B=1;SEGMENT_C=1;SEGMENT_D=1;SEGMENT_E=0;SEGMENT_F=1;SEGMENT_G=1; }; }; void on (unsigned char stelle) { if (stelle == 1 ) { ZIFF1=1;ZIFF2=0;ZIFF3=0;ZIFF4=0; }; if (stelle == 2 ) { ZIFF1=0;ZIFF2=1;ZIFF3=0;ZIFF4=0; }; if (stelle == 3 ) { ZIFF1=0;ZIFF2=0;ZIFF3=1;ZIFF4=0; }; if (stelle == 4 ) { ZIFF1=0;ZIFF2=0;ZIFF3=0;ZIFF4=1; }; }; void off (void) { ZIFF1=0; ZIFF2=0; ZIFF3=0; ZIFF4=0; }; void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0x07; // Port C initialization // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTC=0x00; DDRC=0x3F; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=0 State0=0 PORTD=0x00; DDRD=0xE3; // Timer/Counter 0 initialization // Clock source: T0 pin Rising Edge TCCR0=0x07; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 500.000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x09; OCR1AL=0xC4; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: Off // GICR|=0x40; // MCUCR=0x03; // GIFR=0x40; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x11; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // Global enable interrupts #asm("sei") // DISPLAYTEST :-) loop=0; while (loop < 100) { displaytest(); loop++; }; // HELLO :-) loop=0; while (loop < 250) { grussbotschaft(); loop++; }; delay_ms(2000); ziffer[0]=0; ziffer[1]=0; ziffer[2]=0; ziffer[3]=0; ziffer[4]=0; while (someone_switched_power_on) { output(ziffer[stelle]); on(stelle); SEGMENT_DP=0; if (decimal == stelle) {SEGMENT_DP=1;}; }; }