/******************************************************* Project : CETH-60 B Version : 1.0 Date : 16.09.2014 Author : Alexander C. Frank Company : Comments: Chip type : ATmega128L Program type : Application AVR Core Clock frequency: 10.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 1024 *******************************************************/ // https://processing.org/reference/leftshift.html // http://bytes.com/topic/c/answers/945999-how-convert-float-unsigned-int // // #include #include #include #include #include // I2C Bus functions #include #define VFD_BUS_ADDRESS 0xAE // Declare your global variables here unsigned char i,j,k,m; // INFRARED ROUTINES #define IR PINE.7 unsigned long int IR_WAIT; unsigned char IR_ARRAY[256]; unsigned char IR_TEMP[128]; unsigned char IR_CODE[32]; unsigned char aux; // MENUE - DISPATCHER char menue; // COUNTER #define ADR0 PORTA.3 #define ADR1 PORTA.4 #define ADR2 PORTA.5 #define GATOR PINB.0 #define STORE_A PORTD.6 #define CLEAR_A PORTD.7 #define STORE_B PORTD.4 #define CLEAR_B PORTD.5 #define SOURCE_A PORTE.2 #define SOURCE_B PORTE.3 #define INPUT PINC // ////////////////////////////////////////////////////////////// unsigned long int REGISTER_A ; unsigned long int REGISTER_B ; unsigned char GATES_A ; unsigned char GATES_B ; char vfd_buffer[12] ; unsigned long int disp ; unsigned char PRESCALER_A = 2; unsigned char PRESCALER_B = 2; float GATE_TIME = 0.2384185791 ; float AUXA; float AUXB; char vorzeichen; // ////////////////////////////////////////////////////////////// // External Interrupt 4 service routine KNOB ROTATION interrupt [EXT_INT4] void ext_int4_isr(void) { bit AUTRE; AUTRE=PINE.5; // CLOCKWISE if ( AUTRE == 0 ) { menue++; if (menue >= 8) { menue = 0;}; } ; // COUNTER CLOCKWISE if ( AUTRE == 1 ) { if (menue == 0) { menue = 8;}; menue--; } ; } // External Interrupt 5 service routine KNOB ROTATION interrupt [EXT_INT5] void ext_int5_isr(void) { bit AUTRE; AUTRE=PINE.4; // CLOCKWISE if ( AUTRE == 0 ) { menue++; if (menue >= 8) { menue = 0;}; } ; // COUNTER CLOCKWISE if ( AUTRE == 1 ) { if (menue == 0) { menue = 8;}; menue--; } ; } // External Interrupt 6 service routine KNOB PRESSED interrupt [EXT_INT6] void ext_int6_isr(void) { // THIS SWITCHES BETWEEN LEVEL A AND LEVEL B // LEVEL A DISPLAYS MEASUREMENT MENUE, menue = 0 ... 7 // LEVEL B DISPLAYS MEASUREMENT, menue = 8 ...16 switch (menue) { case 0 : menue = 8; break; case 1 : menue = 9; break; case 2 : menue = 10; break; case 3 : menue = 11; break; case 4 : menue = 12; break; case 5 : menue = 13; break; case 6 : menue = 14; break; case 7 : menue = 15; break; case 8 : menue = 0; break; case 9 : menue = 1; break; case 10 : menue = 2; break; case 11 : menue = 3; break; case 12 : menue = 4; break; case 13 : menue = 5; break; case 14 : menue = 6; break; case 15 : menue = 16; break; case 16 : menue = 7; break; default : menue = 2; break; }; } #define DATA_REGISTER_EMPTY (1< 94) { i2c_write(0b00000000); i2c_write(0b00000000); i2c_write(0x00); }; // SPACE i2c_stop(); } void vfd_clear_screen() { for (i=0;i<12;i++) { j=33-3*i; vfd_send_char(j,99); }; } void vfd_test() { for (i=0;i<12;i++) { j=33-3*i; vfd_send_char(j,94); }; } void display_MHZ() { vfd_send_char(6,77); vfd_send_char(3,72); vfd_send_char(0,90); } void display_KHZ() { vfd_send_char(6,75); vfd_send_char(3,72); vfd_send_char(0,90); } void display_HZ() { vfd_send_char(3,72); vfd_send_char(0,90); } void vfd_display_number(unsigned char position, unsigned char number, unsigned char digits) { unsigned char comparator; if (digits == 3) { comparator = 900; while ( comparator >= number ) { comparator = comparator - 100 ; } ; number = number - comparator ; comparator = comparator / 100; vfd_send_char(position,48+comparator); position = position -3 ; digits-- ; }; if (digits == 2) { comparator = 90; while ( comparator >= number ) { comparator = comparator - 10 ; } ; number = number - comparator ; comparator = comparator / 10; vfd_send_char(position,48+comparator); position = position -3 ; digits-- ; }; if (digits == 1) { comparator = 9; while ( comparator >= number ) { comparator = comparator - 1 ; } ; number = number - comparator ; vfd_send_char(position,48+comparator); }; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DECODE THE INFRARED BITSTREAM ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void decode_NEC_infrared(void) { // READ THE INFRARED PORT AND DECODE "NEC" // 0) OUTPUT MESSAGE "PRESS KEY" vfd_send_char(33,80); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,83); vfd_send_char(21,83); vfd_send_char(18,95); vfd_send_char(15,75); vfd_send_char(12,69); vfd_send_char(9,89); vfd_send_char(6,95); vfd_send_char(3,95); vfd_send_char(0,95); vfd_byte_write (0b01000001, 0b00000110); // YELLOW LED ON // 1) WAIT FOR TRAFFIC. IR=1 MEANS IDLE. while ((IR == 1)&&(menue == 0)) { delay_us(1); }; // ENDLESS LOOP !!!! BUT ROTARY ENCODER GENERATES INTERRUPTS :-) IR_WAIT = 0; // STARTCONDITION : LOW PULSE FOR 9 ms // MEASURE LENGTH OF LOW SIGNAL ... while (IR == 0) { IR_WAIT++; delay_us(10); }; // CRITICAL VALUES WERE MINIMUM=617 AND MAXIMUM=622 FOR A 9 ms PULSE. AVERAGE=620 if ((IR_WAIT > 550) && (IR_WAIT < 650)) { // LOW PULSE WAS LONGER THAN 8 ms AND SHORTER THAN 10 ms // NOW WAIT FOR HIGH PULSE, 4.5 ms IR_WAIT = 0; while (IR == 1) { IR_WAIT++; delay_us(10); }; if ((IR_WAIT > 275) && (IR_WAIT < 325)) { // NOW WE START WITH BIT 0, LSB OF ADDRESS i=0; // POINTER FOR ARRAY, HOLDING THE TIMES. SET TO FIRST ELEMENT IR_WAIT = 0; do { // LOW PULSE HAS NO INFORMATION // WAIT FOR HIGH PULSE ... while (IR == 0) { delay_us(5); }; // JUST SIT AND WAIT :-) // COUNT THE LENGTH OF THE HIGH PULSE while (IR == 1) { IR_WAIT++; delay_us(5); }; IR_ARRAY[i] = IR_WAIT; i++; IR_WAIT = 0 ; } while (i<32); }; vfd_byte_write (0b01000001, 0b00000101); // GREEN ON, YELLOW LED OFF // DECODING STEP 1 // CONVERTING USED TIME INTO ZEROES AND ONES. // SHORT LOW PULSE (562.5 us) EQUALS APPROX 55. // LONG LOW PULSE (1.68 ms) EQUALS APPROX 170. // DECISION LEVEL IS 110. for (i=0;i<32;i++) { aux = IR_ARRAY[i]; if (aux < 110 ) { IR_ARRAY[i] = 0 ;} else { IR_ARRAY[i] = 1 ;}; }; // DECODING STEP 2 // CHECK IF BYTE 2 AND 4 ARE THE INVERSE OF BYTE 1 AND 3 // ... SKIPPED ... // DISPLAY RESULTS, USING HEXADECIMAL NOTATION (VFD HAS ONLY 12 DIGITS) for (i=0;i<8;i++) { IR_CODE[i] = IR_ARRAY[i*4+0]*1 + IR_ARRAY[i*4+1]*2 + IR_ARRAY[i*4+2]*4 + IR_ARRAY[i*4+3]*8 ; }; vfd_clear_screen(); vfd_send_char(33,78); vfd_send_char(30,69); vfd_send_char(27,67); vfd_send_char(24,95); for (i=0;i<8;i++) { aux = 21 - 3 * i; if (IR_CODE[i] < 10 ) { vfd_send_char(aux,48+IR_CODE[i]); }; if (IR_CODE[i] > 9 ) { vfd_send_char(aux,55+IR_CODE[i]); }; }; // TRANSMIT (UART1) for (i=0;i<8;i++) { putchar1(IR_CODE[i]); }; vfd_byte_write (0b01000001, 0b00000110); // YELLOW LED ON, GREEN LED OFF // WAIT ... delay_ms(2000); }; } void decode_RC5_infrared(void) { // READ THE INFRARED PORT AND DECODE "RC5" // http://techdocs.altium.com/display/FPGA/Philips+RC5+Infrared+Transmission+Protocol // http://www.picprojects.net/rc5_decoder/index.html // // 0) OUTPUT MESSAGE "PRESS KEY" vfd_send_char(33,80); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,83); vfd_send_char(21,83); vfd_send_char(18,95); vfd_send_char(15,75); vfd_send_char(12,69); vfd_send_char(9,89); vfd_send_char(6,95); vfd_send_char(3,95); vfd_send_char(0,95); vfd_byte_write (0b01000001, 0b00000110); // YELLOW LED ON // 1) WAIT FOR TRAFFIC. IR=1 MEANS IDLE. while ((IR == 1)&&(menue == 1)) { delay_us(1); }; // ENDLESS LOOP !!!! BUT ROTARY ENCODER GENERATES INTERRUPTS :-) // STARTCONDITION : TRAFFIC ! // SYNTAX : START(1BIT) FIELD(1BIT) TOGGLE(1BIT) ADDRESS(5BIT) COMMAND(6BIT), MSB FIRST i=5; // POINTER FOR ARRAY, HOLDING THE LEVELS. SET TO 5TH ELEMENT. WE START WITH AN OFFSET IR_ARRAY[0] = 1 ; IR_ARRAY[1] = 1 ; IR_ARRAY[2] = 1 ; IR_ARRAY[3] = 1 ; IR_ARRAY[4] = 1 ; // SCAN THE INPUT ... do { IR_ARRAY[i] = IR ; delay_us(100); i++ ; } while (i<255); // NOW WE HAVE 256 VALUES, STRINGS UP TO 13 (EQUAL DIGITS) COUNT AS ONE (TIME!) STRINGS LARGER THAT 14 COUNT AS TWO vfd_byte_write (0b01000001, 0b00000101); // GREEN ON, YELLOW LED OFF // DECODING STEP 1 : CALCULATE LENGTH OF EACH STATE, FIRST ONE IS HIGH k=0; // POINTER RAW DATA m=0; // POINTER RESULT j=0; // LENGTH STRING OF EQUAL ELEMENTS do { while ((IR_ARRAY[k]) == (IR_ARRAY[k+j])) { j++; }; IR_TEMP[m] = j ; k = k + j ; j = 0 ; m++ ; } while (k<255); // DECODING STEP 2 : RECREATE BITSTREAM // DECISION LEVEL : 15 --- CHECK THIS !!!!!!!!! i=0; // POINTER RESULT j=0; // POINTER SOURCE while (j<32) { // HIGH LEVEL if (IR_TEMP[j] < 15) { IR_ARRAY[i] = 1; i++; }; if (IR_TEMP[j] >= 15) { IR_ARRAY[i] = 1; i++; IR_ARRAY[i] = 1; i++;}; j++; // LOW LEVEL if (IR_TEMP[j] < 15) { IR_ARRAY[i] = 0; i++; }; if (IR_TEMP[j] >= 15) { IR_ARRAY[i] = 0; i++; IR_ARRAY[i] = 0; i++;}; j++; }; // DECODING STEP 3 : MANCHESTER INCLUDING INVERTING i=0; // POINTER RESULT j=0; // POINTER SOURCE while (j<32) { if ((IR_ARRAY[j] == 1 ) && (IR_ARRAY[j+1] == 0)) { IR_CODE[i] = 1; }; if ((IR_ARRAY[j] == 0 ) && (IR_ARRAY[j+1] == 1)) { IR_CODE[i] = 0; }; j = j + 2; i++; }; // DECODING STEP 4. MSB FIRST // BIT 0 : START // BIT 1 : START / MSB FOR COMMAND - USED HERE // BIT 2 : TOGGLE // BIT 3 - BIT 7 : ADDRESS. VALUE = 0 ... 31 (5 BIT) // BIT 8 - BIT 13 : COMMAND. VALUE = 0 ... 63 (6 BIT) vfd_clear_screen(); vfd_send_char(33,82); vfd_send_char(30,67); vfd_send_char(27,53); vfd_send_char(24,95); // TOGGLE BIT if (IR_CODE[2] == 1 ) { vfd_send_char(21,49); }; if (IR_CODE[2] == 0 ) { vfd_send_char(21,48); }; vfd_send_char(18,61); // ADDRESS // aux = IR_CODE[3]*16 + IR_CODE[4]*8 + IR_CODE[5]*4 + IR_CODE[6]*2 + IR_CODE[7]*1 ; aux = IR_CODE[4]*8 + IR_CODE[5]*4 + IR_CODE[6]*2 + IR_CODE[7]*1 ; vfd_display_number(15,aux,2); vfd_send_char(9,61); // COMMAND aux = IR_CODE[1]*64 + IR_CODE[8]*32 + IR_CODE[9]*16 + IR_CODE[10]*8 + IR_CODE[11]*4 + IR_CODE[12]*2 + IR_CODE[13]*1 ; vfd_display_number(6,aux,3); vfd_byte_write (0b01000001, 0b00000110); // YELLOW LED ON, GREEN LED OFF // WAIT ... if (menue == 1) { delay_ms(2000); }; } // 057 054 048 048 044 056 044 078 044 049 void UART_TEST(void) { vfd_send_char(33,57); vfd_send_char(30,54); vfd_send_char(27,48); vfd_send_char(24,48); vfd_send_char(21,64); vfd_send_char(18,56); vfd_send_char(15,64); vfd_send_char(12,78); vfd_send_char(9,64); vfd_send_char(6,49); vfd_send_char(3,95); vfd_send_char(0,95); while (menue == 4) { // SEND IDN MESSAGE BY UART // 067 069 084 072 045 054 048 032 // 066 032 070 082 069 081 085 069 // 078 067 089 032 067 079 085 078 // 084 069 082 032 082 069 086 046 // 032 049 046 048 048 013 010 032 putchar1(67); putchar1(69);putchar1(84);putchar1(72);putchar1(45);putchar1(54);putchar1(48);putchar1(32); putchar1(66); putchar1(32);putchar1(70);putchar1(82);putchar1(69);putchar1(81);putchar1(85);putchar1(69); putchar1(78); putchar1(67);putchar1(89);putchar1(32);putchar1(67);putchar1(79);putchar1(85);putchar1(78); putchar1(84); putchar1(69);putchar1(82);putchar1(32);putchar1(82);putchar1(69);putchar1(86);putchar1(46); putchar1(32); putchar1(49);putchar1(46);putchar1(49);putchar1(48);putchar1(13);putchar1(10);putchar1(32); if ( menue == 4 ) { delay_ms(999); }; }; } void DISPLAY_TEST (void) { vfd_clear_screen(); // SHOW ALL CHARACTERS - PARADE :-) for (i=36;i<96;i++) { for (j=0;j<12;j++) { k=33-3*j; m=i+j; vfd_send_char(k,m); }; if ( menue == 5 ) { delay_ms(300); }; }; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DISPLAY MENUE ITEMS LEVEL B ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void display_IRDECODE_NEC(void) { vfd_send_char(33,73); vfd_send_char(30,82); vfd_send_char(27,68); vfd_send_char(24,69); vfd_send_char(21,67); vfd_send_char(18,79); vfd_send_char(15,68); vfd_send_char(12,69); vfd_send_char(9,95); vfd_send_char(6,78); vfd_send_char(3,69); vfd_send_char(0,67); while (menue == 0) { delay_us(100);}; } void display_IRDECODE_RC5(void) { vfd_send_char(33,73); vfd_send_char(30,82); vfd_send_char(27,68); vfd_send_char(24,69); vfd_send_char(21,67); vfd_send_char(18,79); vfd_send_char(15,68); vfd_send_char(12,69); vfd_send_char(9,95); vfd_send_char(6,82); vfd_send_char(3,67); vfd_send_char(0,53); while (menue == 1) { delay_us(100);}; } void display_IRDECODE_RC6(void) { vfd_send_char(33,73); vfd_send_char(30,82); vfd_send_char(27,68); vfd_send_char(24,69); vfd_send_char(21,67); vfd_send_char(18,79); vfd_send_char(15,68); vfd_send_char(12,69); vfd_send_char(9,95); vfd_send_char(6,82); vfd_send_char(3,67); vfd_send_char(0,54); while (menue == 99) { delay_us(100);}; } void display_FUTURE_USE(void) { vfd_send_char(33,70); vfd_send_char(30,85); vfd_send_char(27,84); vfd_send_char(24,85); vfd_send_char(21,82); vfd_send_char(18,69); vfd_send_char(15,95); vfd_send_char(12,85); vfd_send_char(9,83); vfd_send_char(6,69); vfd_send_char(3,95); vfd_send_char(0,95); while (menue == 7) { delay_us(100);}; while (menue == 15) { delay_us(100);}; while (menue == 16) { delay_us(100);}; } void display_UART_TEST(void) { vfd_send_char(33,85); vfd_send_char(30,65); vfd_send_char(27,82); vfd_send_char(24,84); vfd_send_char(21,95); vfd_send_char(18,84); vfd_send_char(15,69); vfd_send_char(12,83); vfd_send_char(9,84); vfd_send_char(6,95); vfd_send_char(3,95); vfd_send_char(0,95); while (menue == 6) { delay_us(100);}; } void display_DISPLAYTEST(void) { vfd_send_char(33,68); vfd_send_char(30,73); vfd_send_char(27,83); vfd_send_char(24,80); vfd_send_char(21,76); vfd_send_char(18,65); vfd_send_char(15,89); vfd_send_char(12,84); vfd_send_char(9,69); vfd_send_char(6,83); vfd_send_char(3,84); vfd_send_char(0,95); while (menue == 99) { delay_us(100);}; } void display_SPECIAL_FUNC(void) { vfd_send_char(33,83); vfd_send_char(30,80); vfd_send_char(27,69); vfd_send_char(24,67); vfd_send_char(21,73); vfd_send_char(18,65); vfd_send_char(15,76); vfd_send_char(12,95); vfd_send_char(9,70); vfd_send_char(6,85); vfd_send_char(3,78); vfd_send_char(0,67); while (menue == 99) { delay_us(100);}; } void display_COUNT_A(void) { vfd_send_char(33,67); vfd_send_char(30,79); vfd_send_char(27,85); vfd_send_char(24,78); vfd_send_char(21,84); vfd_send_char(18,95); vfd_send_char(15,65); vfd_send_char(12,95); vfd_send_char(9,95); vfd_send_char(6,95); vfd_send_char(3,95); vfd_send_char(0,95); while (menue == 99) { delay_us(100);}; } // 070 082 069 081 085 069 078 067 089 032 065 // http://www.unit-conversion.info/texttools/ascii/ void display_FREQUENCY_A(void) { vfd_send_char(33,70); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,81); vfd_send_char(21,85); vfd_send_char(18,69); vfd_send_char(15,78); vfd_send_char(12,67); vfd_send_char(9,89); vfd_send_char(6,95); vfd_send_char(3,65); vfd_send_char(0,95); while (menue == 2) { delay_us(100);}; } //070 082 069 081 085 069 078 067 089 032 066 void display_FREQUENCY_B(void) { vfd_send_char(33,70); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,81); vfd_send_char(21,85); vfd_send_char(18,69); vfd_send_char(15,78); vfd_send_char(12,67); vfd_send_char(9,89); vfd_send_char(6,95); vfd_send_char(3,66); vfd_send_char(0,95); while (menue == 3) { delay_us(100);}; } // 070 082 069 081 032 065 045 066 void display_FREQB_minus_FREQA(void) { vfd_send_char(33,70); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,81); vfd_send_char(21,46); vfd_send_char(18,66); vfd_send_char(15,46); vfd_send_char(12,61); vfd_send_char(9,46); vfd_send_char(6,65); vfd_send_char(3,46); vfd_send_char(0,46); while (menue == 4) { delay_us(100);}; } void display_FREQB_durch_FREQA(void) { vfd_send_char(33,70); vfd_send_char(30,82); vfd_send_char(27,69); vfd_send_char(24,81); vfd_send_char(21,46); vfd_send_char(18,66); vfd_send_char(15,46); vfd_send_char(12,63); vfd_send_char(9,46); vfd_send_char(6,65); vfd_send_char(3,46); vfd_send_char(0,46); while (menue == 5) { delay_us(100);}; } void display_ERROR(void) { vfd_send_char(33,69); vfd_send_char(30,82); vfd_send_char(27,82); vfd_send_char(24,79); vfd_send_char(21,82); vfd_send_char(18,46); vfd_send_char(15,46); vfd_send_char(12,46); vfd_send_char(9,46); vfd_send_char(6,46); vfd_send_char(3,46); vfd_send_char(0,46); while (menue == 99) { delay_us(100);}; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // COUNT FREQUENCY A + AUTOGATE + MHZ,KHZ,HZ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FREQ_COUNTER_A(void) { unsigned char aux; // SELECT SOURCE A ONLY SOURCE_A = 1; SOURCE_B = 1; aux = GATOR ; // WAIT FOR CHANGE IN GATOR SIGNAL while (aux == GATOR) { delay_us(1);}; // WAIT :-) // GATOR = 1 : COUNTER B IS COUNTING, A CAN BE PROCESSED // GATOR = 0 : COUNTER A IS COUNTING, B CAN BE PROCESSED if (GATOR==1) ////////////////////////////////////////// { // STORE THE VALUE STORE_A = 1 ; delay_ms(1); STORE_A = 0; // B HIGH = Q7 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_A = PINC ; REGISTER_A = REGISTER_A <<8 ; // B LOW = Q6 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A HIGH = Q5 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A LOW = Q4 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; disp = REGISTER_A * GATE_TIME * PRESCALER_A ; CLEAR_A = 0 ; delay_ms(1) ; CLEAR_A = 1; }; if (GATOR==0) ////////////////////////////////////////// { // STORE THE VALUE STORE_B = 1 ; delay_ms(1); STORE_B = 0; // B HIGH = Q3 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_B = PINC ; REGISTER_B = REGISTER_B <<8 ; // B LOW = Q2 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A HIGH = Q1 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A LOW = Q0 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; disp = REGISTER_B * GATE_TIME * PRESCALER_B ; CLEAR_B = 0 ; delay_ms(1) ; CLEAR_B = 1; }; // TURN ON LEDS ACCORDINGLY TO GATE SIGNAL ///////////////// if (GATOR == 1) {vfd_byte_write (0b01000001, 0b00000011); }; if (GATOR == 0) {vfd_byte_write (0b01000001, 0b00000101); }; // digit 0, n * 1'000'000 //////////////// vfd_buffer[0]=48; while (disp >= 1000000) { vfd_buffer[0] = vfd_buffer[0] + 1; disp = disp - 1000000; }; // digit 1, n * 100'000 //////////////// vfd_buffer[1]=48; while (disp >= 100000) { vfd_buffer[1] = vfd_buffer[1] + 1; disp = disp - 100000; }; // digit 2, n * 10'000 //////////////// vfd_buffer[2]=48; while (disp >= 10000) { vfd_buffer[2] = vfd_buffer[2] + 1; disp = disp - 10000; } // digit 3, n * 1'000 //////////////// vfd_buffer[3]=48; while (disp >= 1000) { vfd_buffer[3] = vfd_buffer[3] + 1; disp = disp - 1000; } // digit 4, n * 100 //////////////// vfd_buffer[4]=48; while (disp >= 100) { vfd_buffer[4] = vfd_buffer[4] + 1; disp = disp - 100; } // digit 5, n * 10 //////////////// vfd_buffer[5]=48; while (disp >= 10) { vfd_buffer[5] = vfd_buffer[5] + 1; disp = disp - 10; } // digit 6, n * 1 //////////////// vfd_buffer[6]=48; while (disp >= 1) { vfd_buffer[6] = vfd_buffer[6] + 1; disp = disp - 1; } // KILL LEADING ZEROEs if (vfd_buffer[0]==48) {vfd_buffer[0]=32;}; if ((vfd_buffer[1]==48)&&(vfd_buffer[0]==32)) {vfd_buffer[1]=32;}; if ((vfd_buffer[2]==48)&&(vfd_buffer[1]==32)) {vfd_buffer[2]=32;}; if ((vfd_buffer[3]==48)&&(vfd_buffer[2]==32)) {vfd_buffer[3]=32;}; // DISPLAY kHz, RESULT SMALLER 1.0000 MHz if (vfd_buffer[1]<48) { vfd_send_char(33,vfd_buffer[0]); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,vfd_buffer[2]); vfd_send_char(24,vfd_buffer[3]); vfd_send_char(21,vfd_buffer[4]); vfd_send_char(18,64); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_KHZ(); }; if (vfd_buffer[1]>=48) { vfd_send_char(33,vfd_buffer[0]); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,64); vfd_send_char(24,vfd_buffer[2]); vfd_send_char(21,vfd_buffer[3]); vfd_send_char(18,vfd_buffer[4]); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_MHZ(); }; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // COUNT FREQUENCY B + AUTOGATE + MHZ,KHZ,HZ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FREQ_COUNTER_B(void) { unsigned char aux; // SELECT SOURCE B ONLY SOURCE_A = 0; SOURCE_B = 0; aux = GATOR ; // WAIT FOR CHANGE IN GATOR SIGNAL while (aux == GATOR) { delay_us(1);}; // WAIT :-) // GATOR = 1 : COUNTER B IS COUNTING, A CAN BE PROCESSED // GATOR = 0 : COUNTER A IS COUNTING, B CAN BE PROCESSED if (GATOR==1) ////////////////////////////////////////// { // STORE THE VALUE STORE_A = 1 ; delay_ms(1); STORE_A = 0; // B HIGH = Q7 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_A = PINC ; REGISTER_A = REGISTER_A <<8 ; // B LOW = Q6 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A HIGH = Q5 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A LOW = Q4 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; disp = REGISTER_A * GATE_TIME * PRESCALER_A ; CLEAR_A = 0 ; delay_ms(1) ; CLEAR_A = 1; }; if (GATOR==0) ////////////////////////////////////////// { // STORE THE VALUE STORE_B = 1 ; delay_ms(1); STORE_B = 0; // B HIGH = Q3 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_B = PINC ; REGISTER_B = REGISTER_B <<8 ; // B LOW = Q2 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A HIGH = Q1 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A LOW = Q0 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; disp = REGISTER_B * GATE_TIME * PRESCALER_B ; CLEAR_B = 0 ; delay_ms(1) ; CLEAR_B = 1; }; // TURN ON LEDS ACCORDINGLY TO GATE SIGNAL ///////////////// if (GATOR == 1) {vfd_byte_write (0b01000001, 0b00000011); }; if (GATOR == 0) {vfd_byte_write (0b01000001, 0b00000101); }; // digit 0, n * 1'000'000 //////////////// vfd_buffer[0]=48; while (disp >= 1000000) { vfd_buffer[0] = vfd_buffer[0] + 1; disp = disp - 1000000; }; // digit 1, n * 100'000 //////////////// vfd_buffer[1]=48; while (disp >= 100000) { vfd_buffer[1] = vfd_buffer[1] + 1; disp = disp - 100000; }; // digit 2, n * 10'000 //////////////// vfd_buffer[2]=48; while (disp >= 10000) { vfd_buffer[2] = vfd_buffer[2] + 1; disp = disp - 10000; } // digit 3, n * 1'000 //////////////// vfd_buffer[3]=48; while (disp >= 1000) { vfd_buffer[3] = vfd_buffer[3] + 1; disp = disp - 1000; } // digit 4, n * 100 //////////////// vfd_buffer[4]=48; while (disp >= 100) { vfd_buffer[4] = vfd_buffer[4] + 1; disp = disp - 100; } // digit 5, n * 10 //////////////// vfd_buffer[5]=48; while (disp >= 10) { vfd_buffer[5] = vfd_buffer[5] + 1; disp = disp - 10; } // digit 6, n * 1 //////////////// vfd_buffer[6]=48; while (disp >= 1) { vfd_buffer[6] = vfd_buffer[6] + 1; disp = disp - 1; } // KILL LEADING ZEROEs if (vfd_buffer[0]==48) {vfd_buffer[0]=32;}; if ((vfd_buffer[1]==48)&&(vfd_buffer[0]==32)) {vfd_buffer[1]=32;}; if ((vfd_buffer[2]==48)&&(vfd_buffer[1]==32)) {vfd_buffer[2]=32;}; if ((vfd_buffer[3]==48)&&(vfd_buffer[2]==32)) {vfd_buffer[3]=32;}; // DISPLAY kHz, RESULT SMALLER 1.0000 MHz if (vfd_buffer[1]<48) { vfd_send_char(33,vfd_buffer[0]); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,vfd_buffer[2]); vfd_send_char(24,vfd_buffer[3]); vfd_send_char(21,vfd_buffer[4]); vfd_send_char(18,64); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_KHZ(); }; if (vfd_buffer[1]>=48) { vfd_send_char(33,vfd_buffer[0]); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,64); vfd_send_char(24,vfd_buffer[2]); vfd_send_char(21,vfd_buffer[3]); vfd_send_char(18,vfd_buffer[4]); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_MHZ(); }; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // COUNT FREQUENCY B - COUNT FREQUENCY A + AUTOGATE + MHZ,KHZ,HZ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FREQB_minus_FREQA(void) { unsigned char aux; // SELECT SOURCE A AND B SOURCE_A = 1; SOURCE_B = 0; aux = GATOR ; // WAIT FOR CHANGE IN GATOR SIGNAL while (aux == GATOR) { delay_us(1);}; // WAIT :-) // GATOR = 1 : COUNTER B IS COUNTING, A CAN BE PROCESSED // GATOR = 0 : COUNTER A IS COUNTING, B CAN BE PROCESSED if (GATOR==1) ////////////////////////////////////////// { // STORE THE VALUE STORE_A = 1 ; delay_ms(1); STORE_A = 0; // B HIGH = Q7 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_A = PINC ; REGISTER_A = REGISTER_A <<8 ; // B LOW = Q6 //////////////////////////// ADR2 = 1 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A HIGH = Q5 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_A |= PINC ; REGISTER_A = REGISTER_A <<8 ; // A LOW = Q4 //////////////////////////// ADR2 = 1 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_A |= PINC ; AUXA = REGISTER_A * GATE_TIME * PRESCALER_A ; CLEAR_A = 0 ; delay_ms(1) ; CLEAR_A = 1; }; if (GATOR==0) ////////////////////////////////////////// { // STORE THE VALUE STORE_B = 1 ; delay_ms(1); STORE_B = 0; // B HIGH = Q3 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 1; delay_ms(1); REGISTER_B = PINC ; REGISTER_B = REGISTER_B <<8 ; // B LOW = Q2 //////////////////////////// ADR2 = 0 ; ADR1 = 1 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A HIGH = Q1 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 1; delay_ms(1); REGISTER_B |= PINC ; REGISTER_B = REGISTER_B <<8 ; // A LOW = Q0 //////////////////////////// ADR2 = 0 ; ADR1 = 0 ; ADR0 = 0; delay_ms(1); REGISTER_B |= PINC ; AUXB = REGISTER_B * GATE_TIME * PRESCALER_B ; CLEAR_B = 0 ; delay_ms(1) ; CLEAR_B = 1; }; // TURN ON LEDS ACCORDINGLY TO GATE SIGNAL ///////////////// if (GATOR == 1) {vfd_byte_write (0b01000001, 0b00000011); }; if (GATOR == 0) {vfd_byte_write (0b01000001, 0b00000101); }; disp = floor(fabs(AUXB - AUXA)) ; vorzeichen = 46; if (AUXA > AUXB) {vorzeichen = 61; }; if (AUXB > AUXA) {vorzeichen = 60; }; // digit 0, n * 1'000'000 //////////////// vfd_buffer[0]=48; while (disp >= 1000000) { vfd_buffer[0] = vfd_buffer[0] + 1; disp = disp - 1000000; }; // digit 1, n * 100'000 //////////////// vfd_buffer[1]=48; while (disp >= 100000) { vfd_buffer[1] = vfd_buffer[1] + 1; disp = disp - 100000; }; // digit 2, n * 10'000 //////////////// vfd_buffer[2]=48; while (disp >= 10000) { vfd_buffer[2] = vfd_buffer[2] + 1; disp = disp - 10000; } // digit 3, n * 1'000 //////////////// vfd_buffer[3]=48; while (disp >= 1000) { vfd_buffer[3] = vfd_buffer[3] + 1; disp = disp - 1000; } // digit 4, n * 100 //////////////// vfd_buffer[4]=48; while (disp >= 100) { vfd_buffer[4] = vfd_buffer[4] + 1; disp = disp - 100; } // digit 5, n * 10 //////////////// vfd_buffer[5]=48; while (disp >= 10) { vfd_buffer[5] = vfd_buffer[5] + 1; disp = disp - 10; } // digit 6, n * 1 //////////////// vfd_buffer[6]=48; while (disp >= 1) { vfd_buffer[6] = vfd_buffer[6] + 1; disp = disp - 1; } // KILL LEADING ZEROEs if (vfd_buffer[0]==48) {vfd_buffer[0]=32;}; if ((vfd_buffer[1]==48)&&(vfd_buffer[0]==32)) {vfd_buffer[1]=32;}; if ((vfd_buffer[2]==48)&&(vfd_buffer[1]==32)) {vfd_buffer[2]=32;}; if ((vfd_buffer[3]==48)&&(vfd_buffer[2]==32)) {vfd_buffer[3]=32;}; // DISPLAY kHz, RESULT SMALLER 1.0000 MHz if (vfd_buffer[1]<48) { vfd_send_char(33,vorzeichen); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,vfd_buffer[2]); vfd_send_char(24,vfd_buffer[3]); vfd_send_char(21,vfd_buffer[4]); vfd_send_char(18,64); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_KHZ(); }; if (vfd_buffer[1]>=48) { vfd_send_char(33,vfd_buffer[0]); vfd_send_char(30,vfd_buffer[1]); vfd_send_char(27,64); vfd_send_char(24,vfd_buffer[2]); vfd_send_char(21,vfd_buffer[3]); vfd_send_char(18,vfd_buffer[4]); vfd_send_char(15,vfd_buffer[5]); vfd_send_char(12,vfd_buffer[6]); vfd_send_char(9,32); display_MHZ(); }; } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out DDRA=(1<