Forum: Mikrocontroller und Digitale Elektronik Taster funktioniert nicht obwohl Simulation richtig abläuft


von Stefan F. (stefan1987)


Lesenswert?

Hallo

bin ein Neuling was C Programmierung von Atmels angeht, hab davor in 
Assembler programmiert.
Jetzt hab ich folgendes Problem: Eine LED soll bei Tastendruck 
angeschaltet werden, der µC reagiert aber nicht auf Tastendruck und die 
LED ist dauerhaft an. Die Simulation in AVR studio funktioniert jedoch 
einwandfrei.
Die anderen Beiträge hab ich schon gelesen und auch die Vorschläge 
getestet aber immer wieder das gleiche Problem;

Setup AtMEGA 32
Taster an PORT A gegen GND
LEDS an PORT C gegen GND

hier nun mein Source:
1
#define F_CPU 16000000
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
int main (void)
7
{
8
  DDRC = 0xFF;  //Port C als Ausgang
9
  PORTC = 0x00;  //Alles Leds aus an C
10
  DDRA = 0x00;;  //PORT A als Eingang
11
  PORTA = 0xFF;  //Pull Up's an Port A aktiviert
12
13
  while (1)
14
  {
15
    if (!(PINA & (1<<PINA3)))  //Taster an A3 gedrückt  (PIN A3 low)
16
    {
17
      PORTC = (1<<PC5);    //wenn Taster gedrückt LED an P5 an
18
    }
19
  }
20
}
Ich hoffe jemand hat ein Tipp für mich.
Vielen dank schonmal

Viele Grüße
Stefan

von Bond (Gast)


Lesenswert?

Miß mit einem Multimeter ob das Taster-Signal
auch am µP-Pin ankommt. Ist es der gleiche Pin
wie in der Simulation?

Es gibt Taster, die einen Mindeststrom benötigen.

von Mark X. (lechuck_ger)


Lesenswert?

mindeststrom bei einem mechanischem Taster ?!?!?

von Stefan F. (stefan1987)


Lesenswert?

Bond schrieb:
> Miß mit einem Multimeter ob das Taster-Signal
> auch am µP-Pin ankommt. Ist es der gleiche Pin
> wie in der Simulation?
>
> Es gibt Taster, die einen Mindeststrom benötigen.


Mit der Hardware sollte soweit alles ok sein. Wenn ich das Programm mit 
Assembler schreib funktioniert ja auch alles.
Habs aber trozdem nochmal nachgemessen, ist der Taster nicht gedrückt so 
ist der PortPin auf High (wegen interenen Pullups) und wenn der Taster 
gedrückt ist geht der Pin nach Low .
Also so wie es sein sollte.

von Peter D. (peda)


Lesenswert?

Eingänge werden mit dem CPU-Takt gelatcht, d.h. um einen Takt verzögert.
Du liest also den Pinzustand vor dem Einschalten des Pullup.

Außerdem muß der Pullup erst die Schaltungskapazität aufladen.


Peter

von David R. (Gast)


Lesenswert?

Du schreibst selber in einem Kommentar
> //wenn Taster gedrückt LED an P5 an
Ich sehe aber nirgends wo den Kommentar "wenn Taster nicht gedrückt, LED 
aus"....

Zum low schalten des Pins musst du aber das entsprechende Bit im 
Register wieder Löschen.
Probiere es mal mit:
1
if (!(PINA & (1<<PINA3)))  //Taster an A3 gedrückt  (PIN A3 low)
2
{
3
      PORTC = (1<<PC5);    //wenn Taster gedrückt LED an P5 an
4
}
5
else 
6
{
7
PORTC = 0x00;   //!!! LED ausschalten
8
}

lg, david

von Stefan F. (stefan1987)


Lesenswert?

Peter Dannegger schrieb:
> Eingänge werden mit dem CPU-Takt gelatcht, d.h. um einen Takt verzögert.
> Du liest also den Pinzustand vor dem Einschalten des Pullup.
>
> Außerdem muß der Pullup erst die Schaltungskapazität aufladen.
>
>
> Peter


Danke das war der entscheidende Tip. Mit einem Delay vor dem while 
funktioniert nun alles.

@David R.

Danke für die Antwort, wollt erstmal nur schauen ob sich bei einem 
Tastendruck überhaupt was rührt.


Danke an alle für die schnelle Hilfe :)

Grüße
Stefan

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.