PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme beim Eingänge abfragen :(



Teslafan
11.11.2010, 20:39
Hallo,

hab da mal wieder ein Problemchen, wollte gerade einen Eingang abfragen
und dann ne LED zum leuchten bringen.

Dabei werden PB0 welcher als Ausgang gesetzt ist und PC0 welcher als
Eingang deklariert gebrückt. Also bekomm ich direkt 5V von PB0 auf PC0.
Dies soll dann eine LED welche an PB1 angeschlossen ist zum leuchten
bringen.

Hier mal der Code:



#include <avr/io.h>




int main (void)
{

DDRB |= (1<<PB0);
PORTB |= (1<<PB0); //Pin B0 auf Ausgang und High setzen

while (1)
{

if ( PINC & (1<<PINC0) ) { //Abfrage ob an Pin C0 5V anliegen


PORTB |= (1<<PB1); // Pin PB1 auf High
}
else
{
PORTB &= ~(1<<PB1); //Pin PB1 auf Low
}
}
}

Kann mir jemand helfen?

radbruch
11.11.2010, 20:51
PB1 ist kein Ausgang?

Teslafan
11.11.2010, 20:57
Danke für die schnelle Antwort habs auch grad noch gesehen, jetzt leuchtet er dauerhaft :(

egal ob die Brücke gesteckt ist oder nicht.


#include <avr/io.h>





int main (void)
{

DDRB |= (1<<PB0);
DDRB |= (1<<PB1);
while (1) {
PORTB |= (1<<PB0); //Pin B0 auf Ausgang und High setzen



if ( PINC & (1<<PINC0) ) { //Abfrage ob an Pin C0 5V anliegen


PORTB |= (1<<PB1); // Pin PB1 auf High
}
else
{
PORTB &= ~(1<<PB1); //Pin PB1 auf Low

}
}
}

radbruch
11.11.2010, 21:15
Das wäre ja auch zu einfach gewesen ;)

Zwei direkt verbundene Pins finde ich kritisch, vorsichtshalber würde ich einen kleinen Widerstand als "Brücke" verwenden. Wenn es nicht schon zu spät ist....

Bei den AVRs haben viele Pins mehrfache Funktionen. Bei Port C fällt mir sofort JTag ein. Schau mal im Datenblatt deines AVR ob es für PC0 zutrifft. (Beim Mega32 z. B. ist PC0 der SCL-Pin vom I2C, also unkritisch, solange deine Schaltung keinen I2C-PullUp hat).

Ansonsten: Anderen Eingangspin versuchen, Brücke nach GND anstelle von PB0, Pegel mit Messgerät messen.

Gruß

mic

Slein
11.11.2010, 22:19
probiers mal so:

#include <avr/io.h>

int main (void) {

DDRB = 0x03;
PORTB = 0x00;

DDRC = 0x00;
PORTC = 0x01;

while (1) {
if ( PINC & (1<<PC0) ) { //Abfrage ob an Pin C0 5V anliegen
PORTB |= (1<<PB1); // Pin PB1 auf High
} else {
PORTB &= ~(1<<PB1); //Pin PB1 auf Low
}
}
}

PB0 bleibt dabei auf 0 (GND), am Eingang PC0 wird diesmal der Pullup gesetzt.
Funktioniert also genau andersrum wie vorher, hat aber den Vorteil, dass 2 definierte Zustände am Eingang vorhanden sind. Einmal durch die Brücke auf Masse gezogen, ohne Brücke durch den Pullup am PC0 auf 5V hochgezogen.

Alternativ kannst auch nen 50kOhm Pulldown an PC0 hängen und deinen code nochmal probieren :)