با سلام قصد دارم یه برنامه برا attiny13a بنویسم توش قراره adc دوم میکرو رو اندازه بگیره بصورت مستمر مقدارش اگه از 1.81 ولت کمتر شد پایه pb5 رو یک کنه ولی برنامه تو شبیه سازی با پروتئوس کار نمی کنه اینم برنامش:
کد:
: #include <tiny13a.h> #include <delay.h> // Declare your global variables here float i,v; // Bandgap Voltage Reference: Off #define ADC_VREF_TYPE ((0<<REFS0) | (1<<ADLAR)) // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(1000); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCH; } void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Function: Bit5=Out Bit4=In Bit3=In Bit2=Out Bit1=In Bit0=Out DDRB=(1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (1<<DDB0); // State: Bit5=1 Bit4=T Bit3=T Bit2=0 Bit1=T Bit0=0 PORTB=(1<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-5: Off GIMSK=(0<<INT0) | (0<<PCIE); MCUCR=(0<<ISC01) | (0<<ISC00); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<AIN0D) | (0<<AIN1D); // ADC initialization // ADC Clock frequency: 9.375 kHz // ADC Bandgap Voltage Reference: Off // ADC Auto Trigger Source: Free Running // Only the 8 most significant bits of // the AD conversion result are used // Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: Off DIDR0|=(1<<ADC0D) | (0<<ADC2D) | (1<<ADC3D) | (1<<ADC1D); ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); PORTB.5=0; delay_ms(1); while (1) { i=read_adc(10); delay_ms(1); v=(i*5.00)/1023; if (v<=1.81) PORTB.5=1; } }