Forum: Mikrocontroller und Digitale Elektronik Atmega8535 Ausgänge einlesen


von Benny (Gast)


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

von Timmo H. (masterfx)


Lesenswert?

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

von Benny (Gast)


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.


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

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

von Johannes M. (johnny-m)


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.

von Stefan E. (sternst)


Lesenswert?

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

von Benny (Gast)


Lesenswert?

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

Gruß,

Benny

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.