Guten morgen! Ich suche nach einer Möglichkeit, mit einem
Drehpotentiometer 4 Ports eines uControllers (Atmel ATmega8) zu
schalten. Das Potentiometer schaltet also je nach Drehstellung einen der
4 Ports auf HIGH.
Ist dies überhaupt möglich? Wenn ja, hättet ihr vielleicht ein kleines
Codebeispiel, ich steige durch die ADC-Materie noch nicht wirklich durch
;)
Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti
schalten, muss das wirklich sein? (Die "Auflösung" liegt ja nur bei 4
Stufen, deshalb ist die Genauigkeit ja eigentlich nicht so relevant)
mfG, Daniel Fröder
Daniel F. schrieb:> Guten morgen!
oha!
Daniel F. schrieb:> Das Potentiometer schaltet also je nach Drehstellung einen der> 4 Ports auf HIGH.> Ist dies überhaupt möglich?
Ja das ist trivialst.
Daniel F. schrieb:> Wenn ja, hättet ihr vielleicht ein kleines> Codebeispiel, ich steige durch die ADC-Materie noch nicht wirklich durch> ;)
Schau dir mal das AVR Tutorial an und mach es durch. Es dauert nicht
lange ist aber gut - wenn man C Programmieren kann.
http://www.mikrocontroller.net/articles/AVR-GCC-TutorialDaniel F. schrieb:> Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti> schalten, muss das wirklich sein? (Die "Auflösung" liegt ja nur bei 4> Stufen, deshalb ist die Genauigkeit ja eigentlich nicht so relevant)
Das Hühnerfutter besteht hauptsächlich aus höchstens einem Widerstand
pro Poti - wenn überhaupt. Einfach als Spannungsteiler verschalten.
Fertig.
Was nötig ist sind die Abblockkondensatoren (100nF) für jeden AVR so wie
ein Kondensator für die ADC Referenzsspannung. That's it!
Daniel F. schrieb:> Laut dem ADC-Tutorial muss man ja noch etwas "Hühnerfutter" um das Poti> schalten, muss das wirklich sein?
Das ist für Messung mit dem Komparator. An den ADC kannst du das Poti
einfach so anschliessen.
Eine Seite an +, die andere an GND, die Mitte an den ADC. Refenzspannung
auf Vcc.
ADLAR-Bit setzen, das Highbyte einlesen und die oberen 4 Bits auswerten,
wobei dir für deine 4 Schaltzustände auch nur die oberen 2 Bits reichen.
mfg.
Ginge das eigentlich auch mit Bascom? Das kann ich nämlichhalbwegs :)
@Thomas Eckmann: Was meinst du ADLAR-Bit und wie fragt man die oberen
Bits ab?
Tut mir leid, wenn die Frage etwas dumm ist, aber ich bin ein blutiger
Anfänger
Daniel F. schrieb:> Ginge das eigentlich auch mit Bascom?
Ja. Definitiv. So etwas ähnliches habe ich damit in meiner Anfangsphase
auch gemacht. Hier mal was um die grauen Zellen anzuregen:
Initialisierung (Ports definieren, Start ADC, e.t.c)
Beginn Hauptschleife
ADC Auslesen und in Variable übergeben
Alle LEDs ausschalten
Variable auf Wert prüfen und mit if...else...endifs oder select...cases
die gewünschte LED einschalten.
Ende Hauptschleife
Daniel F. schrieb:> Ginge das eigentlich auch mit Bascom?
Ach du Scheiße! Ja geht.
Daniel F. schrieb:> Was meinst du ADLAR-Bit
ADMUX – ADC Multiplexer Selection Register
Bit 5 – ADLAR: ADC Left Adjust Result
Das Ergebnis der Wandlung ist 10 Bit groß und landet in 2 Registern. Die
unteren 8 Bits in Register ADCL die beiden oberen in ADCH. Durch Setzen
des ADLAR-Bits wird das Ergebnis ausgegeben, indem die oberen 8 Bits in
ADCH, die unteren beiden in ADCL landen.
Wenn man jetzt nur das ADCH verwendet, hat man praktisch einen
8-Bit-Wandler.
Von dem Ergebnis nimmt man dann für deine Anwendung nur die beiden
oberen Bits und wertet entsprechend aus.
mfg.
aber ganz so einfach wie es dargestelt ist es auch nicht
angenommen 8 Bit in 4 Abstufungen wären 0-63 = Stufe 1; 64-128 = Stufe
2;....
wenn jetzt ein Wert gemessen wird der sich immer um die 63-65 bewegt
wird immer zw. Stufe 1 und 2 umgeschaltet. Hier muss man also schon
etwas programmieren damit das nicht passiert, also nur auf Änderungen >5
reagieren damit man auch sicher sein kann es wurde am Poti gedreht und
es kein rauschen ist, man mittelt mehrere Werte oder programmiert tote
Zonen dazwischen.
z.B. 0-60 = Stufe 1; 61-70 keine Änderung des vorherigen Wertes; 70-120
Stufe 2;.....
einfach ausprobieren, dann kommt man von selber drauf.
Hallo! Ich habe das ganze mal getestet, funktioniert auch vom Prinzip
her gut. Ich habe den 10-Bit ADC in 4 Teile geteilt (~256). Aber obwohl
ich ein lineares Poti benutze, sind von den 270 Grad des Potis etwa 180°
schon größer als 770, also sind die 1023 nicht regelmässig auf das
Potentiometer verteilt :( wisst Ihr, wie man das korrigieren kann, dass
die 270° in gleichmässige, 4 Teile geteilt werden? Gruß,
Daniel Fröder
Hi, das klingt nach einem logarytmischen Poti. Kannst ja mal den
Widerstand am Schleifer messen und kontrollieren ob sich der linear
verändert oder nicht
Gruß Kalle
Du hattest recht, der Widerstandsverlauf war logarithmisch, jetzt gehts!
Wenn ich nun aber 4 LEDs anschliesse, leuchten manchmal 2 LEDs auf
einmal. Ich hatte den Verdacht, das das am Rauschen des Potis liegen
könnte, aber nachdem ich die Zahlenbstände der if-Abfragen um 5 höher
wie die letzte gemacht habe, war der Effekt immer noch da :S Wisst Ihr
da eine Lösung?
>aber nachdem ich die Zahlenbstände der if-Abfragen um 5 höher>wie die letzte gemacht habe, war der Effekt immer noch da :S
Etwas diffus ausgedrückt... Eine Hysterese sollte diesen Effekt
wirkungsvoll verhindern. Du musst dazu die Umschaltschwellen für eine
Änderung des ADC-Wertes in Richtung "runter" etwas niedriger legen (der
Wert dieser Abweichung ist die Hysterese) als die Umschaltschwellen für
eine Änderung in Richtung "rauf". Um das per Software zu realisieren
musst Du bei jedem neu eingelesenen ADC-Wert prüfen, ob er niedriger
oder höher als sein Vorgänger ist, und dementsprechend die
Umschaltschwellen setzen. Wenn die Hysterese größer ist als die
Amplitude der rauschbedingten ADC-Schwankungen tritt der Effekt nicht
mehr auf. Einen geeigneten Hysteresewert würde ich einfach durch
Ausprobieren bestimmen.
Programmierbeispiel:
IF (ADCValue>ADCValueOld) THEN
{
State = 0
IF (ADCValue>Threshold1+HYST) THEN State = 1
IF (ADCValue>Threshold2+HYST) THEN State = 2
IF (ADCValue>Threshold3+HYST) THEN State = 3
}
ELSE
{
State = 0
IF (ADCValue>Threshold1-HYST) THEN State = 1
IF (ADCValue>Threshold2-HYST) THEN State = 2
IF (ADCValue>Threshold3-HYST) THEN State = 3
}
die leuchten bestimmt nicht beide gleichzeitig sondern abwechselnd, also
genau das Problem das ich oben beschrieben habe. Da das Auge aber sehr
träge ist sieht es so aus als ob beide gleichzeitig leuchten.