PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schalter an ADC0/ ADC1



Stephan90
26.07.2013, 13:25
Hallo,
kann man beim RP6v2 einen Schalter an den ADC0 bzw ADC1 Kanal anbringen?
Wenn ja muss der schalter zwischen GND und Signal oder zwischen VDD und Signal?
Danke im Vorraus

redround
26.07.2013, 13:38
Ich weiß zwar nicht, wie es beim RP6v2 ist, aber üblicherweise werden Taster/Schalter so an einen Controller angeschlossen:
26088

Theoretisch haben die meisten Controller zwar auch interne Pull-Up-Widerstände, jedoch verwendet man in der Praxis üblicherweise externe hierfür. Die ADC-Eingänge können dabei üblicherweise als "normale" I/O-Pins konfiguriert werden

Stephan90
26.07.2013, 13:45
Ok, also würde es dann heißen das wenn ich den schalter schließe masse am PIN für das Signal anliegt? Für was muss dann noch en widerstand dazu?

redround
26.07.2013, 13:50
Weil der Anschluss bei geöffnetem Schalter sonst "in der Luft hängen" würde ... sprich keinen definierten Zustand hätte. Ein paar Infos hierzu findest Du z. B. auch hier: http://www.rn-wissen.de/index.php/Pullup_Pulldown_Widerstand

Bei der gezeigten Schaltung ist es so, dass der Eingang definitiv auf HIGH ist, wenn der Taster geöffnet ist bzw. LOW, wenn der Taster gedrückt wird. Wenn Du das ganze anders herum haben willst, dann geht das auch, allerdings spricht man dann nicht von einem Pull-Up-Widerstand sondern von einem Pull-Down-Widerstand, da er den Eingang auf Masse "zieht". Üblich sind aber wie gesagt externe Pull-Up-Widerstände.

Stephan90
26.07.2013, 14:20
Ok,
danke schonmal für die Hilfe.
Ich hab mir jetzt mal ein kleines Programm geschrieben in dem ich ADC0 und ADC1 auslesen kann und die werte über den RobotLoader im Terminal angezeigt werden.
Dann habe ich mir diese Schaltung mit einem 10 Kiloohm widerstand nachgebaut.
Eine sache die ich jetzt noch festgestellt hab:
wenn ich diese Schaltung an ADC1 anschließe änder sich auch nur hier der wert! Wenn ich jedoch diese Schaltung an ADC0 anschließe ändert sich der wert bei ADC1 und bei ADC0, es wird jeweils der gleiche wert angezeigt.
Ist das normal?

redround
26.07.2013, 14:52
eigentlich nicht. Du solltest auch versuchen den AD-Wandler abzuschalten und die Pins als ganz normale Digital-I/O-Anschlüsse zu verwenden. Wenn Du vollen Zugriff auf den Controller hast, ist das möglich. Leider kenne ich den RP6v2 aber wie gesagt nicht und kann Dir deshalb auch nicht sagen, ob und wenn ja wie das geht. Da müssen die RP6v2-Experten ran ;-)

oberallgeier
26.07.2013, 14:52
... kann man beim RP6v2 einen Schalter an den ADC0 bzw ADC1 Kanal anbringen ...Bei den ATmegas kann man (fast) alle I/O-Pins für als Ein- oder Ausgang konfigurieren, wie von redround geschrieben. Damit sind Schalterabfragen ohne Problem möglich. Wenn nötig oder wünschenswert kann man praktischerweise an einem ADC-Pin auch mehrere Taster gleichzeitig anbringen. Dazu wird eine Widerstandskombination verwendet, sodass abhängig vom aktivierten Taster/Schalter eine jeweis unterschiedliche Spannung am ADC ansteht.


...
Port A also serves as an 8-bit bi-directional I/O port, if the A/D Converter is not used. Port pins can provide internal pull-up resistors (selected for each bit). ...



... üblicherweise ... Taster/Schalter so an einen Controller angeschlossen ... Theoretisch ... interne Pull-Up-Widerstände, jedoch verwendet man in der Praxis üblicherweise externe hierfür ...Also die von mir bevorzugten AVR-8-Bit-Controller (die im RP6v2 auch eingesetzt werden) haben interne Pull-Ups nicht theoretisch sondern ganz konkret vorhanden und benutzbar! Das Datenblatt (für meinen mega1284, auch für den mega32 und andere) spezifiziert sie zwischen 20 kΩ und 50 kΩ. Deshalb verstehe ich nicht, dass Du von einem üblichen Anschlußbild mit externen Pull-Up-Widerständen schreibst. So einen Aufwand hatte ich noch nie gemacht. Wo ist das üblich?

radbruch
26.07.2013, 14:57
Hallo

"Ich hab mir jetzt mal ein kleines Programm geschrieben" ...dass du uns vielleicht auch zeigen solltest.

"Ist das normal? " Nein, denn ADC0 und ADC1 sind nicht verbunden.

Gruß

mic

redround
26.07.2013, 15:32
Das Datenblatt (für meinen mega1284, auch für den mega32 und andere) spezifiziert sie zwischen 20 kΩ und 50 kΩ. Deshalb verstehe ich nicht, dass Du von einem üblichen Anschlußbild mit externen Pull-Up-Widerständen schreibst. So einen Aufwand hatte ich noch nie gemacht. Wo ist das üblich?

Das Problem ist wohl, dass die Störfestigkeit mit steigendem Widerstand abnimmt. So wird die Schaltung z. B. empfindlicher gegen sog. "Kriechstrecken", die zum Beispiel bei Verschmutzungen der Schaltkontakte auftreten können, je größer der Widerstand ist. Auch sog. "parasitäre Leitungskapazitäten" - besonders bei langen Leitungen - sind eher ein Problem je höher der Pullup-Widerstand ist. Deshalb haben sich in der Praxis wohl Werte zwischen 5 und 10 kOhm für die Widerstände als "sichere" Größen erwiesen ... und da liegen die internen Widerstände zum Teil einfach deutlich drüber (abhängig vom Controller-Typ bis zu 100k)

Stephan90
26.07.2013, 16:11
So hab hier mal den Code den ich zum auslesen der werte geschrieben habe:
#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
startStopwatch1();

while(true)
{
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeString_P("\nADC ADC0 ");
writeInteger(adc0, DEC);
writeString_P("\nADC ADC1: ");
writeInteger(adc1, DEC);
writeChar('\n');
setStopwatch1(0);
}
task_ADC();
}
return 0;
}

SlyD
28.07.2013, 18:02
Hallo,

ich antworte mal hier auf Deine PN.

Nein es ist nicht normal dass sich die zwei ADCs identisch ändern.
Bist Du ganz sicher, dass die Hardware 100% korrekt aufgebaut wurde?
Keine Lötbrücken, keine schlechten Lötstellen, keine Wackelkontakte, keine gebrochenen Kabel usw.
Taster richtig angeschlossen (bei 3 poligen umschaltern durchaus wichtig)?
Auch wenn man glaubt das alles richtig ist, es ist oft doch nicht so ;-)

Hast Du ein Multimeter?
Falls ja, miss mal die Spannung an beiden Pins jeweils mit und ohne gedrücktem Taster und bei
nur an ADC1 / ADC0 angeschlossenem Taster.

Hast Du die I/O Port Konfiguration geändert?
Hast Du es mal mit dem internen Pullup probiert?

Weiterhin wäre es besser die Pins als GPIO zu verwenden und nicht den ADC Wert zu nehmen.


MfG,
SlyD

Stephan90
28.07.2013, 19:45
So also die schaltung habe ich jetzt nochmal geprüft,
Kabel auf Durchgang und Kurzschluss gegeneinander geprüft da konnte ich nichts festellen. Angeschlossen habe ich es nach dem Schaltplan Pull-Up mit 10 Kiloohm.
Taster ist auch soweit in ordnung.
Spannungen habe ich jetz mal gemessen, die messung habe ich jeweils vom Signal Pin (also ADC0 ADC1 Pin) gegen VDD Masse gemessen.
Folgende Werte habe ich gemessen:
Taster an ADC0 angeschlossen:
Taster geöffnet:
ADC0 Signal: 5 V
ADC1 Signal: 1,2 V
Taster geschlossen:
ADC0 Signal: 0 V
ADC1 Signal: 1,2 V

Taster an ADC1 angeschlossen:
Taster geöffnet:
ADC0 Signal: 1,5 V
ADC1 Signal: 5 V
Taster geschlossen:
ADC0 Signal: 1,5 V
ADC1 Signal: 0 V

Ich denke mal das ist so OK da sich ja nur die Spannung an dem PIN ändert an dem auch der Taster angeschlossen ist.
Wie kann man die I/O Port Konfiguration ändern und wie macht man einen internen Pullup? Habe an der Software sonst nichts geändert sondern die LIB von den beispielen genommen und das Makefile habe ich ebenfalls von den Beispielen genommen.
Und was ist ein GPIO?

Mfg
Stephan

Dirk
28.07.2013, 20:04
Hi Stephan,

die gemessenen Werte sind ok.
Wenn die Spannungen sich so ändern, müßte die Ausgabe mit deinem Mini-Programm auch unterschiedliche Werte zeigen. Eine Lötbrücke zwischen ADC0 und ADC1 kann es nicht geben, weil sich ja unterschiedliche Spannungen an den beiden Eingangspins messen lassen.
Bei 5V müßte ein Wert von 1023 angezeigt werden, bei 0V ein sehr kleiner Wert (idealerweise 0) und bei 1,5V ca. 307.

Normalerweise braucht man aber keinen ADC für einen Taster, da reicht ein normaler I/O-Pin. Jeder Pin kann mit dem DDRx Register auf Eingang/Ausgang geschaltet werden. Setzt man ein Bit im DDRx Register auf 1, ist der zugehörige Pin Ausgang, sonst Eingang.
Um den internen Pullup-Widerstand zu aktivieren, schreibt man eine 1 in die Bitposition vom PORTx Register, nachdem man den Portpin als Eingang eingerichtet hat.

Stephan90
28.07.2013, 20:34
Muss ich das ganze in der RobotBaseLib.h ändern?
Da steht folgender code:
[// PORTA

#define UBAT (1 << PINA7) // ADC7 (Input)
#define MCURRENT_L (1 << PINA6) // ADC6 (Input)
#define MCURRENT_R (1 << PINA5) // ADC5 (Input)
#define E_INT1 (1 << PINA4) // INT1 (input per default... can be output)
#define LS_L (1 << PINA3) // ADC3 (Input)
#define LS_R (1 << PINA2) // ADC2 (Input)
#define ADC1 (1 << PINA1) // ADC1 (Input)
#define ADC0 (1 << PINA0) // ADC0 (Input)

// Initial value of port and direction registers.
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000

// ---------------------------------------------------
// PORTA A/D Convertor channels

#define ADC_BAT 7
#define ADC_MCURRENT_L 6
#define ADC_MCURRENT_R 5
#define ADC_LS_L 3
#define ADC_LS_R 2
#define ADC_ADC1 1
#define ADC_ADC0 0
]
Geändert werden müsste jetzt z.B wenn ich ADC0 als ausgang habe möchte:
#define INIT_DDRA 0b00000001
#define INIT_PRTA 0b00000000
Ist das richtig?
bzw. für einen internen Pullup:
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000001
Ist das richtig?

Wenn man jetzt aber ADC0 als ausgang setzt kann man doch keinen taster anschließen oder?

SlyD
28.07.2013, 20:44
Der Kommentar 2 Zeilen darüber könnte hilfreich sein:



/************************************************** ***************************/
// I/O PORT pin definitions
// These definitions simplify reading and understanding the source code.
//
// ATTENTION: Initial value of port and direction registers should not
// be changed, if you do not exactly know what you are doing!
//
// Hints for DDRx and PORTx Registers:
// DDRxy = 0 and PORTxy = 0 ==> Input without internal Pullup
// DDRxy = 0 and PORTxy = 1 ==> Input with internal Pullup
// DDRxy = 1 and PORTxy = 0 ==> Output low
// DDRxy = 1 and PORTxy = 1 ==> Output high
// "=1" indicates that the appropriate bit is set.
//
// Example:
// #define INIT_DDRA 0b00010000
// #define INIT_PRTA 0b00000000
//
// This means that ALL ports on PortA are inputs without internal pullups
// except for PortA4, which is an output (E_INT1 signal in this case) and
// initial value is low.
//
// Binary value explanation:
// 0b00010000 = 16 in decimal system
// ^ ^
// MSB LSB (MSB = Most Significant Bit, LSB = Least Significant Bit)
//
// The program should always call the macro "portInit();" FIRST! You can find
// it a bit below. Correct port initialisation is the most important step
// after a hardware reset!



Übrigens solltest Du in der Library nichts ändern.
Das kannst Du alles in Deinem eigenen Code machen.
DDRA |= ADC0; // Pin als Ausgang
PORTA |= ADC0; // Ausgang auf 1
PORTA &= ~ADC0; // Ausgang auf 0


DDRA &= ~ADC0; // Eingang
PORTA |= ADC0; // Pullup an
PORTA &= ~ADC0; // Pullup aus


Auswerten mit if(PINA & ADC0) ...

MfG,
SlyD

PS:
GPIO = General Purpose I/O - das steht sicher auch irgendwo in der Doku ;-)

PPS:
Achtung: Nicht den GPIO als Ausgang konfigurieren und dann mit dem Taster gegen Masse kurzschließen!
(bei den normalen Bumpern ist für sowas ein Serienwiderstand von 470 Ohm mit drin - s. Schaltplan des RP6
bei den LEDs. Übrigens kann man Taster an die LED Pins schalten genau wie bei den Bumpern, dann bleiben die wertvolleren ADCs frei - auswerten geht dann wie im RP6 Library code getBumper - natürlich etwas angepasst... )

Dirk
28.07.2013, 20:57
Hi Stephan,

grundsätzlich würde ich an den Libs nichts ändern.
Grund: Man kann sich dann hier im Forum kaum noch gegenseitig unterstützen, wenn jeder eine andere Lib als Grundlage hat.

Stattdessen kann man im eigenen Programm die Port-Definitionen ändern:
DDRA &= ~ADC0;
... setzt ADC0 als Eingang.
DDRA |= ADC0;
... setzt ADC0 auf Ausgang.

PORTA |= ADC0;
... schaltet den Pullup ein (wenn der Pin Eingang ist) ODER den Portpin auf High (wenn der Pin Ausgang ist).

Stephan90
28.07.2013, 21:02
Okay
das funktioniert schonmal ;).
Aber ich habe weiterhin das Problem das bei ADC0 beide das gleiche anzeigen. ich verstehe nicht was da falsch ist :confused: .
PINA bedeutet in dem falle der signal PIN von ADC0 oder?
Wenn ich den ADC0 auf ausgang habe kann man aber keinen taster mehr anschließen oder? Gibt doch dann nen Kurzschluss.
Sorry für die vielen fragen ich hät nicht gedacht das es so Kompliziert wird ;)

Dirk
28.07.2013, 21:31
Hi Stephan,

ich habe weiterhin das Problem das bei ADC0 beide das gleiche anzeigen
Was soll das heißen? Es geht ja nur um den Unterschied zwischen ADC0 und ADC1. Was genau wird da bei ADC0 und ADC1 bei welcher Tastenbetätigung angezeigt?

Stephan90
28.07.2013, 21:42
So ich glaube ich habe meinen Fehler gefunden.
Man muss also an ADC0 und an ADC1 einen Pullup widerstand einbauen unabhänig davon ob man ihn verwendet oder nicht, kann das sein?
Wenn ich nur für ADC0 einen Internen Pullup programmiere zeigt ADC1 das selbe an wie ADC0 (bei geschlossenem Taster), wenn ich jetzt aber für ADC1 auch den Pullup Programmiere funktioniert es und es werden die verschieden Signale angezeigt.
Und genauso funktioniert es dann auch mit externen Widerständen.

Dirk
28.07.2013, 21:46
Ja, jeder Eingang bzw. jeder Taster an einem Eingang braucht einen eigenen Pullup.

Stephan90
28.07.2013, 22:02
Ok das wusste ich noch nicht. Also mit 2 Widerständen Funktioniert es einwandfrei.
Ich bin davon ausgegangen das es völlig getrennte Kanäle sind und nur der einen Pullup benötigt der auch verwendet wird.
Habe gerade nochmal den Bericht in RN Wissen gelesen wie man die IO PINs der LEDs für schalter verwendet, das werde ich auch nochmal Versuchen.

Vielen danken für eure Gute Hilfe!