Device Drivers – Digital Voltmeter 1 Mark Neil - Microprocessor Course Analog to Digital Converters 2 An ANALOG to DIGITAL CONVERTER (ADC) is a device that measures analog signals and convert them to digital (binary) numbers: Higher Voltage Ref. Input Pulse Lower Voltage Ref. Mark Neil - Microprocessor Course D9 output 10-bit Number sequence Input 10-bit ADC D0 ADC on the ATMega128 3 The ATMega128 has a built in Analog to Digital Converter 10 bits of data for each sample Signals can be digitized from up to 8 inputs 1 input can be digitized at a time There is a multiplexer to select which input should be converted Mark Neil - Microprocessor Course The ADC Registers I 4 The 10-bit ADC on Atmega103 receives its inputs from PORTF. The Reference voltage is controlled by a potentiometer. The device can be controlled by 4 on board registers: ADCSR ADMUX ADCH ADCL : ADC Status Register : Multiplexer Control : Data Register for D9,D8 : Data Register for D0-D7 Mark Neil - Microprocessor Course ADCMUX –Register Select Channel ADCCSR – ADC Control and Status Register ADCL – Bits 0-7 ADCH – Bits 8-9 Multiplexer to select which channel to digitize ADC: 10 bit Analog to Digital Conversion 8 ADC Input Channels Mark Neil - Microprocessor Course 5 The ADCCSR 6 ADEN : ADC Enable - turns on the ADC clock ADSC : Start conversion ADIF : Interrupt flag (gets set during a conversion and gets cleared if you write ‘1’ to it AFTER you have read BOTH data registers) ADIE : Interrupt enable (in the software we do not used interrupts yet so keep it ‘0’) ADPS0-2 : Three bits that determine the ADC clock prescale (e.q. 3 = 1/8) D7 D6 D5 D4 D3 D2 D1 D0 ADEN ADSC 0 ADIF ADIE ADPS2 ADPS1 ADPS0 Mark Neil - Microprocessor Course The ADMUX Register 7 The ADC Multiplexer Register ADMUX is used to select a channel to digitise (3 bits for Channel 0-7) : D7 D6 D5 D4 Mark Neil - Microprocessor Course D3 D2 D1 D0 MUX2 MUX1 MUX0 The ADCH/ADCL Registers 8 The ADC Data Register ADCL is used for the 8 lower data bits (D7 - D0) : The ADC Data Register ADCH is used for the two highest data bits (D9,D8) : D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 D3 D2 D1 D0 D9 D8 D7 D6 D5 Mark Neil - Microprocessor Course D4 ADCL ADCH Task Plan 9 Design and construct a Digital Voltmeter: The Atmega103 on-chip ADCs should be used to digitise the input analog voltages. The LCD should be used to display the voltmeter readings. Switches or a keyboard can be used to tell the Voltmeter to capture data Connect your Voltmeter to the potentiometer and measure the voltage. Calibrate it against a Voltmeter in the Lab. Demonstrate that your device works !!!! Mark Neil - Microprocessor Course Conceptual Design 10 We want to construct : LCD INTERFACE ATmega103 Board Analog PORTD Buttons Mark Neil - Microprocessor Course Voltage to be measured Connector LCD DISPLAY HITACHI LM032XMBL +5 Volts Use ADC0 10K 10K Some Important points : 11 The Voltage you are trying to measure must be between 0 – 2.5 Volts The reference voltage of the ADC should not be lower than the voltage you are trying to measure! First you should set the reference voltage at its highest value (4.5 V) using the potentiometer and by measuring it at the Ref. pin of PORTF Mark Neil - Microprocessor Course Software Design of the Voltmeter 12 Start Yes First ? Initialize LCD Initialize the ADC No Display a message on the LCD saying that the Voltmeter is ready to make a Measurement and ask the user if he wants to measure a voltage (capture data) Read in Input from PORTD or the Keyboard Mark Neil - Microprocessor Course Display the voltage on to the LCD Yes Decode the Input and if it is ‘YES’ then digitise a Voltage No Getting Started 13 Use the user interface you created with the LCD display and the keyboard or the PORTD switches. Read about using the on-board ADC in the ATmega128 manual. Use the routines in the ADC1.inc program on the web page as a starting point, adding the relevant parts to your own code Mark Neil - Microprocessor Course ADC Driver routines 14 .def .def .def .def TempReg ADCChannel ADCDL ADCDH = = = = r16 r18 r19 r20 ADCInit: ldi TempReg, $83 out ADCSR, TempReg ret ; ******* ADC Setup Code **** ; ADC Interrupt Disabled, ADC Enable ; ADC Free Run Mode, Prescaler:CK/8 ADCsel: out ADMUX, ADCChannel ret DCATrig: SBI ADCSR, 6 rcall DEL600mus IN ADCDL, ADCL IN ADCDH, ADCH ADCCLR: SBI ADCSR, 4 IN TempReg,ADCSR SBIC ADCSR, 4 RJMP ADCCLR RET Mark Neil - Microprocessor Course ; Channel Selection ; Cause a Conversion ; ; ; ; ; ; Read in Low Byte Read in High Byte Reset ADIF Read in Status Wait till the Interrupt flag is cleared