Forum: Mikrocontroller und Digitale Elektronik Taster auslesen.


von jrraid (Gast)


Angehängte Dateien:

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

von ... (Gast)


Lesenswert?

Was für einen AVR benutzt Du denn? Und welche Toolchain?

Das hier:
1
#include <io.h>
2
#include <iom32.h>
sieht jedenfalls etwas daneben aus.

von Peter D. (peda)


Lesenswert?

Ach das Pollin-Board. Löte mal C18 aus, dann gehts besser.

Und man definiert Eingänge nicht erst als Ausgänge.
Man läßt sie Eingänge, sonst kanns nen Kurzschluß geben.


Peter

von jrraid (Gast)


Lesenswert?

Ich benutz nen Atmega32 und gnu gcc

von ... (Gast)


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

von jrraid (Gast)


Lesenswert?

ok hab ich alles gemacht :)
(bis auf den C18 rausgelötet)
die LED leuchtet aber einfach nur. beim tastendruck passiert gar nix.
eigentlich sollte der code aber funktionieren so wie er da steht oder ?

von jrraid (Gast)


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.

von ... (Gast)


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?

von misch (Gast)


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).

von jrraid (Gast)


Lesenswert?

jetzt gehts vielen danke.
und zwar hatte ich noch n display dran. hab irgendwie net erwartet dass 
das probleme macht ^^. anfänger fehler halt.

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.