PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC mit Atmel16



happyspider
06.04.2006, 13:46
Hallo,

ich benutze das Board von Pollin und versuche dort einen Atmel16 als ADC zu verwenden.

Hier ist mein Code:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>

#define BAUD 9600
#define F_CPU 8000000UL

#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE 9600

int Measure (void)
{
int measuredVal = 0;

ADCSRA = _BV(ADEN) | _BV(ADPS2);

// Select pin ADC0 using MUX
ADMUX = 0;

//Start conversion
ADCSRA |= _BV(ADSC);

// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}

// get converted value
measuredVal = ADCW;


return measuredVal;


}

int uart_putch1(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}

void uart_putst1 (char *s)
{
while (*s)
{
uart_putch1(*s);
s++;
}
}

int main(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = (uint8_t)(UART_UBRR_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL = (uint8_t)UART_UBRR_CALC(UART_BAUD_RATE,F_CPU);

for(;;)
{
int valMeasured = Measure();
char message[50];

int i = valMeasured;
sprintf (message, "value: %i", i);
uart_putst1(message);
}


}

Ich bekomme immer 279,280,281 als wert ausgegeben, egal wie ich mein Poti einstelle. Der Schaltplan liegt bei. Ich habe dort PA5 an den Mittelkontakt des Poti gelegt und kann an Pin38 auch 1-4v messen.
Habt Ihr eine Idee?

Danke
Mathias

SprinterSB
06.04.2006, 14:29
Da ist mindestens ein Fehler in deiner Ausgabe.

Ein int wird niemals nicht einen Wert von 279,280,281 haben.
Der Wertebereich von int ist [-32768, 32767] = [-2^15, 2^15 -1]

happyspider
06.04.2006, 16:05
Tut mir leid: Meinte natürlich manchmal 279, dann wieder 280 und manchmal auch 281
:-)

SprinterSB
06.04.2006, 17:04
Und MUX=0 passt zu PA5?
Sollte es nicht MUX=5 sein?

happyspider
06.04.2006, 17:39
Du hast Recht: Ich habe da was durcheinander bekommen. Das Board sieht 2 IC vor und ich habe natürlich den falschen genommen. Hab mich schon die ganze Zeit gefragt wie ich an Pin 43 kommen soll bei einem Atmel16.
Jetzt liegt PA0 (PIN40) richtig am Poti, ich benutze ADMUX = 0; ...und es misst!
Danke !
Mathias