Hallo KiwiJoghurt,
Genau so wird es ja auch gemacht. Die Taster bedienen verschiedene Spannungsteiler an einem einzigen AD-Wandler (ADC = Analog Digital Converter), so dass die Spannung am ADC davon abhängt, welcher Taster gedrückt ist. Bei geschickter Wahl der Widerstände könnten auch mehrere Taster, auch gleichzeitig, erkannt werden. Die Widerstände, die Versorgungsspannung und die Referenzspannung - letztere sorgfältig entstören, steht im doc - sollen dann sehr genau sein.Zitat von KiwiJoghurt
Ja ja, mein Jammer - ich schreibe immer viel, aber nicht sehr verständlich. Schlimm schlimm.Zitat von KiwiJoghurt
Der Lichtstrom der Gabellichtschranke wird von einer Art Propeller auf der Motornabe unterbrochen. Deshalb gibt sie mir ein Signal "beinahe 5V", und "knapp über Null Volt", also logisch high oder low. Dieses Signal geht an einen Pin "external interrupt request". Das ist ein ziemlich hoch priorisierter Interrupt der anspricht, wenn der Pin entsprechend initialisiert ist und einen Pegelwandel 0->1, also steigende Flanke, oder 1->0, also fallende Flanke, erkennt. Ich habe den für steigende Flanke initialisiert (ist eigentlich gehupft wie gesprungen) und bei jedem Mal, wenn dieser Pin erkennt, dass eine solche Flanke vorliegt, dass also der Unterbrecher den Lichtstrom frei gegeben hat und die Lichtschranke von 0 auf 1 geht, dann wird die Interruptroutine aufgerufen und ich schreibe darin den Wert eines Zeitzähler in eine Variable die etwas so heisst "aktueller_Zeitwert_von_Interrupt_0". Ausserdem zähle ich von diesem Wert den Wert des vorher notierten "alt_aktueller_Zeitwert_von_Interrupt_0" ab und notiere diesen Wert als Dauer zwischen dem vorhergehenden und dem aktuellen Interrupt. Dieser Wert ist ein Mass für die Drehzahl meines Motors. Ist das verständlicher? (puhhh - hoffentlich - ist halt leider wieder ewig lang).
Jein. Ein analoger Port kann bei unseren Controllern als ADC arbeiten, aber auch als "normaler" digitaler Output oder Input. Es kommt darauf an, wie der Port aktuell initialisiert ist. Ich könnte den Port zum Start als digitalen Input nehmen und auf den Kontakt einer einzigen Taste warten - und den gleichen Port anschliessend für ...irgendetwas Analoges... initialisieren und verwenden. USW.Zitat von KiwiJoghurt
UUUUPs - das klingt jetzt für mich schwer verständlich. Aber mal überlegen.Zitat von KiwiJoghurt
Soweit ich es weiß, können alle AD-Wandler bei ATMEL-Controllern eine 10 Bit Wandlung durchführen. Die kann bei entsprechender Parameterisierung auch als 8 Bit Wandlung genutzt werden.
Controller die 10 Ports mit ADC Funktion haben, also z.B. der tiny26 (11 ADC) oder der mega640 (16) oder der mega2560 (16) können an jedem dieser Ports nach entsprechender Initialisierung einen analogen Wert einlesen bzw. auswerten (lassen). Der Controller den ich einigermassen gut kenne, der m168, hat 6 oder 8 AD´-Pins, je nach Bauart, und kann die für AD-Wandlungen nutzen. Du hast recht - es ist nur ein einziger AD-Converter drauf, der gemultiplext werden muss. Auch weiter hast Du recht: wenn Du jetzt vier (sagen wir mal DIP-) Schalter hast, dann kannst Du darüber durch entsprechende Kombination einen dieser Ports auswählen (= DIP-Schalter durch Software einlesen und bei Änderung entsprechenden Port initialisieren) - bei 6 ADC´s reichen sogar drei Schalter. Für Deine 10 Ports brauchst Du aber fünf Bits (schon klar, oder?). Dabei wird je nach Schalterstellung die ADC-Initialisierung entsprechende Parameter für die Ports setzen bzw. in das Multiplex-Register senden. Genaueres steht in den doc´s von Atmel (<<<= bequeme Ausrede, wenn man nicht mehr weiter weiß!). Trifft das die Frage?
Lesezeichen