PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ldr am digital-port (gelößt)



2tobi7
08.05.2010, 13:51
hi

da mein analog port leider aus irgendwelchen gründen defekt ist (oder ich bin einfach zu dumm^^) muss nun irgendwie einen ldr an die digital ports anschließen :-k . die frage ist nun wie das geht.ich könnte mir zb vorstellen das iwie mit nem kondnsator zu machen so dass je nach ldr widerstand sich die frequenz des signals am digital pin erhört
mehr verstehe ich aber nicht von elektronik^^
hoffentlich könnt ihr mir beim erstellen einer schaltung helfen..

tobi

Besserwessi
08.05.2010, 14:54
So leicht geht ein Analoger Eingang nicht kaput. Das ist dann meist der ganze Chip hinüber. Das wird also mehr ein Problem der Programmierung sein.

Man kann sich an einem digitalen Einganag helfen, wie schon vermutet mit einem Kondesator. der LDR und Konensator Bilden ein RC glied und die Verzögerung hängt dann von LDR (Licht) ab. Die schaltung könnte z.B. ein Kondensator gegen Masse (z.B. 1 nF), und der LDR gegen Vcc. Gemessen wird dann die Zeit von Umschalten von Ausgang Low auf Eingang, bis an Eingang ein High erkannt wird.

2tobi7
08.05.2010, 22:08
und wo würde ich dann den pin anschließen ?? (in der mitte zwischen ldr u. kondensator?)
könnte mir vielleicht einer ein code beispiel geben ich hab e das mit dem auswerten noch nicht verstanden

tobi

Thomas$
08.05.2010, 22:29
na dann erzähl uns doch noch etwas mehr sonst wird das nur sinloses gerate
von was ist der digitalport bzw der analog port von einem computer oder mikrokontroler( von welchem?)
welche programiersprache
und dein code mit dem du es probiert hast

nflatjor555
08.05.2010, 22:39
I/O-Pin in der Mitte, so wie du geschrieben hast.

Zur Code: ich kann ein Versuch in Pseudocode machen.
Am geschicktesten machst du die Zeitmessung mit einem Timer, aber zur Verstaendnis wie folgt:



Pin=Output, Low
// lass eine Zeit vergehen um den Kondensator zu entladen

Pin=Input
Counter=0
while (Pin == Low)
{
Counter++
Delay_us(10) // 10us ist ein Beispiel, muss ausprobiert werden
}

// wenn wir hierher kommen, ist der Kondensator aufgeladen worden (Pin=High)
if (Counter > 100) // 100 counts ist auch nur ein Beispielswert
//Dunkel
else
//Hell

2tobi7
09.05.2010, 09:13
vielen dank wie schon richtig erraten benutzte ich c im avrstudio 4 mit einem atmega 32.
ich weiß nicht genau was du mit
und dein code mit dem du es probiert hast gemeint hast außer du meinst den code um den analog port auszulesen:

stammt nicht von mir:

uint16_t readADC(uint8_t channel) {
uint8_t i;
uint16_t result = 0;

// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

// Kanal des Multiplexers waehlen
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX = channel | (1<<REFS1) | (1<<REFS0);

// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));

// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));

result += ADCW;
}

// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);

result /= 3;

return result;
}


tobi

Thomas$
09.05.2010, 09:27
wie sah der wert aus der zurück gegeben wurde?
und wie sah die externe beschaltung aus?
ja ich wollte mal den code sehen, weil da schon die meisten fehler auftauchen und der rest der fehler bei der beschaltung. Und das unwahrscheinlichste ist, dass du den gesammten adc teil kaputt gemacht hast

2tobi7
09.05.2010, 09:46
also als ergebni bekam ich konstant 1022
bei einer beschaltung
https://www.roboternetz.de/phpBB2/files/adc.pdf
allerdings ohne den kondensator
zwischen durch bekam ich auch mal bei shr hellem licht 571
und zwischen drin 572 bei dunkelm raus opder so ähnlich
ich hatte dazu auch schon ein thema aufgemacht:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=52801

tobi

Thomas$
09.05.2010, 10:04
ok das klingt aber stark nach einem nicht kaputten adc
hast du ein poti? wenn ja stell mit dem mal langsam alle möglichen spannungen ein und seh dir die werte an und die ref spannung nimmst du besser 5V.

2tobi7
09.05.2010, 10:24
von 5 auf oder abwärts?

EDIT: es geht grad schlecht das auszuprobieren (https://www.roboternetz.de/phpBB2/viewtopic.php?t=54214) aber ansonsten erstam danke!

2tobi7
12.05.2010, 20:28
so es geht wieder alles \:D/

aber nicht die messung ;)

mein aufbau sieht so aus:

|----LDR----|----kondensator(10µf)---|
|................|................................ ......|
|vcc...........|port c pin 7.....................|gnd

mein code sieht so aus:


int Counter;
waitms(1000);
char result[10];
DDRD |= 0xB0;
setportdon(7);
waitms(1000);
DDRD |= 0x30;
Counter=0;
while (!(PIND & (1 << PD7)))
{
Counter++;
_delay_us(10);
}
snprintf (result, (size_t)10, "%d", Counter);
lcd_clrscr();
waitms(1000);
lcd_puts(result);

also pasiern soll folgendes:
Kondensator entleeren portc7 auf low als output
dann als input warten bis spannung anliegt (kondensator voll)
dann die benötigte zeit am lcd ausgeben
aber es kommt immer '0' raus
was mach ich falsch???

Besserwessi
12.05.2010, 21:49
mit
DDRD |= 0x30;
werden nur Bits gesetzt, aber keine gelöscht. PD7 bleibt also immer als Ausgang.
Zum entladen des Kondensators sollte man auch ein Low ausgeben.

2tobi7
12.05.2010, 23:20
jjjjjuuuuuuuuuuuuuuuhuuu =D>
das war mal ein tipp alles geht
vielen dank an alle \:D/ =D> \:D/