Forum: Compiler & IDEs Eingänge am atmega32 konfigurieren (Anfängerfrage)


von Stefan F. (feissy)


Lesenswert?

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;
  }
 }
}

von Lowtzow .. (lowtzow)


Lesenswert?

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 ;-)

von Stefan F. (feissy)


Lesenswert?

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???

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Stefan F. (feissy)


Lesenswert?

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???

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan F. (feissy)


Lesenswert?

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 ???

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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
}

von Stefan F. (feissy)


Lesenswert?

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???

von Stefan F. (feissy)


Lesenswert?

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
Noch kein Account? Hier anmelden.