/* ad.c measures Volt on A0/PC0 pin */ // Arduino UNO R3 // AVR_ATmega328P #include // register names/addresses and bit names/numbers #define F_CPU 16000000UL #include void init_UART( void ); void putchar_uart( unsigned char ); void string_out_uart( char * ); void decimal_out_uart( signed int number, unsigned char fixed_decimals, char format ); void init_AD( void ); #define DECIMAL_MARK ',' #define SIGN 1 #define NOSIGN 0 int main() { unsigned int num; DDRB |= ( 1 << PB5 ); // LED is output PORTB &= ~( 1 << PB5 ); // LED is off init_uart(); init_AD(); while(1) { ADCSRA |= (1 << ADSC); // Start AD (ADCSRA "-1------") while( ADCSRA & (1 << ADSC) ) {} // Wait for AD done num = ADC; // result 10 bit right adjusted num *= 49; // scale 0-5V -> 0-50000 PORTB |= ( 1 << PB5 ); // LED on _delay_ms(100); PORTB &= ~( 1 << PB5 ); // LED off _delay_ms(500); string_out_uart("The voltage is [V]: "); decimal_out_uart( num, 4, NOSIGN); string_out_uart("\r\n"); } return 0; // will never be reached } /* *********************************** */ /* FUNCTIONS */ /* *********************************** */ void init_uart( void ) { // Bits in UCSR0B register: "RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80" UCSR0B |= (1<<(RXEN0)) | (1<<(TXEN0)); // "----1---" // Bits in UCSR0C register: "UMSEL01 UMSEL00 UPM01 UPM00 USBS0 UCSZ01/UCPHA0 UCSZ01/UCPHA0 UCPOL0" UCSR0C |= (1<<(UCSZ01)) | (1<<(UCSZ00)); // "-----11-" UBRR0 = 103; // Baud prescaler 103 -> 9600 Baud } void init_AD( void ) { // Bits in ADCSRA register: "ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0" // F_ADC = F_CPU/PRESCALE sample rate (50kHz < F_ADC < 200kHz) // 16MHz/128 = 125KHz so we set ADC prescaler to 128 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // "-----111" ADPS 128 ADCSRA |= (1 << ADEN); // "1-------" Enable AD converter // Bits in ADMUX register: "REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0" // Select AD0 "----0000" is default, nothing has to be done // Set 10 bit Right adjust "--0-----" is default, nothing has to be done // In main program to start AD // ADCSRA |= (1 << ADSC); // In main program to wait for AD done // while(ADCSRA & (1<RXD A5|- | \/ | -|D01 - LED -|D10~ +3.3V|- -(D05)-|11 PD5/PWM MISO/PB4 18|-(D12)- -|D11~ Res|- -(D06)-|12 PD6/PWM PWM/MOSI/PB3 17|-(D11)- -|D12 IOREF|- -(D07)-|13 PD7 PWM/SS'/PB2 16|-(D10)- -|D13 LED --- | -(D08)-|14 PB0 PWM/PB1 15|-(D09)- -|GND | |______________________________| -|AREF | -|SCL | -|SDA | |________________| */