PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control 1.4 PortA == Eingang??? (AVR Studio, C)



Soeren7
25.07.2012, 20:37
Hallo!
Ich möchte gerne einen digitalen Sensor (der bei einem Abstand von 0-15cm ca. 0,3V und bei einem Abstand von 15-30cm ca. 0,6V ausgibt),
an den PortA(PA0) anklemmen.
Allerdings konnte ich davor auch eine LED zum leuchten bringen mit der Anweisung:
setportaon(0);

OBWOHL am Anfang von main() : DDRA |= 0x00; //00000000 -> alle Analogports als Eingänge steht.
->wo ich den Sinn dann schon nicht mehr verstehe... Port A ist scheinbar komplett ein Eingang, wie konnte die LED leuchten?
(setzt etwa setportaon(0) automatisch die Bits auf "1"?)


Habe halt Angst das ich den Sensor nun kaputt mach, wenn ich ihn an PA0 steck.

Also meine Fragen:
(1) Wie kann ich ein Port (z.B. PA0) als Eingang deklarieren?
(2) Wie müsste anschliessend das Schlüsselwort lauten, um festzustellen ob an PA0 mehr als 0,3V anliegen?



PS:
Der Sensor ist ein GP2D150A

Vielen Dank!

Hubert.G
25.07.2012, 20:49
PORTA ist erst mal ein ganz normaler digitaler I/O. Mit DDRA |= 0x00; sind alle Pin digitale Eingänge.
Erst wenn du den ADC an einem Pin von PortA aktivierst wird er zum analogen Eingang.

Soeren7
25.07.2012, 21:04
Okay danke, scheint wohl komplizierter zu werden als ich angenommen hatte ^^

Ich werd jetzt einfach mal das Beispielprogramm von "rn-wissen" testen:
(in der Hoffnung das PIN 0 auch PINA.0 ist :confused:


#include <avr/io.h>
#include <inttypes.h>

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;
}

int main(void) {
uint16_t result = readADC(0); //Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
return 0;
}