PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was ist falsch beim Signalabfragen?



Jacob2
28.07.2008, 15:34
Hi,
ich will das Ausgangssignal des US-Abstandwarners, welches ca. 12V beträgt (wahrscheinlich n'bisschen weniger) an einem Pin abfragen. Die Beschaltung des Pins im Bild. Programmiert habe ich den AVR mit folgendem:


#include <avr\io.h>
int main (void)
{
DDRA = 0b00000011;
PORTA = 0b11111100; //Pull Up ein
while(1)
{
if(bit_is_set(PORTA, 7))
{
PORTA &= 0b11111100;
}
else
{
PORTA |= 0b0000011;
}
}
return 0;
}

Dies soll bewirken, dass wenn das Signal kommt, Pin 0 und 1 low werden. Sonst high. Da es nicht funktioniert die Frage, was hab ich falsch gemacht?
[Edit] (kann sein dass ich bei den &= , |= oder so was verdreht hab)

fhs
28.07.2008, 15:57
Hi,

if(bit_is_set(PINX, PIN_NUMBER)) {} ...

Gruß

Fred

Jacob2
28.07.2008, 18:21
Wie ist das jetzt gemeint :-s
Wo gibt man dann an, um welchen Port es sich handelt?
Soweit ich die allgemeine Form verstanden habe heißt das dann z.B.:

if(bit_is_set(PIN7, PIN_7) {} ...

Oder wie???
Ich versteh net wie du das meinst...
Danke!

Gruß Jacob2

fhs
28.07.2008, 18:30
Hi,

Wie ist das jetzt gemeint :-s ... Wo gibt man dann an, um welchen Port es sich handelt?

genau da liegt Dein Denkfehler: Es geht nicht um einen PORTX (X steht für den Portbuchstaben, z.B. A,B,C oder so), den Du auswerten willst: Du möchtest doch eigentlich einen Eingang lesen. Die Eingänge heißen bei den AVRs nun mal PINX (X wie oben). Für PIN_NUMBER setzt Du eine Konstante ein; der erlaubte Wertebereich ist 0-7.

Ich rate Dir dringlich, ein entsprechendes Tutorial durchzuarbeiten, z.B. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial -- dort sind die bit_is_set/clear() Funktionen gut erklärt: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Lesen_aus_Registern .

Gruß

Fred

Jacob2
28.07.2008, 19:41
Ok. Danke, da steht alles drin! :oops:
Das mit der Beschaltung ist richtig oder? Von wegen 12V oder so...(nicht dass ich mir da was kaputtmache)

fhs
28.07.2008, 20:03
Hi,

Du könntest auch einfach einen Spannungsteiler aus 2 Widerständen einsetzen. Ganz sicher kann man gehen, indem man einen Optokoppler benutzt. Hier ein Link zu Pegelwandlern (http://www.mikrocontroller.net/articles/Pegelwandler).

Gruß

Fred

Jacob2
29.07.2008, 10:49
OK, danke das hat sich dann jetzt gelöst!