Hi Leute!
Ich finde Interrupts/Timer usw sind um einiges anspruchsvoller, wie der
ADC. Trotzdem bringe ich ihn nicht fertig..
Der ADC spuckt folgende Werte bei folgenden Zuständen aus:
400 bei GND
961 bei irgendein anderes höheres Potential
Wenn der Pin in der Luft hängt, werden beliebige Werte zwischen 400 und
961 ausgegeben.
Wenn ich AREF auf Masse hänge, stimmt der Wert, nämlich 1023.
An der USART-Funktion liegt es sicher nicht, die funktioniert
einwandfrei.
sprintf ist auch nicht daran Schuld.
Die äußere Beschaltung ist sehr wahrscheinlich auch richtig. Der
ATmega32 steckt im STK500. Dieses liefert an AREF 4,9V,an VCC 4,9V und
an AVCC 4,9V.
In meinem Fall liegt es entweder an irgendeinen "Logik-Fehler", den ich
nicht finde und/oder die ADC-Funktion tut nicht was sie soll.
Wäre nett wenn ihr mal ein Auge auf den Code wirft =)
Danke schonmal!
1
/*Analog-Digital-Converter (ADC)
2
ATmega32 @ 8 Mhz
3
(c) Christoph Anlauf
4
3AN
5
6
7
************************************************
8
Spannungsrefernz über AREF
9
Am PINA0 wird die Spannung gemessen
10
************************************************
11
*/
12
13
#include<avr/io.h>
14
#include<stdio.h>
15
16
#ifndef F_CPU
17
#define F_CPU 8000000UL //Taktfrequenz definieren
18
#endif
19
20
#include<util/delay.h> //Delay
21
22
23
voidUSART_Init(constuint16_tbaud);
24
voidUSART_Transmit(uint8_tdata);
25
voidUSART_Puts(char*string);
26
27
voidADC_Init(void);
28
unsignedintADC_Conversion();
29
30
voidmain(void)
31
{
32
uint16_ti=0;
33
34
uint8_tz;
35
charbuffer[40];
36
//Lokale Variablen
37
38
constuint16_tbaud=51;
39
//Der "Baud-Rate Parameter" wird durch die Frequenz und
In meinem Fall muss ich bei dem ADMUX-Register garnichts machen. Alle
Bits haben den "default" Wert 0. Ich will die Spannung am PINA0 messen,
also MUX0:MUX4 sind 0.
Ich will das Ergbis rechtsbündig haben, also ist das ADLAR-Bit auch 0.
Spannungsreferenz ist bei AREF -> REFS1:REFS0 sind auch null.
Mfg
jfjbcxvb schrieb:
> Ich habe es gerade mal getestet, das anhaengende leicht veraenderte> Beispiel funktioniert bei mir prima.>> Gast
Vielen Dank dass du dir die Mühe gemacht hast es auszuprobieren =)
Also hast du die ADC-Ergebnisse auch über das USART ausgelesen?
Bei mir klappt es immer noch nicht, trotz AVCC als Referenz.
Vll hilft es wenn du mir in deinem Fall die äußere Beschaltung erklärst.
Womöglich ich habe ich da einen Fehler.
Nur eine kleine Anmerkung am Rande =)
1
ADMUX=(1<<REFS0|0<<REFS1);
Davon abgesehen dass die Bits standartmäßig auf 0 sind, hat es keinen
Sinn einen Wert mit 0 zu "verODERn". Der Wert bleibt so wie er war.
Mfg
Christoph
Christoph A. schrieb:
> Nur eine kleine Anmerkung am Rande =)>>
1
>ADMUX=(1<<REFS0|0<<REFS1);
2
>
>> Davon abgesehen dass die Bits standartmäßig auf 0 sind, hat es keinen> Sinn einen Wert mit 0 zu "verODERn". Der Wert bleibt so wie er war.
Im Prinzip hast du recht.
Für die Maschine macht es keinen Unterschied.
Für jemanden, der das Programm liest kann es aber einen Unterschied
machen. So sieht man auf Anhieb, dass die Absicht war, REFS0 auf 1 und
REFS1 auf 0 zu setzen.
Christoph A. schrieb:
> Bei mir klappt es immer noch nicht, trotz AVCC als Referenz.> Vll hilft es wenn du mir in deinem Fall die äußere Beschaltung erklärst.> Womöglich ich habe ich da einen Fehler.
Eingangsspannung an ADC0
AVcc an Vcc
ARef über 100nF mit GND verbunden.
Karl heinz Buchegger schrieb:
> Christoph A. schrieb:>>> Bei mir klappt es immer noch nicht, trotz AVCC als Referenz.>> Vll hilft es wenn du mir in deinem Fall die äußere Beschaltung erklärst.>> Womöglich ich habe ich da einen Fehler.>> Eingangsspannung an ADC0> AVcc an Vcc> ARef über 100nF mit GND verbunden.
So sieht meine Konfiguration auch aus... bis auf den C auf Masse, aber
an der Entkopplung wird es wohl nicht scheitern...
Vll habe ich ja meinen ATmega-ADC zerschossen. Werde mal ein anderes
Exemplar probieren.
Viele Dank für eure Hilfe bis jetzt.
Karl heinz Buchegger schrieb:
> Christoph A. schrieb:>>> Nur eine kleine Anmerkung am Rande =)>>>>
1
>>ADMUX=(1<<REFS0|0<<REFS1);
2
>>
>>>> Davon abgesehen dass die Bits standartmäßig auf 0 sind, hat es keinen>> Sinn einen Wert mit 0 zu "verODERn". Der Wert bleibt so wie er war.>> Im Prinzip hast du recht.> Für die Maschine macht es keinen Unterschied.> Für jemanden, der das Programm liest kann es aber einen Unterschied> machen. So sieht man auf Anhieb, dass die Absicht war, REFS0 auf 1 und> REFS1 auf 0 zu setzen.
Stimmt, auf die Idee dass das Absicht gewesen sein könnte bin ich nicht
gekommen^^
So wäre es von meiner Seite auch besser gewesen etwas mit dem
ADMUX-Register hinzuschreiben, auch wenn alle Bits auf 0 sein sollen.
Christoph A. schrieb:
> Wenn ich AREF auf Masse hänge, stimmt der Wert, nämlich 1023.
Wenn Du AREF auf Masse haengst, dann stimmt so ziemlich jeder Wert (oder
auch eben nicht). Division by zero. Undefiniert... ;)
Wenn Du A0 auf GND legst sollte der Wert 0 sein, wenn Du A0 auf Vref
legst, sollte er 1023 sein (bei 10-Bit Aufloesung).
Volker
Volker Schulz schrieb:
> Christoph A. schrieb:>> Wenn ich AREF auf Masse hänge, stimmt der Wert, nämlich 1023.>> Wenn Du AREF auf Masse haengst, dann stimmt so ziemlich jeder Wert (oder> auch eben nicht). Division by zero. Undefiniert... ;)>> Wenn Du A0 auf GND legst sollte der Wert 0 sein, wenn Du A0 auf Vref> legst, sollte er 1023 sein (bei 10-Bit Aufloesung).>> Volker
Schon klar =)
Ob ihr es glaubt oder nicht, der ATmega war Schuld.^^
Mit einem 2ten Examplar läuft der Code einwandfrei. Sogar extrem genau
-> Bei einem Spannungsteiler von 1:1, ist der Wert 511. Also ziemlich
genau die Hälfte..
Nja, aufjedenfall kann ich heute beruhigt schlafen, vielen Dank an euch
=)
Mfg