mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR mit dem ADC Verzweifeln


Autor: Ephraim Hahn (ephi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leute,

ich bin am verzweifeln. ich versuche den ganzen tag schon den ADC meines 
ATmega 644 zum leben zu erwecken. Aber in der Hauptschleife kommt 
einfach nichts auf dem LCD an...

ich verwende die LCD routinen aus dem avr-gcc tutorial. Code im Anhang

ich dachte schon das sich LCD und ADC an PORTA in die Haare kommen, aber 
ich hab den ganzen code durchgeguckt und im LCD teil werden die 
nichtbenötigten Porta pins eigentlich immer schön ausmaskiert.

Wär schön wenn mal einer drübergucken könnte...

Autor: Ephraim Hahn (ephi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und der lcd code. Header ist denke ich unwichtig

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm doch für deine ersten Tests die ADC Routine aus dem Tutorial. Die 
funktioniert.
Wenn du die am Laufen hast, kannst du immer noch anfangen sie zu 
verändern.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hatte ich auch erst gemacht. Allerdings hatte ich da genau das 
gleiche problem. Das LCD bleibt einfach leer.

Außerdem hab ich diese freerunning methode auf nem attiny einwandfrei am 
laufen, daran wirds also wohl nicht liegen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei allerdings auch interessant ist, was dein ADC macht, wenn

  LCD_PORT &= 0xF0;

am Port rumpfriemelt.
Leg doch das LCD auf einen anderen Port. Es ist sowieso keine gute Idee, 
wenn anderer Code am ADC-Port rumschaltet, wenn der ADC seine Messung 
macht (selbst wenns nicht am gleichen Pin ist)

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe deine main loop mal teilweise "unrolled". Fällt Dir was auf?
    lcd_clear();

    _delay_ms(100);

    lcd_string(itoa(result,buffer,10));
    lcd_clear();

    _delay_ms(100);

    lcd_string(itoa(result,buffer,10));
    lcd_clear();

    _delay_ms(100);

    lcd_string(itoa(result,buffer,10));
    lcd_clear();
    ....

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmja, das problem ist ich hab mir hier vor einiger zeit ein LCD 
lochraster modul für den SK500 header gebaut, und da ist es fest auf 
porta verlötet. Ich hab es auch nur zum testen dran, nacher wird über 
den adc wert eine PWM geregelt und das lcd kommt weg.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Ich habe deine main loop mal teilweise "unrolled". Fällt Dir was auf?
>
>     lcd_clear();
> 
>     _delay_ms(100);
> 
>     lcd_string(itoa(result,buffer,10));
>     lcd_clear();
> 
>     _delay_ms(100);
> 
>     lcd_string(itoa(result,buffer,10));
>     lcd_clear();
> 
>     _delay_ms(100);
> 
>     lcd_string(itoa(result,buffer,10));
>     lcd_clear();
>     ....
> 

Ach herrje, jetzt seh ichs auch :-)
Klar, da wird man auf dem LCD nicht viel sehen :-)
Und seine Fehlerbeschreibung lautet ja auch nicht: es wird immer 0 
angezeigt, sondern "ich sehe nichts".
itoa liefert immer irgendeine Zahl im Buffer. Nur wenn man die gleich 
weglöscht ....

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts desto trotz sollte beim Programmstart zumindest für 1 Sekunde 
"Welcome!" zu sehen sein.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ephraim Hahn schrieb:
> und der lcd code. Header ist denke ich unwichtig

Und woher sollen wir dann wissen, an welchen Pins genau du dein LCD 
betreibst?

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach verdammt, ich bin so ein Idiot... natürlich, und ja Welcome ist zu 
sehen!

Ich danke Euch!

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die Motorfader eigentlich schon am laufen?

Habs inzwischen aufgegeben dich über deine Mailadresse zu kontaktieren, 
da bis jetzt jede Mail nach 8 Tagen zurück kam.

Zitat:
This message was created automatically by mail delivery software (Exim).

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  ephraimhahn@*****.**
    SMTP error from remote mailer after RCPT TO:<ephraimhahn@*****.**>:
    host mail.*****.** [***.***.***.***]: 451-194.***.***.*** is not yet authorized to deliver mail from
    451 <magnetus@*****.**> to <ephraimhahn@*****.**>. Please try later.:
    retry timeout exceeded

Ich war mal eben so frei, einige Passagen im Zitat auszu-*-en.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ne scheiße... irgendsowas hab ich mir schon gedacht, hab aber grad so 
viel um die ohren, dass ich dem noch nicht nach bin...

Also, ich kümmer mich heut mittag drum und meld mich dann per pm bei 
dir.

Ja die fader laufen soweit einwandfrei (hat nichts mit dieser ADC 
geschichte zutun...).

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,
hab auch ein Problem mit dem ADC.

Ich bin aber soweit, dass er mir den Wert 5V(1017)und 0VGnd(0000) am Lcd 
ausgiebt.

Jetzt wollte ich natürlich zwischenwerte Testen und genau da ist mein 
Poblem.

Wenn ich einfach ne 1,5V Batterie zwischen Gnd und PA3 (ADC-Eingang) 
hänge, zeigt mir mein LCD (0282) also den richtigen Wert an.
Wenn ich aber mir nen Spannungsteiler am Steckbord aufbaue und an den 
ADC anschließe bricht die Spannung ein und am LCD wird dann natürlich 
nur 0000 angezeigt. Aufbau des Spannungsteilers hab ich angehängt.
Den ADC betreibe ich mit AVcc als Referenz.

Weiß irgend jemand wo mein Fehler liegt bzw. was ich falsch mache?
Da ja werte angezeigt werden schätz ich mal liegts nicht am Programm, 
oder?

Benutze das Atmel Evaluationsbord von Pollin mit nem Atmega16.

Schon mal danke für euer bemühen.

Grüße Andy

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann schließ den Schleifer halt an PA3 an und nicht an PA0.

Autor: Steffen I. (echo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funzt die 1,5V-Direktmessung auch an PA0? Wenn nich is vllt die 
JTAG-Fuse gesetzt und damit hat man pegel am A-Port liegen. Hatte nen 
ähnliches Problem mit nem ATMega32 wegen dieser Fuse.

MfG Echo

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Steffen,
danke für deine Antwort.
Das Fuse war zwar nicht das Problem, aber es hat mich auf die richtige 
Idee gebracht.

Auf dem Pollin Bord kann man das LCD sehr bequem per Jumper an PORTA 
anschließen und ich wusste leider nicht, dass man die anderen PINS nicht 
belegen sollte wenn man den ADC verwendet; zumindest nicht zum ansteuern 
eines LCDs.

Das mit der Batterie ist eigentlich ja auch klar. Ich konnte sie messen, 
weil die Spannung bei einer Spannungsquelle ja auch gegen Masse nicht 
einfach zusammenbricht. ;-)

Kann man den PORTA bei nutzung des ADC eigentlich sonnst zu gar nix 
nutzen?
Ich frag nur, weil ich ja nur einen benötige.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:

> Kann man den PORTA bei nutzung des ADC eigentlich sonnst zu gar nix
> nutzen?
> Ich frag nur, weil ich ja nur einen benötige.

Du kannst sie schon nutzen (bis auf die Pins, die du als ADC Eingänge 
benutzt). Die generelle Empfehlung lautet: solange der ADC misst, 
sollten keine Schaltvorgänge an den anderen Pins dieses Ports gemacht 
werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:
> Auf dem Pollin Bord kann man das LCD sehr bequem per Jumper an PORTA
> anschließen und ich wusste leider nicht, dass man die anderen PINS nicht
> belegen sollte wenn man den ADC verwendet; zumindest nicht zum ansteuern
> eines LCDs.

Das liegt dann in der Regel an der LCD-Routine. Manchmal ist die 
fehlerhaft und beeinflußt auch die Pins des Ports, die sie nicht 
benötigt.

Neuere AVRS haben ein Disable-Register, mit dem man die digitale 
Funktion der ADC-Pins abschalten kann. Dann können sich Softwarefehler 
der LCD-Routine nicht auswirken.


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du kannst sie schon nutzen (bis auf die Pins, die du als ADC Eingänge
>benutzt). Die generelle Empfehlung lautet: solange der ADC misst,
>sollten keine Schaltvorgänge an den anderen Pins dieses Ports gemacht
>werden.

Was macht man dann mit nicht genutzte PINS des ADC? Sollte man die dann 
einfach gegen Masse verdrahten?

Und jetzt hab ich schon wieder was seltames. Wenn ich am Atmega16 an PB5 
nen Taster hänge kann ich ihn nicht mehr programmieren, aber das liegt 
dann wohl daran, dass der Pin dann über nen 330nF Kondensator an Masse 
liegt und über PORTB programmiert wird.

Ich glaub, langsam bin ich an nem Punkt angelangt, an dem ich mir meine 
Schaltung so aufbauen muss wie ich sie brauche.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was macht man dann mit nicht genutzte PINS des ADC? Sollte man die dann
>einfach gegen Masse verdrahten?

Ignorieren.

>Und jetzt hab ich schon wieder was seltames. Wenn ich am Atmega16 an PB5
>nen Taster hänge kann ich ihn nicht mehr programmieren, aber das liegt
>dann wohl daran, dass der Pin dann über nen 330nF Kondensator an Masse
>liegt und über PORTB programmiert wird.

Genau.

Autor: Blumi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> _delay_ms(1000);

Das ist mir noch aufgefallen
Das geht so vermutlich nicht - schau mal in die delay.h rein. Da steht 
wie groß die Zahl in der Funktion werden darf (bei 2 MHz sind das nur 
100ms oder so)

Autor: Blumi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß jetzt aber nicht wie groß du deine Frequenz gewählt hast (hast 
du auch die Speed definiert?)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.