Forum: Mikrocontroller und Digitale Elektronik Hilfe bei ADC mit Evaluationboard


von TheLeFish .. (thelefish)


Lesenswert?

Liebe Community!

Ich bin ein Neustarter, was Mikrocontroller angeht. Nachdem ich erste 
Schritte mit den Digitalen I/Os gemacht habe und erfolgreich ein paar 
LEDs habe blinken lassen, scheitere ich (wie wahrscheinlich auch schon 
viele vor mir) am ADC.

Ich benutze den ATmega8 an einem Pollin Evaluationboard. Zusätzlich habe 
ich noch das Add-On-Board, bei welchem ich derzeit nur die Steckbuchsen 
verwende um auf ein Steckbrett zu gehen.

Ich habe mich exakt an folgendes Tutorial gehalten: 
http://www.robotplatform.com/knowledge/ADC/adc_tutorial_4.html (auch was 
die benutzen Ports und Pins betrifft)

Dieses Tutorial deswegen, da ich mir als Neustarter recht bald 
Ergebnisse erhoffte, auf denen ich dann aufbauen kann.

Das Verhalten des Add-On-Boards lässt sich recht einfach beschreiben: Es 
leuchtet nur jene Led, die an PD6 angeschlossen ist. Egal welche 
Stellung des Potis ich einstelle. Mit dem Voltmeter an PC5 kann ich 
jedoch die veränderte Spannung abgreifen.

Die Jumper am Evaluationsboard habe ich alle außer 1-5 entfernt.

Zu denken gibt mir, dass das Tutorial keine Aussagen über benutzte Fuses 
gibt. Ich habe versucht die Fuses laut "Default" und "Pollin TESTTOOL" 
zu setzen, jedoch stellt sich kein Erfolg ein.

Auch steht hier unter mikrokontroller.net im Tutorial unter ADC dass bei 
Benutzung der internen Referenz ein 100nF C zwischen ARef und GND 
geschaltet werden soll. Trifft dies nicht für das andere Tutorial auch 
zu?

Könnte mich bitte jemand aufklären, wo mein Fehler liegen könnte?
Oder gar hier einen ähnlich einfachen Code, welcher am Evaluation-Board 
getestet wurde, mit ganz kurzer Beschreibung über Fuses und Beschaltung 
reinstellen.

Zum Compilieren verwende ich erfolgreich AVR Studio 4 mit der Toolchain 
3.4.2 unter Win7x64 und zum Brennen burn-o-mat als frontend von AVRdude

Ich wäre euch für eure Hilfe sehr dankbar!

LG
LeFish

: Bearbeitet durch User
von AVRuser (Gast)


Lesenswert?

Hallo,

bei dem genannten Tutorial wird vorausgesetzt, dass am Pin "AREF" die 
Versorgungsspannung (AVCC) anliegt. Dies ist beim Pollin Board meines 
Wissens nicht der Fall; der Pin ist dort offen.

Also miss mal die Spannung am AREF-Pin. Sollte hier nichts anliegen, 
dann den Pin mit AVCC verbinden oder (besser) als ADC-Referenz AVCC 
wählen.
Und in diesem Fall gehört dann der angesprochene Kondensator zwischen 
AREF und GND (ebenso wie bei interner Referenz).
Siehe dazu auch das Datenblatt des ATmega8 (ADC-Register).

Zum Schnelltesten dies beim Tutorial-Code eingeben:
Statt
>>   ADMUX=0x05;  //Binary equivalent of 0101
heisst es nun
>  ADMUX=0x45;  //Ref = AVCC, ADC channel = ADC5

Die Fuses haben übrigens mit dem ADC nichts zu tun; sie dienen anderen 
Zwecken. (Näheres im Datenblatt)

Gruß

von AVRuser (Gast)


Lesenswert?

Nachtrag:

In einem Punkt ist das verwendete Tutorial inkonsequent: Mal wird die 
Bitnamen-Schreibweise, mal die Hex-Schreibweise bei Register-Zuweisungen 
verwendet. Besser verständlich ist hier die Bitnamen-Schreibweise:

> ADMUX = (1<<REFS0) | (1<<MUX2) | (1<<MUX0);  //Ref = AVCC, ADC channel = ADC5

Damit kann man genau erkennen, welche Bits im Register gesetzt werden.

von TheLeFish .. (thelefish)


Lesenswert?

Liebe Community!

Ich habe nun aus einem anderen Forumsbeitrag [1], sowie dem LCD-Tutorial 
und dem oben genannten externen Tutorial eine Testumgebung 
zusammengebastelt. (Anmerkung: Die LCD-Routinen [2] sind ja wirklich gar 
nicht schwer zu benutzen!)

Mein Code sieht nun folgendermaßen aus:
1
//Fuer ATmega8 mit 1Mhz
2
3
#include<avr/io.h>
4
#include"lcd-routines.h"
5
#define F_CPU 1000000
6
#include <util/delay.h>
7
#include <stdint.h>
8
9
#define  PORT_ON(port,pin) port |= (1<<pin)
10
#define  PORT_OFF(port,pin)  port &=  ~(1<<pin)
11
12
int main(void)
13
{
14
int adcwert;
15
char buf[5];
16
17
  DDRD=0xff;  // Set Port D for LED output
18
  PORTD  = 0x00;  // Clear Portd pins
19
20
lcd_init();
21
lcd_setcursor(3,1);
22
lcd_string("ADC5 Wert:");
23
24
25
   ADCSRA  = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);
26
  // Set ADCSRA Register with division factor 32
27
28
  ADMUX=0x05;  //Binary equivalent of 0101
29
//Dummy Readyout
30
ADCSRA  |= (1<<ADSC);  // Start conversion
31
    while (ADCSRA &  (1<<ADSC));
32
    // wait until conversion  completes; ADSC=0 means Complete
33
34
    adcwert = ADCW;  //Store ADC result
35
36
//Richtiges Readout
37
while (1) 
38
{
39
ADCSRA  |= (1<<ADSC);  // Start conversion
40
    while (ADCSRA &  (1<<ADSC));
41
    // wait until conversion  completes; ADSC=0 means Complete
42
43
    adcwert = ADCW;  //Store ADC result
44
  //adcwert = 320;
45
46
//Ergebnis auf Display darstellen
47
lcd_setcursor(6,2);
48
itoa(adcwert,buf,10);
49
lcd_string(buf);
50
if (adcwert < 512)
51
    {
52
    PORT_OFF(PORTD,6);  // Clear 6th bit
53
    PORT_ON  (PORTD,7);  // Set 7th  bit
54
    }
55
    else
56
    {
57
    PORT_ON(PORTD,6);  //  Set 6th bit
58
    PORT_OFF  (PORTD,7);  // Clear 7th bit
59
    }
60
_delay_ms(500);
61
}
62
}

Das LCD zeigt wie erwartet einen zentrierten ADC-Wert an.

Schließe ich nun ARef über 100nF auf GND, so steht im Diplay 1023.
Schließe ich ARef nach +5V, so schwanken die Werte willkürlich im 
Bereich um 400.
Das Verstellen des Potis hat in beiden Fällen keine Auswirkung.

Bei Vorgabe eines Wertes für "adcwert" wird dieser im LCD angezeigt, 
eine der beiden LEDs leuchtet dem Wert entsprechend.


Bitte helft mir weiter!

LG
LeFish

[1] Beitrag "ATmega8: ADC-Wert auf Display ausgeben klappt nicht"
[2] 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

Schreib mal in die Zeile
ADMUX=0x05;

ADMUX|=(1<<REFS0)|(1<<MUX2)|(1<<MUX0);

Wenn die LCD-Ausgabe dann nicht richtig anzeigt, solltest du dich mal 
über int oder unsigned int klar machen und die LCD Ausgabe überdenken.

von Hubert G. (hubertg)


Lesenswert?

Das mit int und unsigned int war Unsinn, da habe ich mich von der LCD 
Ausgabe verwirren lassen.
Warum die LCD-Ausgabe nicht korrekt ist, hat dir Karl-Heinz schon in dem 
anderen Thread erklärt.

: Bearbeitet durch User
von TheLeFish .. (thelefish)


Angehängte Dateien:

Lesenswert?

Hi!

Ich habe leider noch immer das selbe Problem. Mittlerweile habe ich auch 
schon versucht mittels einer Testversion von FlowCode eine LCD Anzeige 
des ADC-Wertes zu bewerkstelligen. Auch damit zeigt ein mittlerweile 
anderer ATmega8 nur wirre Zahlen im Bereich von 450-600 an.

Auf ARef liegen +5V an. Es wird ADC0 (PC0) benutzt. Zur Ausgabe wurde 
das Display an (PD0-5) angeschlossen. Ich benutze den interneren 8MHz 
Takt.

Ist jemand von euch auch schon über dieses Problem im Zusammenhang mit 
einem Pollin-Evaluationsboard und Addon-Board gestoßen?

Schön langsam bin ich am verzweifeln!

Im Internet sind ja auch nur ähnliche Anleitungen zu finden, bei denen 
niemals mein Problem angesprochen wird.

Anbei sind die mittels FlowCode erstellten Files.

Weiß jemand von euch Rat?

LG
LeFish

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

Ich kann dir nur sagen, das du sehr Beratungsresistent bist. Dein Code 
funktioniert mit Ausnahme der LCD-Ausgabeformatierung.
Warum die LCD-Ausgabe nicht korrekt ist, hat dir Karl-Heinz schon in dem
anderen Thread erklärt.

von TheLeFish .. (thelefish)


Lesenswert?

Hi!

Nur als kurze Rückmeldung für alle, die evtl. mal über ein ähnliches 
Problem stoßen:

Das Evaluationsboard war/ist schuld. Ich habe den exakten Grund noch 
nicht herausgefunden, aber ich habe die Schaltung auf einem Steckbrett 
aufgebaut und sie funktionierte auf Anhieb einwandfrei.

Mir ist/war bewusst, dass die Ausgabe auf dem LCD jeweils den letzten 
Digit stehen lässt und dies zu quasi unlesbaren Ergebnissen führt. Die 
ADC-Wandlung hatte bei mir jedoch überhaupt nie funktioniert (siehe 
"zufallswerte" oben)

Also ein gewisser Lerneffekt stellte sich nun bei mir ein, nachdem ich 
das Pollin-Bundle als vermeindlich sichere Testumgebung kaufte:

Eine einfache Testschaltung immer vorher auf dem Steckbrett 
ausprobieren, bevor man unnötigerweise herumnervelt.

Danke dennoch für eure Hilfe, ihr habt mich ein bisschen näher an die 
Basics von C auf den AVRs herangeführt (Setzen der verschiedenen 
ADC-Register beispielsweise)

Für alle, die noch auf der Suche nach einer guten Ergänzung zum allseits 
beschworenen AVR-GCC-Tutorial sind sei der folgende Link ans Herz 
gelegt:

http://www.avr-modelleisenbahn.de/atmega8/18-analog-digital-wandler.htm

Danke euch!

LG
LeFish

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

Da würde mich interessieren was der Fehler war. Ich verwende auch das 
Pollin Eval-Board und das AddOn.
Bei mir hat dein Programm aber funktioniert.
Oder bist du über die Port und Pinverschiebungen gestolpert?

: Bearbeitet durch User
von TheLeFish .. (thelefish)


Lesenswert?

Hi!

LOL

Also da bin ich wohl drübergestolpert. Habs jetzt mal durchgemessen - 
für den ATMEGA8 scheint zB (Evaluationboard)PC->PA(Addonboard) zu 
gelten! Toll wenn da so schöne Aufdrucke auf der Platine sind... Und 
dann wird man ja von Pollin gleich aufmerksam gemacht. (hab bis jetzt 
noch immer nichts in den Beschreibungen gefunden...)

Solange ganze Ports verschoben werden, ok...

Aber einzelne Pins?! SUPA...

Wärst du so freundlich und würdest mir eine Liste, sofern du eine hast 
übermitteln, wie denn jetzt die einzelnen Belegungen für die 
unterschiedlichen uCs am Addon-Board wirklich ausschauen?

LG
LeFish

: Bearbeitet durch User
von Hubert G. (hubertg)


Lesenswert?

In der Beschreibung ab Seite 9 ist das alles aufgelistet. Fall du die 
nicht hast, bei Pollin herunterladen.
Das ist etwas gewöhnungsbedürftig, aber es ist nun mal ein Billigteil, 
da muss man einiges in Kauf nehmen.
Vom Mega8 her ist es nur PC > PA und PortB0 beginnt bei PortB3 (beim 
AddOn beginnt das zählen mit 1).

von TheLeFish .. (thelefish)


Lesenswert?

Hi!

Danke für deine Erklärung!

Dass die Aufdrucke auf der Platine eigentlich also für ATMEGA16,32 (und 
nicht übertragbar) sind hab ich erst dank dir begriffen.

Also die Beschreibung is leider scho a bissl schwach... sonst ist es 
aber wirklich ganz in Ordnung.

Bzgl PortB0: Bei meinen Ports beginnt das Zählen der Aufdrucke bei den 
Ports mit 0!
Also scheints da auch eine gewisse Diskrepanz zu geben.

In der Dokuabteilung hams da also maximal ein paar Studenten (also 
solche wie mich) sitzn =)

Danke euch!

LG
LeFish

[CLOSED]

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.