PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger braucht Hilfe bei Schalter



Jokill
19.03.2007, 20:11
Hallo,
1. Ich hab folgendes Programm:

#include <avr/io.h>
#define F_CPU 1000000


int main()
{
DDRB=0xff;
DDRD=0x00;

while(1)
{

PORTB=PIND;

}
return 0;
}

Wenn ich nun einen Schalter drücke leuchtet die entsprechende LED auf. Wie kann ich aber machen das bei einem Schalter eine andere LED aufleuchtet?

2. Wenn ich bei mir schreibe:
DDRB=0xff;
PORTB|=(1<<PB0);
dann leuchten alle bis auf die nullte LED auf, obwohl diese doch 1 ist, kapier ich nicht.

Mfg Jokill

geronet
20.03.2007, 16:42
Ganz einfach, du musst den Port auf LOW (0) setzen damit die Led leuchtet weil du sie mit Vorwiderstand an +5V angeschlossen hast.

>Wie kann ich aber machen das bei einem Schalter eine andere LED aufleuchtet?

vielleicht so:
PORTB=PIND <<1;

triplebit
20.03.2007, 17:22
Hallo Jokill,

um das zu verstehen, musst Du ein bisschen in binäre Logik einsteigen.

Das Programm macht nichts anderes als den Zustand der Schalter von PORTD(PIND ist der Zustand der Eingänge an PortD) auf die Ausgänge von PortB zu legen. Binär gesehen sieht das wenn Du z.B die Schalter 2 und 4 drückst (Schalter von 0 bis 7) so aus

0b00010100 (PortD S2 und S4 gedrückt)

und genau das wird auf PORTB übergeben.

Hierzu gibt es ein Wiki unter RN-Wissen auf roboternetz! Solltest Du dann noch Probleme haben, dann melde Dich einfach hier wieder

gruß

Martin

Jokill
20.03.2007, 19:08
Danke, habt mir viel geholfen.
Hab das nun mit einer if-Bedingung gemacht:


if(PIND==0b11111110)
{
PORTB=0b01111111;
}


Aber geht das nicht auch ohne if?

triplebit
21.03.2007, 02:09
Da gibt es Unmengen an Möglichkeiten, deshalb bin ich da nicht darauf eingegangen.

z.B. kannst du maskieren

PIND & (1 << PD1) ist das selbe wie PIND & 0b00000010. Möglich dass bei deiner Anordnung das ganze Invertiert ist, du müsstest also PIND & 0b11111101 abfragen.

das kannst Du dann weil es eine Bedingung ist, z.B. mit IF abfragen(Oder Switch).

So wie ich das sehe, möchtest Du zunächst mal experimentieren. Es gibt viele Möglichkeiten Zustände abzufragen und wieder auszugeben. Ich kann und will Dir hier keinen C-Kurs und I/O-Kurs vom AVR geben. Dazu ist das Wiki da! (Unter RN-Wissen)

Wenn Du hier Experimente machen willst, empfehle ich Dir entweder den AVR-Dragon( Hardware, kostet ca. 70€), da kannst Du an einem Echtem AVR (ab ATMega16 aufwärts(muss ein JTAG-Interface habe)) schauen welche Zustände Eingänge Ausgänge Timer usw. habe. Wenn Du kein Geld ausgeben willst kannst Du das kostenlos (aber nur virtuell) mit der Software VMLab machen. Das ganze hat allerdings Einschränkungen weil hier die Hardware vom AVR nur simuliert wird. Ist super zum Einsteigen, weil Du da Fehler schneller findest.

Wenn Du dann ein Problem hast, hilft Dir bestimmt jemand!

gruß

Martin