#include #include #define ADC_VREF_TYPE 0xC0 unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(100); ADCSRA|=0x40; while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void dac_out(unsigned int value) { PORTC = value & 0xFF; PORTD = (value >> 8) & 0xFF; } unsigned int dac_chek(unsigned int address_ADC) { unsigned int out_voltage = 0, flag; unsigned int old_voltage, temp; flag = 1; old_voltage = 0; for (out_voltage = 1; out_voltage <= 7; out_voltage++) { dac_out(out_voltage << 9); delay_ms(5); temp = read_adc(address_ADC); if (old_voltage + 20 > temp || old_voltage + 20 == temp) { flag = 0; break; } old_voltage = temp; } return flag; } void init() { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; UCSRB=0x00; ACSR=0x80; SFIOR=0x00; ADCSRA=0x87; SPCR=0x00; TWCR=0x00; } void main(void) { unsigned int j, out_data, address; init(); PORTB = 0xFF; while (1) { address = 0; out_data = 0; for(j = 0; j < 4; j++) { address = 0xC0 | j; if (dac_chek(address)) { out_data |= (1 << j); } else { out_data |= (0x10 << j); } } PORTB=~out_data; } }