PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 einfache TasterAuswertung Low/High über ADC7(Pin22)



Ze_ro|Co_ol
17.08.2008, 13:59
Hallo,

vielleicht kann mir jemand einen Tipp geben?
Ich habe eine vorgegebene Hardware mit einem
Low-aktiven Taster am ADC7-Eingang eines ATmega8.

Wie kann ich nun den Taster auf 0/1 abprüfen, vorerst ohne Entprellung?

Habe die Forumssuche benutzt und nichts gefunden...
oder hat mir jemand doch einen Link...?

Danke schonmal für die Antworten!

Gruß ZeroCool

fhs
17.08.2008, 14:19
Hi,

hast Du sonst keine I/O-Pins übrig? Wenn Du ADC7 beim ATmega8 einsetzen willst, kommst Du um eine A/D-Wandlung nicht herum; bei einem "normalen" I/O-Pin (im folgenden Beispiel PC0, der natürlich als Eingang konfiguriert sein muss; wenn der Taster gegen Masse schaltet, dann am besten mit internem Pullup-R aktiviert) würde genügen:
<pre>
if (PINC&(1<<PC0)) {
// code für PC0=H (Schalter offen)
} else {
// code für PC0=L (Schalter an Masse)
}
</pre>
Wie man eine A/D-Wandlung durchführt, steht im Datenblatt.

Gruß

Fred

Ze_ro|Co_ol
17.08.2008, 14:25
Hallo Frank,

danke für die schnelle Antwort!

Wie gesagt die Hardware ist schon vorgegeben, alle anderen Ports sind schon belegt.

Dann werde ich mal weiter tüffteln.

fhs
17.08.2008, 14:30
Hi,

da bleibt Dir nur, eine A/D-Wandlung durchzuführen. Du brauchst also einen externen Pullup-R und musst nach der A/D-Wandlung eine einfache Entscheidung treffen, ob "L" (Taster aktiv) oder "H"-Pegel ansteht. Ich nehme an, AVcc ist beschaltet; überlege mal, was mit Aref geschehen muss. Wenn der A/D-Wandler nicht noch für andere Zwecke benötigt wird, bietet sich AVcc als Referenzsspannung an (intern wählen). Das ist alles gut auf den Seiten zum A/D-Wandler im Datenblatt erklärt.

Gruß

Fred

Ze_ro|Co_ol
17.08.2008, 15:06
Hallo Fred,

ich vergaß: mega8 in der Bauform TQFP

Taster ist wie gesagt mit ADC7(Pin22) beschalten und dieser Pin wird bei Betätigung gegen Masse gezogen.

AREF ist nicht beschaltet.
AVCC ist VCC.

Alles klar, ziehe mir nochmal das Datenblatt intensiver rein,
beim erstem mal hat das noch nicht so gefruchtet.
Ist das erste mal das ich mich mit dem Thema AD-Wandler
beim mega8 beschäftige.

Danke für die schnelle Antwort, tolles Forum hier !

Gruß Andi

radbruch
17.08.2008, 15:15
Hallo


bei einem "normalen" I/O-Pin
Ein ADC-Pin ist natürlich in erster Linie auch ein normaler I/O-Pin. Zur Tastenabfrage: Pin auf Eingang, internen PullUp einschalten und dann Pin abfragen. Bei gedrücktem Taster (gegen GND) liegt am Eingang low.

Gruß

mic

Ze_ro|Co_ol
17.08.2008, 15:26
Hallo mic,

das wäre ja toll!
Ich verwende in meinem Programm das hier im Forum schon mehrfach genannte taster.h mit der get_taster Funktion.

Bei meinen Tasten an Port B und D funktioniert das einwandfrei.
Nur die letzte Taste an diesem ADC7-Eingang macht Probleme.

Wenn ich die die Funktion get_taster mit:

get_taster (5, PINC & (1<<PC7));

aufrufe, bekomme ich vom Compiler die Fehlermeldung:

'PC7' undeclared (first use in this funktion)

bei:
get_taster (4, PINB & (1<<PB0));
bekomme ich diese Fehlermeldung nicht.

zerush
17.08.2008, 15:40
Hallo


bei einem "normalen" I/O-Pin
Ein ADC-Pin ist natürlich in erster Linie auch ein normaler I/O-Pin. Zur Tastenabfrage: Pin auf Eingang, internen PullUp einschalten und dann Pin abfragen. Bei gedrücktem Taster (gegen GND) liegt am Eingang low.

Gruß

mic

Nein, dem ist beim Mega8 nicht so.
Der ADC7 ist ein reiner ADC Pin. ADC6 ist auch nicht gleich PortC6 (das ist nämlich der Reset Pin!).

Ich habe mich auch gewundert, aber ein Blick ins Datenblatt klärt das auf...

Ze_ro|Co_ol
17.08.2008, 15:44
:-) also zurück zur AD-Wandlung *Datenblattles'*

zerush
17.08.2008, 15:55
Ja leider...

Im Anhang mal ein simpler ADC-Treiber.
Dazu muss allerdings Aref = Avcc sein.

Ansonsten musst du im ADMUX Register noch weitere Bits setzen.

Aber wie gesagt, ein Blick ins Datenblatt ist auch nicht verkehrt...

Ze_ro|Co_ol
17.08.2008, 16:55
Vielen Dank zerush!

*insDatenblattvertief*

radbruch
17.08.2008, 17:02
Nein, dem ist beim Mega8 nicht so.
Der ADC7 ist ein reiner ADC Pin.
Tatsächlich, sorry für die falschen Angaben oben.

zerush
17.08.2008, 18:12
Wusste ich bis eben auch noch nicht, ich wollte erst genau das gleiche schreiben wie du ;-).
Aber dann hab ich festgestellt, dass es ADC7 beim Mega8 (in DIL Bauweise) ja gar nicht gibt. Und bei TQFP hat er nen extra Beinchen bekommen.

Da hat sich bestimmt schon manch einer vertan.

@Ze_ro|Co_ol:
Läufts denn jetzt soweit?

Dirk
17.08.2008, 20:13
Das Schöne bei Tastern am ADC-Port ist ja, dass man da sogar eine ganze Tastatur anschließen könnte...

Gruß Dirk

Ze_ro|Co_ol
17.08.2008, 20:20
Danke nochmals für den ADC-Treiber.
Bin im programmieren noch nicht so sattelfest, daher bin ich noch am
Rätseln. Datenblatt habe ich vor mir. Ich bekomms hin und wenn ich
mir die Nacht um die Ohren schlage!

Aref bleibt bei mir unbeschaltet.

Ze_ro|Co_ol
17.08.2008, 20:22
@Dirk:

oh, oh, bitte nicht übertreiben :-)
Mir reicht es schon wenn ich den einen Taster abfragen kann.

zerush
17.08.2008, 21:05
Wenn Aref unbeschaltet bleibt, dann musst du das REFS0 Bit in ADMUX noch setzen.
Dazu kannst du z.b. in der adc_Init() einfach folgende Zeile einfügen:

ADMUX |= (1 << REFS0);

Dann wird AVCC auch als Aref verwendet.

Achja im adc_Get() musst du dann auch noch folgende Zeile ändern:

ADMUX = channel;
wird zu:
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F);

Ze_ro|Co_ol
17.08.2008, 21:25
probier ich morgen aus, sitze schon seit heute morgen um 06:00 vor´m Laptop.

Bin morgen dann wieder Online und werde berichten...

Gruß Andi