Taster auslesen.

Gast #1815844
Lesenswert?

Hi

nach tagelangem rumprobieren muss ich jetzt leider doch hier posten weil 
ich meinen fehler einfach nicht finde. hab mir auch schon zig mal das 
tutorial dazu durchgelesen. es geht um eigentlich ne banalität. ich 
möchte nen taster einlesen. taster gedrückt LED leuchtet taster nicht 
gedrückt LED aus.
benutze einen atmega32 dafür und folgenden code.
1
#include <io.h>
2
#include <iom32.h>
3

4
int main(void)
5
{  
6

7
    DDRD = 0xff; 
8
    DDRD &= ~( 1 << DDD4);      //PORT4 als Eingang
9
    
10
  
11
  while(1) {
12

13
  
14
    if ( PIND & (1<<PIND4) )
15
    {
16
    PORTD |= ( 1 << PD6 );
17
    }
18
 
19
  
20
 
21
    if ( !(PIND & (1<<PIND4)) )
22
    {
23
    PORTD &= ~( 1 << PD6);   
24
    } 
25
  }
26
}

So leuchtet die LED einfach nur. Egal ob ich was drücke oder nicht.
Wenn ich allerdings "DDRD &= ~( 1 << DDD4);" weg lasse. Funktioniert das 
ganze einwandfrei... Jetzt bin ich ehrlich gesagt verwirrt. Wie kann 
etwas eingelesen werden, obwohl ich den PORT gar nicht als Eingang 
geschaltet hab. Im Angang der Aufbau btw
Angehängte Dateien:
Gast #1815952
Lesenswert?

Dann sollte statt der beiden obigen include Zeilen nur die folgende da 
stehen:
1
#include <avr/io.h>

Und um Peters Bemerkung aufzugreifen:
1
    // DDRD = 0xff; 
2
    // DDRD &= ~( 1 << DDD4);      //PORT4 als Eingang
3
    DDRD = 1 << DDD6;      // Pin 6 am Port D als Ausgang
Gast #1815965
Lesenswert?

und vorallem warum funktioniert das ganze wenn ich alle pins als 
ausgänge definier? das ergibt irgendwie wenig sinn für mich ich dachte 
der kann nur was einlesen wenn ich das als eingagn definiert hab. oder 
kanns sein dass ich beim löten irgendwie mist gebaut hab? bisher hat 
aber alles wunderbar funktioniert.
Gast #1815994
Lesenswert?

jrraid schrieb:
> und vorallem warum funktioniert das ganze wenn ich alle pins als
> ausgänge definier?

Schlechte Idee, das verursacht bei Tasterdruck einen Kurzschluß!
Vermutlich wird der AVR dabei dann resetet.

> oder kanns sein dass ich beim löten irgendwie mist gebaut hab?

Wäre möglich.

> eigentlich sollte der code aber funktionieren so wie er da steht oder ?

Eigentlich ja.

Versuch doch mal den C18 mit einem Stück Draht zu überbrücken. Geht die 
LED dann aus?
Gast #1816009
Lesenswert?

jrraid schrieb:
> und vorallem warum funktioniert das ganze wenn ich alle pins als
> ausgänge definier?

Dann fehlt der Pull-Up oder (eher) Pull-down und Du bekommst einen 
definierten Ruhezustand nur, wenn Du den Pin als Ausgang schaltest (und 
den entgegengesetzten Zustand durch einen Kurzschluss über den Taster).

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