mikrocontroller Port als Eingang programmieren

Gast #2826923
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
(Firma: matzetronics) #2826945
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]
Gast #2826977
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.
Gast #2827360
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
#2827822
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.
#2827931
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren