Forum: Mikrocontroller und Digitale Elektronik Atmega 16 zwei Analogsignale?


von Bascompasstschon (Gast)


Lesenswert?

Hallo liebes Forum!

Ich habe mit Bascom letztens einen Code geschrieben, in dem ich zwei 
analoge Signale einlese. Allerdings funktioniert das nicht so richtig, 
daher wollte ich erfragen, ob es generell möglich ist. Ich habe im 
Datenblatt gelesen, da steht, dass der komplette Port A für analoge 
Signale gedacht ist. Kann ja sein, dass wieder irgendwo steht, dass man 
aber nur einen zur Zeit benutzen kann. Ich frage beide Analogsignale in 
einem Unterprogramm ab, dass über einen Bebounce-Befehl aufgerufen wird.

Viele Dank schonmal!

Viele Grüße! :-)

von spess53 (Gast)


Lesenswert?

Hi

>Ich frage beide Analogsignale in
>einem Unterprogramm ab, dass über einen Bebounce-Befehl aufgerufen wird.

Der ATMega16 hat nur einen ADC. Also können keine zwei ADC-Kanäle 
gleichzeitig eingelesen werden. Das geht nur nacheinander.

MfG Spess

von Bascompasstschon (Gast)


Lesenswert?

Aaaaa okay, vielen Dank, dann weiß ich jetzt Bescheid! :-)

von Jürgen (Gast)


Lesenswert?

Was hast du denn für Audiosignale (Art, Frequenz)? Der ATMega16 ist i. 
A. und u. U. so schnell, dass er mehr als einen Kanal quasi gleichzeitig 
abtasten kann.

von Bascompasstschon (Gast)


Lesenswert?

Könnte ich denn zwei analoge Signale einlesen, wenn ich noch einen 
externen ADC dazu nehme?

von spess53 (Gast)


Lesenswert?

Hi

>Könnte ich denn zwei analoge Signale einlesen, wenn ich noch einen
>externen ADC dazu nehme?

Must du denn zwei Signale wirklich gleichzeitig einlesen? Der ATMega16 
hat zwar nur einen ADC, aber der kann mit 8 verschieden Eingängen 
verbunden werden. Und diese Eingänge kann man nacheinander mit dem ADC 
abfragen.

MfG Spess

von Bascompasstschon (Gast)


Lesenswert?

Vielleicht liegt es auch an meiner Vorgehensweise. Ich habe zwei 
mechanische Schalter und wollte zuerst über Pins abfragen, ob diese 
geschlossen sind oder nicht. Leider hat das überhaupt nicht geklappt 
(verzweifel) :-((( dann habe ich mir überlegt, dass ich das 
Spannungssignal ja auch einfach am ADC einlesen könnte und dann hat das 
Programm soweit funktioniert. Leider kommt da jetzt aber nur Stuß raus, 
wenn ich zwei analoge Signale einlesen will.

von Karl H. (kbuchegg)


Lesenswert?

> Und diese Eingänge kann man nacheinander mit dem ADC
> abfragen.

Nur um das klarzustellen:
Und bei 'nacheinander' bewegen wir uns Bereich von etwa Millisekunden 
abwärts, bis etwa 0.06 Millisekunden

Kann natürlich sein, dass dir das einen zu großen Zeitversatz bringt. 
Normalerweise ist es aber kein wirkliches Problem. Hängt aber von der 
Aufgabenstellung ab.

von Bascompasstschon (Gast)


Lesenswert?

Ich habe die Schalter mit einer externen Spannungsquelle von 5V 
verbunden. Geht es auch, wenn ich die Spannung an einem PortX abgreife, 
mit einem anderen PortY, den ich als Eingang festlege, verbinde und 
zwischen diesen einen Schalter lege? Wenn der Schalter betätigt wird, 
müsste ja PortY auf High liegen, oder? Falls das ginge, wie würde denn 
der Code dazu aussehen?! Vielen Dank im Voraus :-)

von Karl H. (kbuchegg)


Lesenswert?

Bascompasstschon schrieb:
> Vielleicht liegt es auch an meiner Vorgehensweise. Ich habe zwei
> mechanische Schalter und wollte zuerst über Pins abfragen, ob diese
> geschlossen sind oder nicht. Leider hat das überhaupt nicht geklappt
> (verzweifel) :-(((

2 Schalter abfragen sollte aber nicht wirklich ein Problem sein.
Erzähl doch mal mehr. Was sind das für Schalter? Wie hast du sie 
angeschlossen?

> dann habe ich mir überlegt, dass ich das
> Spannungssignal

Wo kommt denn da jetzt eine Spannung ins Spiel?

> ja auch einfach am ADC einlesen könnte und dann hat das
> Programm soweit funktioniert. Leider kommt da jetzt aber nur Stuß raus,
> wenn ich zwei analoge Signale einlesen will.

Du schiesst hier aber (höchst wahrscheinlich) mit Kanonen auf Spatzen. 
Wenn du eine realtiv einfache Sache, nämlich das Feststellen ob ein 
Schalter geschlossen ist oder nicht, schon nicht hinkriegst, dann ist 
sehr wahrscheinlich ein ADC nicht das was du willst. Statt dessen willst 
du eher lernen, wie man Schalter richtig anschliesst, so dass das dann 
auch funktioniert.


Also, erzähl mal mehr über deine Aufgabenstellung. Dann kann man 
überlegen, ob dein Lösungsansatz überhaupt vernünftig ist.

von Karl H. (kbuchegg)


Lesenswert?

> Wenn der Schalter betätigt wird, müsste ja PortY auf High liegen, oder?

Die Frage ist eher: Welcher Pegel liegt eigentlich an, wenn der Schalter 
NICHT betätigt ist. Ein Eingang, an dem nichts angeschlossen ist (und 
das ist der Fall, wenn der Schalter nicht betätigt ist), kann jeden 
erdenklichen Zustand annehmen. Der ist nicht automatisch 0. So ein 
offener Eingang fängt sich jedes rumlungernde elektromagnetische Feld 
aus der Umgebung ein. Und davon gibt es in einem Haushalt jede Menge. Da 
sind die 230V Leitungen in der Wand. Da ist Radio, Fernsehen. Da ist das 
Feld, welches der Elektromotor im Staubsauger erzeugt. Da ist ...

von Jürgen S. (jurs)


Lesenswert?

Bascompasstschon schrieb:
> Vielleicht liegt es auch an meiner Vorgehensweise. Ich habe zwei
> mechanische Schalter und wollte zuerst über Pins abfragen, ob diese
> geschlossen sind oder nicht. Leider hat das überhaupt nicht geklappt
> (verzweifel) :-((( dann habe ich mir überlegt, dass ich das
> Spannungssignal ja auch einfach am ADC einlesen könnte und dann hat das
> Programm soweit funktioniert. Leider kommt da jetzt aber nur Stuß raus,
> wenn ich zwei analoge Signale einlesen will.

Könnte es vielleicht sein, dass PullUp bzw. PullDown Widerstände fehlen 
und Du ganz eventuell "nicht verbundene" Pins mit "undefiniertem Pegel" 
an einem Schalterende auslesen möchtest?

von Karl H. (kbuchegg)


Lesenswert?

Daher sieht der Standardanschluss eines Tasters/Schalter so aus:


  --------------+
           5V   |
            |   |
           +-+  |
           | |  |
           +-+  |
            |   | µC-Pin
          --+---|-o-----+
                |       |
                |         /
                |        /   Schalter
  --------------+       |
                        |
                --------+----- GND (Masse)

d.h. der Schalter schaltet nicht nach +5V, sondern nach Masse. Denn der 
Pullup Widerstand, der die Leitung bei offenem Schalter nach +5V zieht, 
der ist im AVR schon eingebaut. Den muss man nur aktivieren.

Schalter offen        -> Eingang liefert eine 1
Schalter geschlossen  -> Eingang liefert eine 0


Ob der Eingang bei geschlossenem Schalter eine 0 liefert, oder so wie du 
dir das vorstellst, eine 1, ist ja programmtechnisch letzten Endes egal. 
Das eine ist im Programm nicht komplizierter als das andere. Auch wenn 
du vorstellungsmässig dir mit der Zuordnung 'geschlossen - 1' erst mal 
leichter tust. Daran gewöhnt man sich aber schnell und dann ist es kein 
Problem mehr.

von Bascompasstschon (Gast)


Lesenswert?

Gut, ist sicherlich hilfreicher, wenn ich ersteinmal etwas über meine 
Aufgabenstellung erzähle ^^.

Ich will einen Servomotor, der einen kleinen Aufsatz auf einer Spindel 
betreibt, mehrmals hin und her fahren lassen. Damit der Aufsatz nicht 
gegen das jeweilige Endstück knallt, will ich über Endschalter abfragen, 
ob er diesen erreicht hat, oder nicht. Wenn er geschlossen ist, soll der 
Motor dann anhalten. Die Schalter sind von der Firma "Kema Keur", ich 
habe die in der Werkstatt gefunden, ich weiß leider nicht nicht welches 
Modell. Die haben einen Eingang 1 und zwei Ausgänge 2,3. Ich brauche 
aber nur einen Eingang und einen Ausgang. Da gebe ich Ihnen Recht, das 
mit dem ADC ist wirklich mir "Kanonen auf Spatzen" geschossen, aber das 
andere habe ich irgendwie überhaupt nicht hinbekommen und war schon 
total verzweifelt, weil es ja keine schwierige Sache darstellt :-((. 
Daher würde ich mich über Hilfe sehr freuen.

Viele Grüße!

von Karl H. (kbuchegg)


Lesenswert?

Bascompasstschon schrieb:
> Gut, ist sicherlich hilfreicher, wenn ich ersteinmal etwas über meine
> Aufgabenstellung erzähle ^^.
>
> Ich will einen Servomotor, der einen kleinen Aufsatz auf einer Spindel
> betreibt, mehrmals hin und her fahren lassen. Damit der Aufsatz nicht
> gegen das jeweilige Endstück knallt, will ich über Endschalter abfragen,
> ob er diesen erreicht hat, oder nicht. Wenn er geschlossen ist, soll der
> Motor dann anhalten.

Passt perfekt.
Schalter wie im letzten Posting anschliessen und ganz normal auslesen.

Portpin auf Eingang, Pullup aktivieren
und auf die Zuordnung 'geschlossener Schalter liefert eine 0' achten

von Bascompasstschon (Gast)


Lesenswert?

Gut, herzlichen Dank, das werde ich dann mal versuchen! :-)

von oldmax (Gast)


Lesenswert?

Hi

Muss doch auch noch was beitragen....
> Ich will einen Servomotor, der einen kleinen Aufsatz auf einer Spindel
> betreibt, mehrmals hin und her fahren lassen. Damit der Aufsatz nicht
> gegen das jeweilige Endstück knallt, will ich über Endschalter abfragen,
> ob er diesen erreicht hat, oder nicht. Wenn er geschlossen ist, soll der
> Motor dann anhalten.

Es ist in der Regel besser, du benutzt bei einem Schalter den Öffner. 
Das bedeutet, Freigabe zum Drehen des Motors, wenn der Kontakt 
geschlossen ist, anhalten, wenn der Kontakt öffnet. Das hat den Grund, 
das wenn es einmal zu einem Drahtbruch kommt, der Motor eben keine 
Freigabe mehr hat und dann auch sofort stehen bleibt. Würdest du darauf 
warten, das sich der Kontakt sschließt, läuft der Motor im Fehlerfall 
bis Rauchzeichen dem ein Ende setzen.

Ansonsten, denk an Widerstände, entweder die internen Pull-Down oder 
externe Pull-Up.
Gruß oldmax

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.