www.mikrocontroller.net

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


Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
 }
}

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probiers mal so
#include <avr/io.h>

void main( void )
{   
    DDRB = 0xff;
    PORTB = 0;
    

while(1)
{
  if (PIND & (1<<PD4)) {
  PORTB = 0xff;
                       }
   else{PORTB=0x00;}
 }
}

abgesehn davon definierst du deinen taster nicht als eingang
schau dir einfach nochmal das toutorial oder ein paar beispiele an ;-)

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!
#include <avr/io.h>

void main( void )
{   
  DDRB = 0xff;
  PORTB = 0;
    
  while( 1 )
  {
    if( PIND & (1<<PD4) )   // Taste gedrückt?
    {
      PORTB = 0xff;         //   Ja: Leds einschalten
    }
    else
    {
      PORTB = 0x00;         //   Nein: Leds wieder ausschalten
    }
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>

void main( void )
{   
  DDRB = 0xff;
  PORTB = 0;
    
  while( 1 )
  {
    if( PIND & (1<<PD4) )   // Taste 1 gedrückt?
    {
      PORTB = 0xff;         //   Ja: Leds einschalten
    }

    if( PIND & (1<<PD5) )   // Taste 2 gedrückt?
    {
      PORTB = 0x00;         //   Ja: Leds wieder ausschalten
    }
  }
}

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>

void main( void )
{   
  DDRB = 0xff;
  PORTB = 0;
    
  while( 1 )
  {
    if( ( PIND & (1<<PD4) ) == 0 )   // Taste 1 gedrückt?
    {
      PORTB = 0xff;                  //   Ja: Leds einschalten
    }

    if( ( PIND & (1<<PD5) ) == 0 )   // Taste 2 gedrückt?
    {
      PORTB = 0x00;                  //   Ja: Leds wieder ausschalten
    }
  }
}

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs schon selber rausgefunden, die leds waren falsch herum gepolt also 
hab die an 5v gehabt und nich an gnd
trotzdem danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.