hallo, hab da mal ne anfängerfrage, und zwar hab ich am avr an port pb leds angeschlossen und möchte alle gleichzeitig mit einem eingang ansteuern. habe dafür einen taster an Pd4 angebracht. Auf den avr habe ich folgenden c-Code aufgespielt. jetzt habe ich folgendes Problem und zwar gehen die Leds nur direkt nach dem reseten anm, wenn ich den taser drücke. Sonst kann ich den taster drücken wie ich will da passiert nix. was hab ich da falsch gemacht und wie bekomme ich das dann hin , dass die leds auch anbleiben und beim 2. tastendruck erst ausgehen ?? schon mal im voraus danke #include <avr/io.h> void main( void ) { PORTB = 0; DDRB = 0xff; while(1) { if (PIND & (1<<PD4)) { PORTB = 0xff; } } }
probiers mal so
1 | #include <avr/io.h> |
2 | |
3 | void main( void ) |
4 | {
|
5 | DDRB = 0xff; |
6 | PORTB = 0; |
7 | |
8 | |
9 | while(1) |
10 | {
|
11 | if (PIND & (1<<PD4)) { |
12 | PORTB = 0xff; |
13 | }
|
14 | else{PORTB=0x00;} |
15 | }
|
16 | }
|
abgesehn davon definierst du deinen taster nicht als eingang schau dir einfach nochmal das toutorial oder ein paar beispiele an ;-)
aber durch den if (PIND & (1<<PD4)) teil definiere ich doch, dass wen am Port PD4 eine 1 anliegt, also Taster zu, dann leds leuchten sollen oder???
Stefan Feismann wrote: > aber durch den if (PIND & (1<<PD4)) teil definiere ich doch, dass wen am > Port PD4 eine 1 anliegt, also Taster zu, dann leds leuchten sollen > oder??? Nein, du setzt den Port auf 0xFF (was dazu führt dass deine LED leuchten). Aber warum soll der Port den plötzlich nicht mehr den Zustand 0xFF haben, nur weil du den Taster nicht mehr gedrückt hast? Dafür hast du nichts programmiert. Ein Port (genauso wie eine Variable) behält seinen Wert solange, bis er durch eine erneute Zuweisung einen anderen Wert zugewiesen bekommt. Dein Port B beginnt mit 0x00. In der Schleife wird dann ständig geprüft, ob die Taste gedrückt ist. Ist eine Taste gedrückt, wird dem Port der neue Wert 0xFF zugewiesen. Lässt du die Taste los, wird zwar der von der Bedingung abhängige Teil nicht mehr ausgeführt, aber nachdem da nichts anderes mehr steht, behält der Port seinen Wert von 0xFF. Es gibt ganz einfach keine Anweisung in deiner Schleife, die den Port Wert ändern könnte. Damit hast du den Fall, dass der Port lediglich von 0x00 (von ausserhalb der Schleife) nach 0xFF geändert wird. Aber wenn der Port einmal den Wert 0xFF hat, gibt es keine Anweisung, die das ändern könnte. Und gewöhn dir gleich von Anfang an vernünftige Einrückungen an und zieh das auch durch!
1 | #include <avr/io.h> |
2 | |
3 | void main( void ) |
4 | {
|
5 | DDRB = 0xff; |
6 | PORTB = 0; |
7 | |
8 | while( 1 ) |
9 | {
|
10 | if( PIND & (1<<PD4) ) // Taste gedrückt? |
11 | {
|
12 | PORTB = 0xff; // Ja: Leds einschalten |
13 | }
|
14 | else
|
15 | {
|
16 | PORTB = 0x00; // Nein: Leds wieder ausschalten |
17 | }
|
18 | }
|
19 | }
|
Das mit: "Mit einem Taster die Leds einschalten und bei einem zweiten Tastendruck wieder ausschalten" Stell diese Aufgabenstellung noch etwas zurück. Das ist nämlich gar nicht so simpel. Dazu musst du die Tasten entprellen. Was aber einfach geht: Mit einem Taster an PD4 die Leds einschalten und mit einem zweiten Taster (zb. an PD5) die Leds wieder ausschalten.
1 | #include <avr/io.h> |
2 | |
3 | void main( void ) |
4 | {
|
5 | DDRB = 0xff; |
6 | PORTB = 0; |
7 | |
8 | while( 1 ) |
9 | {
|
10 | if( PIND & (1<<PD4) ) // Taste 1 gedrückt? |
11 | {
|
12 | PORTB = 0xff; // Ja: Leds einschalten |
13 | }
|
14 | |
15 | if( PIND & (1<<PD5) ) // Taste 2 gedrückt? |
16 | {
|
17 | PORTB = 0x00; // Ja: Leds wieder ausschalten |
18 | }
|
19 | }
|
20 | }
|
ok schon mal danke werd ich mir merken ;-) also kann ich dann zuerst die eingänge als Taster konfigurieren, wenn ich, wie auf dieser Seite beschrieben http://www.mikrocontroller.net/articles/Entprellung , die 4 Zustände des tasters da definiere???
Stefan Feismann wrote: > ok schon mal danke werd ich mir merken ;-) > also kann ich dann zuerst die eingänge als Taster konfigurieren, wenn > ich, wie auf dieser Seite beschrieben > http://www.mikrocontroller.net/articles/Entprellung , die 4 Zustände des > tasters da definiere??? Mein Rat: vergiss das erst mal. Die vernünftigste Methode ist die ebenfalls auf dieser Seite vorgestellte Interrupt-Variante. Die funktioniert ausgezeichnet und ist simpel, sobald du erst mal Timer und Interrupts in Betrieb hast. Leb in der Zwischenzeit damit, dass du 2 Taster brauchst. Mit dem einen schaltest du was ein, mit dem anderen wieder aus.
also ich habe jetzt genau den code verwendet, den du mir empfohlen hast, jedoch passiert folgedes, die leds leuchten von anfang an, und wenn ich dann pd4 drücke, leuchten sie etwas heller???????? woran kann das denn jetzt liegen ???
Stefan Feismann wrote:
> also ich habe jetzt genau den code verwendet, den du mir empfohlen hast
Welcher?
Ich hab mitlerweile mehrere gepostet.
Kopier den Code den du verwendest doch einfach mal hier rein.
Liefern deine Tasten eine 1 oder eine 0, wenn du sie drückst?
> und wenn ich > dann pd4 drücke, leuchten sie etwas heller???????? Hmm. Die logische Schlussfolgerung wäre, dass deine Tasten low-aktiv sind, also eine 0 liefern, wenn sie gedrückt werden. In dem Fall müsste es dann so aussehen:
1 | #include <avr/io.h> |
2 | |
3 | void main( void ) |
4 | {
|
5 | DDRB = 0xff; |
6 | PORTB = 0; |
7 | |
8 | while( 1 ) |
9 | {
|
10 | if( ( PIND & (1<<PD4) ) == 0 ) // Taste 1 gedrückt? |
11 | {
|
12 | PORTB = 0xff; // Ja: Leds einschalten |
13 | }
|
14 | |
15 | if( ( PIND & (1<<PD5) ) == 0 ) // Taste 2 gedrückt? |
16 | {
|
17 | PORTB = 0x00; // Ja: Leds wieder ausschalten |
18 | }
|
19 | }
|
20 | }
|
ok sry war grade mein fehler ............tut supi erst mal besten dank dafür. jetzt möchte ich aber mal nicht alle ausgänge ansdteuern, sondern nur PORTB = 0b01010101 wenn ich das dann bei #include <avr/io.h> void main( void ) { DDRB = 0xff; PORTB = 0; while( 1 ) { if( ( PIND & (1<<PD4) ) == 0 ) // Taste 1 gedrückt? { PORTB = 0b01010101; // Ja: Leds einschalten } if( ( PIND & (1<<PD3) ) == 0 ) // Taste 2 gedrückt? { PORTB = 0x00; // Ja: Leds wieder ausschalten } } } ändere, leuchten auch die leds 0b10101010. aber die anderen kann ich wie programmiert mit taster 3 und 4 an und ausmachen. wie bekomme ich denn jetzt die anderen Leds, die auch eig aus sein müssten aus???
habs schon selber rausgefunden, die leds waren falsch herum gepolt also hab die an 5v gehabt und nich an gnd trotzdem danke
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.