mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8535 Ausgänge einlesen


Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin Anfänger in AVR-Programmierung. Gibt es eine Möglichkeit den 
Status eines Ausganges (bspw. PD1) einzulesen? Und zwar ob da gerade 
eine 1 oder eine 0 ausgegeben wird?

Gruß,

Benny

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt, Seite 53:
"Independent of the setting of Data Direction bit DDxn, the port pin can 
be read through the PINxn Register bit."

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Hinweis... ich komme aber nicht wirklich weiter 
damit...

und zwar möchte ich den Signalzustand an PD1 einlesen und über eine LED 
an PA2 ausgeben. Zudem möchte ich die Funktion intern(); ausführen, wenn 
die LED vorher nicht geleuchtet hatte. Pullup an PD1 ist aktiv.


if (PIND & (1<<PD1)) PORTA &= ~(1<<PA2); else { //LED aus wenn HIGH
if (!(PINA & (1<<PA2))) //LED-Ausgang einlesen. Wenn nicht an, dann
PORTA |= (1<<PA2); // LED einschalten und
intern(); //Funktion intern aufrufen.
}

Wenn ich nun PD1 auf Masse lege geht zwar die LED an - jedoch führt er 
die Funktion intern(); immer aus... auch wenn die LED bereits leuchtet.

Ich dachte dies kann man umgehen wenn man den Ausgangspin PA2 einliest. 
Wenn HIGH (=LED leuchtet) anliegen sollte wird die Funktion intern() 
nicht erneut aufgerufen...

Woran liegt das?

Viele Grüße,

Benny

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benny wrote:
> Woran liegt das?
Vielleicht daran, dass das if in dem else -Block keinerlei 
Auswirkung auf den Funktionsaufruf hat? Wenn die Funktion nicht mehr 
ausgeführt werden soll, wenn PA2 bereits high ist, dann musst Du noch 
ein paar Klammern spendieren.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder alternativ die öffnende Klammer anders positionieren.
if (PIND & (1<<PD1))
  PORTA &= ~(1<<PA2);           //LED aus wenn HIGH
else if (!(PINA & (1<<PA2))) {  //LED-Ausgang einlesen. Wenn nicht an,
  PORTA |= (1<<PA2);            //dann LED einschalten und
  intern();                     //Funktion intern aufrufen.
}

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha - es funktioniert - vielen vielen Dank! Da hab ich wohl eine Klammer 
übersehen, die weitreichende Folgen hatte ;)

Gruß,

Benny

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.