/******************************************************* Project : U/I PANELMETER "ATM8-DVM-1" Version : 1.0 Date : 27.01.2015 Author : Alexander C. Frank Company : CHANGPUAK.CH Comments: PCB: DVM-ATMEGA-001.T3001 Codevision V2.60 Advanced Chip type : ATmega8L Program type : Application AVR Core Clock frequency: 10.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include #include #include #include // Declare your global variables here // Anode #define SegA PORTD.2 #define SegB PORTD.0 #define SegC PORTD.5 #define SegD PORTD.4 #define SegE PORTD.3 #define SegF PORTD.1 #define SegG PORTD.6 // Cathode #define Cat1 PORTB.0 #define Cat2 PORTB.1 #define Cat3 PORTB.2 #define Cat4 PORTD.7 // Characters unsigned char digit ; unsigned char is_a_thermometer = 0; unsigned int timer ; // READ ADC ONLY ONCE PER SECOND unsigned int i ; // LOOP COUNTER float voltage ; unsigned long int ADC7; float correction = 1.0 ; // DC VOLTAGE // float correction = 0.25 ; // DC CURRENT WITH 1 OHM SHUNT // float correction = 0.707106 ; // AC VOLTAGE (SINE) EFFECTIVE VOLTAGE // float correction = 0.263157 ; // AC CURRENT WITH 1 OHM SHUNT. WORKS FOR MY 10% SHUNT. volatile char lcd_buffer[4]; // float to array aka sprintf ////////////////////////////////////////////////////// void array_me(float wert) { // digit 0, n*1000 //////////////// lcd_buffer[0]=48; while (wert >= 1000) { lcd_buffer[0] = lcd_buffer[0] + 1; wert = wert - 1000; }; // digit 1, n*100 //////////////// lcd_buffer[1]=48; while (wert >= 100) { lcd_buffer[1] = lcd_buffer[1] + 1; wert = wert - 100; }; // digit 2, n*10 //////////////// lcd_buffer[2]=48; while (wert >= 10) { lcd_buffer[2] = lcd_buffer[2] + 1; wert = wert - 10; } // digit 3, n*1 //////////////// lcd_buffer[3]=48; while (wert >= 1) { lcd_buffer[3] = lcd_buffer[3] + 1; wert = wert -1; } // KILL LEADING ZERO if (lcd_buffer[0]==48) { lcd_buffer[0] = 32;}; } // float to array aka sprintf ////////////////////////////////////////////////////// // Timer 0 overflow interrupt service routine 4.992 ms /////////////////////////////////////// interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0 value TCNT0=0x3D; // Switch all digits OFF to avoid flickering Cat1 = 0; Cat2 = 0; Cat3 = 0; Cat4 = 0; SegA = 0; SegB = 0; SegC = 0; SegD = 0; SegE = 0; SegF = 0; SegG = 0; // Proceed to next digit digit++; if (digit > 3) {digit = 0; }; switch (lcd_buffer[digit]) { case 32 : SegA = 0; SegB = 0; SegC = 0; SegD = 0; SegE = 0; SegF = 0; SegG = 0; break; // SPACE case 48 : SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 0; break; case 49 : SegA = 0; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 0; SegG = 0; break; case 50 : SegA = 1; SegB = 1; SegC = 0; SegD = 1; SegE = 1; SegF = 0; SegG = 1; break; case 51 : SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 0; SegF = 0; SegG = 1; break; case 52 : SegA = 0; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 1; SegG = 1; break; case 53 : SegA = 1; SegB = 0; SegC = 1; SegD = 1; SegE = 0; SegF = 1; SegG = 1; break; case 54 : SegA = 1; SegB = 0; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 1; break; case 55 : SegA = 1; SegB = 1; SegC = 1; SegD = 0; SegE = 0; SegF = 0; SegG = 0; break; case 56 : SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 1; SegF = 1; SegG = 1; break; case 57 : SegA = 1; SegB = 1; SegC = 1; SegD = 1; SegE = 0; SegF = 1; SegG = 1; break; case 67 : SegA = 1; SegB = 0; SegC = 0; SegD = 1; SegE = 1; SegF = 1; SegG = 0; break; case 69 : SegA = 1; SegB = 0; SegC = 0; SegD = 1; SegE = 1; SegF = 1; SegG = 1; break; case 72 : SegA = 0; SegB = 1; SegC = 1; SegD = 0; SegE = 1; SegF = 1; SegG = 1; break; case 76 : SegA = 0; SegB = 0; SegC = 0; SegD = 1; SegE = 1; SegF = 1; SegG = 0; break; case 80 : SegA = 1; SegB = 1; SegC = 0; SegD = 0; SegE = 1; SegF = 1; SegG = 1; break; case 248 : SegA = 1; SegB = 1; SegC = 0; SegD = 0; SegE = 0; SegF = 1; SegG = 1; break; default : SegA = 0; SegB = 0; SegC = 0; SegD = 0; SegE = 0; SegF = 0; SegG = 0; }; // Switch digit ON if (digit == 0) { Cat1 = 1; }; if (digit == 1) { Cat2 = 1; }; if (digit == 2) { Cat3 = 1; }; if (digit == 3) { Cat4 = 1; }; // Increase "PAUSE" timer timer++; } // Timer 0 overflow interrupt service routine 4.992 ms /////////////////////////////////////// #define ADC_VREF_TYPE ((0< 64)&&( is_a_thermometer == 0 )) { i = 0 ; voltage = 0 ; do { ADC7 = read_adc(0x07); voltage = voltage + ADC7 ; i = i + 1; } while (i < 20); voltage = voltage / 2 ; array_me(voltage); timer = 0; }; // MAXIMUM VALUE IS 1024 (10 Bit) if (ADC7 > 1000) { lcd_buffer[0] = 72; // H lcd_buffer[1] = 69; // E lcd_buffer[2] = 76; // L lcd_buffer[3] = 80; // P }; // THERMOMETER MODE DEGREE CELSIUS ////////////////////////////////////////////////////////////////// if ((digit==2)&&(timer > 1999)&&( is_a_thermometer == 1 )) { ADC7 = read_adc(0x07); voltage = 25 * ADC7 ; // sprintf(lcd_buffer,"%2.0f",voltage); array_me(voltage); timer = 0; lcd_buffer[2] = 248; // degree lcd_buffer[3] = 67; // C }; // THERMOMETER MODE DEGREE CELSIUS ////////////////////////////////////////////////////////////////// } }