Forum: Mikrocontroller und Digitale Elektronik Port auf HIGH oder LOW?


von Lokus P. (derschatten)


Lesenswert?

Irgendwo hab ich hier einen dreher drinn.
Komm aber nicht drauf:
1
#define OUT_DDR         DDRC
2
#define OUT_PORT        PORTC
3
#define OUT1            0
4
#define OUT2            1
5
#define OUT3            2
6
#define OUT4            3
7
#define OUT5            4
8
#define OUT6            5
9
#define ALL_OUT        (1<<OUT1 | 1<<OUT2 | 1<<OUT3 | 1<<OUT4 | 1<<OUT5 | 1<<OUT6)
10
11
  OUT_DDR = ALL_OUT;                    // Controller als Ausgang definieren
12
  OUT_PORT |= ALL_OUT;                    // Controller auf LOW setzen

Damit bekomme ich am Ausgang ein HIGH.
Möchte aber ein LOW.
Wo ist der Fehler?

von g457 (Gast)


Lesenswert?

Manfred W. schrieb:
> OUT_PORT |= ALL_OUT;                    // Controller auf LOW setzen
                                                            ^ 
s/LOW/HIGH/

für low:
OUT_PORT &= ~(ALL_OUT);

von Ganymed (Gast)


Lesenswert?

Du schreibst doch Einsen in den Port.
Dann bekommst Du die auch.

von Lokus P. (derschatten)


Lesenswert?

OK, aber mit |= dreh ich sie doch um oder?

von Justus S. (jussa)


Lesenswert?

Manfred W. schrieb:
> OK, aber mit |= dreh ich sie doch um oder?

öh nein. Lies dir erstmal den Artikel über Bit-Manipulationen auf der 
Seite hier durch...

von Lokus P. (derschatten)


Lesenswert?

Dann hab ich hier auch noch ein Problem:
1
#define KEY_DDR         DDRB
2
#define KEY_PORT        PORTB
3
#define KEY_PIN         PINB
4
#define KEY0            7
5
#define KEY1            6
6
#define KEY2            0
7
#define KEY3            1
8
#define KEY4            2
9
#define KEY5            3
10
#define KEY6            4
11
#define KEY7            5
12
#define ALL_KEYS        (1<<KEY0 | 1<<KEY1 | 1<<KEY2 | 1<<KEY3 | 1<<KEY4 | 1<<KEY5 | 1<<KEY6 | 1<<KEY7)
13
14
  KEY_DDR &= ~ALL_KEYS;                  // Tasten als Eingang definieren
15
  KEY_PORT &= ~ALL_KEYS;                  // Tastenports auf LOW setzen
16
17
int main(void)
18
{
19
  while(1)
20
  {
21
    Summe = 0;
22
23
  if(KEY_PIN & 0x01)
24
    Summe |= 0x01
25
OUT_PORT = Summe
26
27
....
28
}
Warum bringt mir das beim Einschalten des AVR sofort am PORTC ein HIGH?
Hier wird ein Tastendruck registriert, aber warum?

Also das ganze soll so funktionieren:

Der Eingang soll eigentlich im ruhezustand auf HIGH liegen und mit einem 
Tastendruck auf LOW gelegt werden.

Ist das der Fall soll der Ausgang auf HIGH geschalten werden.

von Karl H. (kbuchegg)


Lesenswert?

Manfred W. schrieb:
> Dann hab ich hier auch noch ein Problem:

Manfred
Denkst du nicht, dass es schöm langsam Zeit wird, die Sache vernünftig 
anzugehen?
Das bedeutet: C-Buch rauskramen und die Grundlagen von C lernen. Das 
bedeutet: Tutorial auf dieser Seite rauskramen und diese Grundlagen auf 
die Programmierung von AVR-µC anwenden lernen.

Nicht immer nur die 2 Sätze lesen, auf die du hier mit der Nase 
gestossen wirst, sondern Artikel vollständig durchlesen. Hat man sie 
gelesen, dann noch einmal von vorne zu lesen anfangen und über das 
Gelesene nachdenken. Kleine Übungen machen.Wenn sie nicht so 
funktionieren wie erwartet, dann den Artikel nocheinmal lesen und dabei 
nach Aussagen und Hinweisen zum konkreten Problem durchsuchen.

Ein oder zweimal hilft man ohnehin gerne. Kein Problem. Wenn man aber 
sieht, dass du immer wieder bei den absoluten Grundlagen strauchelst 
weil du nur über Viertelwissen verfügst, dann ist das für die Helfer 
ziemlich frustrierend und irgendwann geben sie auf.

Das avr-gcc-tutorial wurde genau aus dem Grund geschrieben um nicht 
jeden Tag wieder jemandem die absoluten Grundlagen vorbeten zu müssen. 
Also nutze es.
Genau so wie die Artikelsammlung. Auch dort findet sich vieles, wie zb 
http://www.mikrocontroller.net/articles/Bitmanipulation
Zugegeben: die Artikel sind schwerer zu finden. Auf der anderen Seite 
wird auf speziell diesen Artikel jeden Tag mindestens 5 mal verwiesen. 
Es könnte daher auch lohnen einfach mal andere Einträge im Forum zu 
lesen. Da kannst nur dabei lernen.

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.