PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pin einlesen --> Led einschalten



Finwe0815
26.09.2007, 20:22
Hy zusammen,

ich hab nen kleines großes Problem, und zwar:

Ich will mit meinem Atmega8 einen Port einlesen (PB0) und je nach Art des Zustandes ne LED ein und ausschalten (wenn High --> LED an; wenn Low --> Led aus.

Die LED ist mit dem Minus Pol direkt mit Masse verbunden, der Plus Pol mit PC0. Wenn ich nun eine Verbindung von VCC 5V mit PB0 verbinde soll die LED leuchten. Wenn keine Verbindung besteht soll die LED aus sein.

Ich benutze Winavr und Pony Prog... Einzelne Pins ein und ausschalten funktioniert aber das mit dem Einlesen nicht, hier mal der Code:

// Test

#include <avr/io.h>

int main (void)
{

DDRB &= ~( 1 << PB0 ); //PB0 Eingang
PORTB |= ( 1 << PB0 ); //Pull up an
DDRC |= ( 1 << PC0 ); //PC0 Ausgang

while(1)
{
if (PINB & (1 << PB0)) //wenn PB0 High ist...
{
PORTC |= (1 << PC0); //PC0 High
}

// Eine Schleife ist eigentlich unnötig
if (!(PINB & (1 << PB0))) //wenn PB0 Low ist...
{
PORTC &= ~(1 << PC0); //PC0 Low
}
}

return 0;
}


Im Moment läuft es irgendwie andersherum wenn keine Verbindung besteht ist die LED an, wenn eine Verbindung besteht ist sie aus??? Wenn ich nur eine Schleife programmiere passiert garnix, die LED ist immer an oder aus (je nach Schleife) und das Anlegen vonn VCC oder GND an PB0 bewirkt garnix?!

Ich hoffe Ihr könnt mir helfen.

Vielen Dank im Voraus
Gruß Finwe09

Lunarman
26.09.2007, 21:00
ich wundere mich zwar etwas darüber, dass das ein µC erledigen muss...
aber das schon so spät ist, könnte es vielleicht am Pullup liegen? Ich hab grad ne komplette Denksperre, aber das ist doch dann eigentlich ein Inverter...
doer vertu ich mich da grad übel?

vklaffehn
26.09.2007, 21:04
Moin!
Was das Einlesen angeht : sowas wie 'keine Verbindung' ist zu vermeiden, da der Pin dann einen undefinierten Zustand hat. Dafür hat man in den AVR's die schönen Pullup-Widerstände, die den Pin auf High-Pegel ziehen, wenn nichts dran ist. Also entweder die Abfrage umkehren, also den internen Pullup aktivieren .... oh, ich seh grad, du machst das ja, dann mußt du natürlich deinen Eingabepin nach GND schalten, sonst ist der ja entweder mit Vcc verbunden -> high, oder über den internen Pullup mit Vcc verbunden, auch High..... außerdem könnte man statt der zwei if-Abfragen eine if-else Konstruktion benutzen.
Und außerdem Code Tags :


// Test

#include <avr/io.h>

int main (void)
{

DDRB &= ~( 1 << PB0 ); //PB0 Eingang
PORTB |= ( 1 << PB0 ); //Pull up an
DDRC |= ( 1 << PC0 ); //PC0 Ausgang

while(1)
{
if (PINB & (1 << PB0)) //wenn PB0 High ist...
{
PORTC |= (1 << PC0); //PC0 High
}
else //ansonsten....
{
PORTC &= ~(1 << PC0); //PC0 Low
}
}

return 0;
}



und, wie gesagt, den Eingang gegen GND schalten

Lunarman
26.09.2007, 21:07
hatte ich jetzt recht oder nicht? Ich will auch was lernen *lach*

Finwe0815
26.09.2007, 21:25
edit [...Ihr beide habt wohl Recht :-)]


Vielen Dank Ihr zwei,

das Problem hat sich erledigt...

also ich weiss, dass man für sowas keinen µC braucht, es war ja nur mal ein Test ob ich das überhaupot hinbekomme...

es hat natürlich an dem Schalten nach GND gehangen, weil ich die Pull Ups aktiviert hatte...(es war natürlich unsinn den PB0 nach VCC zu schalten)
...die heissen ja nicht um sont pull UP und nicht pull DOWN :-)

So noch was, wie bekomm ich so ein schönes Quellcode Fenster in meine Beiträge gezaubert?

Vielen Dank nochmal
Gruß Finwe0815

vklaffehn
26.09.2007, 21:35
Moin!
Ganz einfach : entweder beim bearbeiten oben auf Code drücken, oder im Beitrag
[ code ]
[ /code ]
schreiben (ohne Leerzeichen natürlich....)

Lunarman
26.09.2007, 21:35
jo... da machst du so (code) und (/code)... natürlich ist es hilfreich, die runden Klammern durch eckige zu ersetzen.

P.S.: Sagen wirs so - wenn du das gemacht hast, um zu gucken ob dus hinkriegst... und du hast es NICHT sofort hinbekommen... dann hast du dir genau genommen zu hohe Ziele gesetzt :P :D

EDIT: menno... jetzt war der auch noch schneller...

vklaffehn
26.09.2007, 21:51
Har Har! ;-) .......................