PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Config ADC - nur einen Eingang benutzen



dirtyklaus
20.09.2009, 00:15
Hi,

ich habe einen ATmega168 (rn mini). An diesem möchte ich nun einen Eingang als Analogeingang benutzen: PC.0 = ADC0.
Die anderen Pins PC.1 bis PC.5 sind im Moment Ausgänge für LEDs.

Wenn ich jetzt "Config Adc = Single , Prescaler = Auto" eingebe, werden ja alle Analogeingänge (PC.0 bis PC.5) zu Analogeingängen. Das stört jedoch die späteren Definitionen als digitalen Out (LEDs).

Wie ist der Code um nur diesen einen Pin (PC.0) als Analogeingang zu definieren? - und damit die anderen PC.x als Ausgänge zu benutzen!!

Gruß - Klaus

radbruch
20.09.2009, 00:40
Hallo

Ich bin nicht so der Bascom-Profi und mag es eigentlich jetzt nicht testen, aber das scheint mir eher unwahrscheinlich:

Wenn ich jetzt "Config Adc = Single , Prescaler = Auto" eingebe, werden ja alle Analogeingänge (PC.0 bis PC.5) zu Analogeingängen.
Hast du das festgestellt oder ist das eine Vermutung? Mit "Config Adc" wird doch nur der Wandelmodus (einmal oder Dauerlauf) und der Prescaler festgelegt. Trotzdem kannst du jeden adcfähigen Pin weiterhin auch als Ausgang nutzen, vermutlich könntest du sogar einen als Ausgang definierten Pin auch per ADC einlesen. Der ADC kann den Port nicht für sich reservieren, wie es z.B. der USART mit TXD kann. Beim Wandeln liest der ADC den Pegel des zum Kanal gehörenden Pin in ein Zwischenregister ein und digitalisiert anschließend den Wert. Ob der Pin ein Eingang ist, seinen PullUp aktiviert hat oder gar ein Ausgang ist entscheidet nur der Programmierer.

Sicherheitshalber kannst du erst den ADC konfigurieren und danach die PC1 bis PC5 auf Ausgang setzen. Das würde eine eventuelle Definition der Pins als Eingang durch das Config Adc überschreiben.

Der Code würde dann so aussehen:

Config Adc = Single , Prescaler = Auto
Config Portc = Output
Config Pinc.0 = Input

Gruß

mic

dirtyklaus
21.09.2009, 00:45
werde es morgen mal testen - danke dir erst mal - hört sich logisch an. später mehr.

Gruß - Klaus

dirtyklaus
22.09.2009, 19:52
Hi,

habe es probiert und nach Messung sind genau 3,45 Volt am ADC(0). Das Auslesen ergab aber immer einen Wert von 1023 - also 100%. Das konnte nicht sein.
Die
Lösung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Die Angabe zur Referenzspannung fehlte. Dann geht es.

Danke.

Gruß - Klaus

radbruch
22.09.2009, 22:18
Hallo Klaus

Schön, dass es jetzt funktioniert. Das hättest du auch schon eher haben können, wenn du in deiner Eingangsfrage das schon erwähnt hättest:

"Das Auslesen ergab aber immer einen Wert von 1023 - also 100%."

Die Frage nach der richtigen Referenz hätte sich dann unweigerlich aufgedrängt ;)


btw. ist das nicht ganz sauber in (meiner 1.11.8.7) Bascom-Doku zu Config Adc:

The following ASM is generated(depending on the chip)

In _temp1,ADCSR ; get settings of ADC
Ori _temp1, XXX ; or with settings
Out ADCSR,_temp1 ; write back to ADC register
Die Referenz-Bits REFS1:0 sind aber im ADMUX.


Gruß

mic

dirtyklaus
23.09.2009, 01:17
nun, hatte am Anfang das Kabel mit der Spannung noch nicht angelötet, weil ich dachte das es ungünstig wäre an einen Ausgang von außen Spannung zu legen. Habe das erst nach deiner Antwort gemacht.

Die 3 Zeilen Assembler sagen mir leide nichts - trotdem danke.
Programmierst du in assembler?

radbruch
23.09.2009, 02:06
Hallo

Nein, ich programmiere nicht in Assembler, ich lerne noch C. Aber ich schau mir gelegentlich den Output des C-Kompilers an und versuche das zu verstehen. Die drei Zeilen interpretiere ich so:

In _temp1,ADCSR kopiert den Inhalt des ADCSR nach temp1
Ori _temp1, XXX verodert temp1 mit den Daten aus Config Adc
Out ADCSR,_temp1 schreibt das Ergebniss in das ADCSR-Register

Die Referenz im ADMUX wird dabei eigentlich nicht gesetzt. Es wird zwar angemerkt, dass dies vom verwendeten Kontroller abhängig wäre, aber die AVRs sind sich da ziemlich ähnlich bis gleich (einer der Vorzüge der AVRs). Letztlich war ich aber zu faul um im Schaltplan des RN-MiniControl (http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=64&products_id=131) zu suchen und nachschauen, welche Referenz dort verwendet wird. (Allerdings sehe ich gerade, dass der Schaltplan nicht Online verfügbar ist. Schade eigentlich)

Egal, Hauptsache dein Code funzt :)

In der Beschreibung von getadc() steht dann noch folgendes:

The pins of the A/D converter input can be used for digital I/O too.
But it is important that no I/O switching is done while using the A/D converter.
"Die Pins des A/D-Wandlers-Eingangs können auch als digitale I/Os verwendet werden. Allerdings ist es wichtig, dass die I/Os nicht geändert werden während der ADC verwendet wird." Damit wäre das dann auch geklärt ;)

Gruß

mic

dirtyklaus
23.09.2009, 09:25
Danke dir für die Info.

habe mir gerade mal dein Video (link unter deinem Bild) auf youtube angeschaut- cool.

Brauchst du noch einen PR6 ? ich habe hier einen rumstehen den ich nicht brauche - programmiere ja mittlerweile mit der BASCOM Serie. Ich würde ihn dir günstig lassen.

Gruß - Klaus

radbruch
23.09.2009, 17:37
Die kleine Kamera ist eines meiner Lieblingsprojekte :)

Hier wird aktuell ein RP6 gesucht:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=50146

Gruß

mic