[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-chat] ADCW only returns 1023
From: |
Ormund Williams |
Subject: |
Re: [avr-chat] ADCW only returns 1023 |
Date: |
Thu, 31 Jan 2008 01:41:05 -0500 |
On Wed, 2008-01-30 at 22:10 -0700, Mikey Sklar wrote:
> I recently built a circuit board to measure the temperature of the
> grease flowing through my car. The car is a old Mercedes running on
> Waste Vegetable Oil from restaurant dumpsters. I was able to upload my
> code and single step with gdb then I found a issue. The ADCW register
> reports back 1023 despite my sensors running a wide range of values
> between 1.9V - 5V.
>
> Has anyone else seen this behavior before?
>
> Setup:
> - atmega169 (TQFP)
> - avarice (v2.5)
> - avr-gcc (4.0.2)
> - avr-libc (1.4.5)
> - avr-gdb (6.5)
> - jtag clone serial based programmer (MK-I only)
> - Mac OS/X 10.4.11
>
> Code:
>
> #include <avr/io.h>
> #include <avr/interrupt.h>
>
>
> #define SENSORS 2 // three thermistors measuring temperature (0-2)
>
>
> SIGNAL(SIG_ADC);
> int main (void);
>
>
> unsigned int adc_data; //variable for ADC results
> unsigned int illuminate; //led display pattern
>
>
> SIGNAL(SIG_ADC) //ADC ISR
> {
>
> adc_data = ADCW; //read all 10 bits into variable
>
>
> /* ADC data from thermistors translated into five different hex values.
> Hex values are stored for display to appropriate output LED port.
> Shows driver grease temperature by illuminating LEDs.
> The more LEDs that are on, the hotter the fuel is. */
>
> if ( adc_data <= 432 )
> illuminate = 0x00; // less than 65F - all lights off
> else if ( adc_data > 432 && adc_data <= 530)
> illuminate = 0x01; // 65F - 85F bin: 0001 dec: 1 hex:
> 0x01
> else if (adc_data > 530 && adc_data <= 770 )
> illuminate = 0x03; // 85F - 105F bin: 0011 dec: 3 hex:
> 0x03
> else if (adc_data > 770 && adc_data <= 827)
> illuminate = 0x07; // 105F - 125F bin: 0111 dec: 7 hex:
> 0x07
> else if (adc_data > 827 && adc_data <= 1023)
> illuminate = 0x0F; // 135F+ bin: 1111 dec: 0 hex:
> 0x0F
> else
> illuminate = 0x00; //error all lights off
>
>
> if ( ADMUX == 0 ) {
> PORTA = illuminate; //store sensor results for display
> }
> else if ( ADMUX == 1 ) {
> PORTC = illuminate; //store sensor results for display
> }
> else if ( ADMUX == 2 ) {
> PORTD = illuminate; //store sensor results for display
> }
> else {
> PORTA = 0x0A; //MUX Error: 0101 (led pattern)
> PORTC = 0x0A; //MUX Error: 0101 (led pattern)
> PORTD = 0x0A; //MUX Error: 0101 (led pattern)
> }
>
>
> // rotate through sensors
> if ( ADMUX < SENSORS )
> ADMUX += 1; //change mux to next sensor
> else
> ADMUX = 0; //reset mux to first sensor
>
>
> ADCSRA = ADCSRA | 0x40; //start the next conversion
>
> }
>
>
> int main(void)
> {
> DDRA=0x0F; //LED output (first four pins)
> DDRC=0x0F; //LED output (first four pins)
> DDRD=0x0F; //LED output (first four pins)
> ADCSRA=0xCE; //ADC on, /64, interrupt enable, and started
> ADMUX=0x00; //ADC registers PF0, PF1, PF2 one at a time
You've cleared the bits REFS0 and REFS1 so you must connect a refrence
voltage to AREF (pin 62).
>
> PORTA = 0x0F; //power on: 1111 (led pattern)
> PORTC = 0x0F; //power on: 1111 (led pattern)
> PORTD = 0x0F; //power on: 1111 (led pattern)
>
> sei(); //global interrupt enable bit
>
> while(1) {
> }
> }
__
Ormund