Forum: Mikrocontroller und Digitale Elektronik mikrocontroller Port als Eingang programmieren


von Tanja (Gast)


Lesenswert?

Hallo,

wir benutzen in der Schule den Atmel90USB.
in der ersten Stunde mussten wir einen Port ansteuern bei dem eine LED 
leuchtet. Nun wollte ich zu Hause einen Taster mit ins Programm 
aufnehmen. Leider weiß ich nicht wie man den Eingang richtig deklariert

int main(void)
{
  InitAT90();          // Anfangs-Initialisierung

  DDRA = 0b00100000; // am Port-D, bit-6 als Ausgang initialisieren
  PORTA  = 0b00100000; // am Port-D, bit-6 = '1' = LED einschalten


  while(1 == 1)       // Endlosschleife
  {
    ;
  }
}

wie muss ich die Zeile DDRA umbennenen, dass ich DDRA als Eingang 
benutzen kann?
wo steht das im Datenblatt, unter welcher Überschrift muss ich da 
suchen?

vielen Dank im voraus

von troll (Gast)


Lesenswert?

Pin als Eingang --> entsprechendes Bit im passenden DDR-Register auf 0 
setzen (Ist standardmässig schon gesetzt).
Pin abfragen: Register PINx (x=A, B, ...) nutzen.

hth

von Tanja (Gast)


Lesenswert?

sorry, deine antwort check ich gerade nicht.
könntest du mein Programmcode so anpassen dass DDRA als Eingang 
funkiert?

vielen Dank

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tanja schrieb:
Diese Zeile erklärt alle Pins bis auf Bit 5 ( Computer fangen bei 0 an 
zu zählen, der Port hat also Bit 0 bis Bit 7) als Eingang:

> DDRA = 0b00100000; // am Port-D, bit-6 als Ausgang initialisieren

Du fragst z.B. Bit 0 an Port A so ab:
1
if ((PINA & 0b00000001)==1) {
2
 // Bit is high
3
 // tue hier was, z.B. Port A Bit 5 high machen
4
  PORTA |= 0b00100000;
5
 } else {
6
 // Bit ist low
7
 // mach Bit 5 low
8
  PORTA &= ~(0b00100000);
9
 }
Dein Bit 5 folgt so dem Zustand an Bit 0 des Port A. Besser ist es 
übrigens, Bits  zu definieren, z.B.
[c]
#define LED 5
PortA |= (1 << LED); // mach LED high
{/c]

von Hubert G. (hubertg)


Lesenswert?

Alle Bits von PortA also DDRA 0b00100000 die 0 sind, sind automatisch 
Eingang.
Nur wenn du eine Taste anschaltest, dann musst du dafür sorgen, das wenn 
die Taste offen ist, ein eindeutiges Potential am Eingang anliegt. Dafür 
gibt es die internen PullUp.
Lies dir das hier durch: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

von Shuzz (Gast)


Lesenswert?

DDRA ist mehr als nur "ein Eingang".
Es sind (je nach Controller) bis zu acht EA-Pins die man über DDRA, 
PORTA und PINA ansteuern bzw. auslesen kann.

Schliess also Deinen Taster einfach an einen der anderen Pins von Port A 
an und schon bist Du fertig.

von Tanja (Gast)


Lesenswert?

Halo nochmals,

leider check ich die antwort von Matthias Sch.  nicht.
nach meiner Logik müsste es so heißen:

if ((PORTA = 0b00000100)==1)
{
    DDRA = 0b00100000;
    PORTA = 0b00100000;
}
else
{
    DDRA = 0b10000000;
    PORTA = 0b10000000;
}

kann mir jemand sagen warum die if - anweisung nicht funktioniert?
bzw kann mir jemand das von Matthias Sch.  erklären:
if ((PINA & 0b00000001)==1)
was bedeutet das "&"

danke im voraus

von Cyblord -. (cyblord)


Lesenswert?

Besonders viel wird hier ja nicht "gecheckt"...

von Lutz (Gast)


Lesenswert?

So wird das nix. Schau mal hier rein. Da stehen auch die Antworten auf 
deine nächsten Fragen drin: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

von Max T. (charmquark)


Lesenswert?

Vielleicht wäre auch ein grundlegendes c++-Tutorial hilfreich.

von Hubert G. (hubertg)


Lesenswert?

Tanja schrieb:
> if ((PINA & 0b00000001)==1)
> was bedeutet das "&"

Der Unterschied zwischen PINA und PORTA wird in dem schon zwei mal 
angeführten Tutorial sehr gut beschrieben.
Was "&" und "&&" bedeutet steht dort auch drinnen.

von Cyblord -. (cyblord)


Lesenswert?

Max TBA schrieb:
> Vielleicht wäre auch ein grundlegendes c++-Tutorial hilfreich.

Vielleicht wäre Brain 1.0 hilfreich?

von Bernhard S. (b_spitzer)


Lesenswert?

Hier scheinen einige ziemlich Betriebsblind zu sein. Das Problem liegt 
doch wohl eher im Verständnis, was DDRA bedeutet.
DDRA ist das D ata D irection R egister für den Port A. Das ist 
also kein Ein- oder Ausgang, sondern bestimmt, welcher Pin von Port A 
Ein- (Bit gesetzt) oder Ausgang (Bit gelöscht) sein soll.
Jeder Port hat beim den AVR-Controllern 3 Register. DDRx, PINx und 
PORTx.

von Thomas K. (thomas_k39)


Lesenswert?

Bernhard Spitzer schrieb:
> Hier scheinen einige ziemlich Betriebsblind zu sein. Das Problem liegt
> doch wohl eher im Verständnis, was DDRA bedeutet.
> DDRA ist das D ata D irection R egister für den Port A. Das ist
> also kein Ein- oder Ausgang, sondern bestimmt, welcher Pin von Port A
> Ein- (Bit gesetzt) oder Ausgang (Bit gelöscht) sein soll.

Im Prinzip ja. Ausser dass es laut Datenblatt genau anders herum ist: 
wenn das Bit im DDRA gesetzt ist, ist der entsprechende Pin ein Ausgang, 
wenn das Bit gelöscht ist ein Eingang.

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.