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
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ß
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.
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
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.
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
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
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.
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
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
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.