Forum: Compiler & IDEs Einfache Pin Überprüfung


von Malte (Gast)


Lesenswert?

Hallo, ich habe irgendwie noch ein paar Probleme mir das vorzustellen, 
wie genau die Pinabfrage funktioniert und mir deshalb einfach mal ein 
paar Textprogramme geschrieben und geguckt was passiert.
Von außen habe ich einen Pin (PD5) vom ATMega8 den ich auf VCC/GND 
schalte und mit einer Funktion schalte ich eine LED an und aus.

Jetzt wollte ich ein simples Programm schreiben, dass wenn PD5 auf VCC 
liegt die LED leuchten lässt und wenn es auf GND gezogen wird wieder 
ausschaltet.
1
while (1)
2
{
3
  LedSet(1);
4
  while (PIND & (1<<PD5)
5
  {
6
    LedSet(0); //LED aus
7
  }
8
  while (!(PIND & (1<<PD5))
9
  {
10
    LedSet(1); //LED an
11
  }
12
}

Der Grund wieso ich gleich while und nicht if nehme ist, weil ich später 
auf bestimmte Pinstellungen warten möchte und dazu sowieso auf eine 
leere while Schleife zurückgreifen will.
Die Funktion LedSet() macht nicht mehr als den Pin an dem die LED sitzt 
zu wechseln. Ich habe es nur so gemacht damit es etwas übersichtlicher 
ist.

Die Bedingungen selbst sind praktisch aus dem Internet übernommen :D

Wenn ich jetzt PD5 auf VCC ziehe geht die LED an. Wenn ich auf GND ziehe 
wieder aus, so weit so gut. Damit sie aber danach wieder angeht muss ich 
sie erst wieder auf VCC ziehen, dann wieder GND und wenn ich sie dann 
wieder auf VCC ziehe geht sie an.

Kann mir jemand erklären, wieso es nicht direkt umschaltet?

von Falk B. (falk)


Lesenswert?

@Malte (Gast)

>Der Grund wieso ich gleich while und nicht if nehme ist, weil ich später
>auf bestimmte Pinstellungen warten möchte und dazu sowieso auf eine
>leere while Schleife zurückgreifen will.

Sowas macht man aber nicht wirklich, bestenfalls in GANZ EINFACHEN 
Programmen. Tasten müssen entprellt werden, entweder in Software oder 
Hardware, siehe Entprellung.

>Kann mir jemand erklären, wieso es nicht direkt umschaltet?

Warum sollte sie? Das Problem ist dein Pin PD5. Wenn das per Umschalter 
einmal auf 0V gezigen wurde, dann bleibt das auch ein Weile dort, auch 
wenn der Umschalter öffnet. Erst ein aktives Umladen auf VCC änder die 
Spannung am Pin, das wie ein kleiner Kondesator seine Spannung halten 
kann. Das ändert sich, wenn man eine Taste + Pull Up Wiederstand nutzt, 
siehe

http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Hardware
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand

MfG
Falk

von Malte (Gast)


Lesenswert?

Danke für die Antwort, aber ich arbeite nicht mit einem Taster :D

Das mit dem Entprellen finde ich interessant, aber ist hier wohl nicht 
nötig. Das Signal kommt von einem anderen avr über ein Flachbandkabel 
und sollte deshalb direkt schalten.


Das würde sonst mein Problem auch nicht richtig erklären.
Ich stelle es nochmal schematisch dar:

PD5 - LED:
gnd - aus
vcc - an
gnd - aus
vcc - aus
gnd - aus
vcc - an

Und in dem cyclus wiederholt es sich.


Also am Programmcode scheints ja wohl nicht zu liegen, dann muss ich mal 
weitersuchen :D

von AVerr (Gast)


Lesenswert?

Bei beiden while Bedingungen machst du eine Klammer mehr auf, als zu ...

von Armin (Gast)


Lesenswert?

Malte schrieb:
> Also am Programmcode scheints ja wohl nicht zu liegen, dann muss ich mal
> weitersuchen :D

Wenn ich eins gelernt habe, dann dass es zu 99,9% am Programmcode liegt, 
egal wie komisch der Fehler ist.

von Peter D. (peda)


Lesenswert?

Laß erstmal den Unsinn mit dem floatenden Pin sein!
Das ist verboten.
Nimm nen Taster gegen GND und nen Pullup (z.B. 4,7k).

Und dann erklär nochmal, was rauskommen soll und was anstelle passiert.


Peter

von Malte (Gast)


Lesenswert?

Ich habe keinen Taster.
Ich habe wie gesagt nur 2 avr mit selber Stromversorgung.

Von dem einen kommt ein Signal raus, der andere soll es auslesen und die 
LED zum Blinken bringen.
D.h. ich habe immer 0V oder 5V. Das ganze habe ich mit einem Messgerät 
auch schon nachgemessen.


Danke an AVerr, genau da lag der Fehler :D
Ich kenn es von meinen Programmierkenntnissen, das so ein fehlerhafter 
Programm gar nicht erst compiliert wird, deshalb bin ich gar nicht 
darauf gekommen das nachzugucken. In Zukunft werd ich besser darauf 
achten :D

von Falk B. (falk)


Lesenswert?

@  AVerr (Gast)

>Bei beiden while Bedingungen machst du eine Klammer mehr auf, als zu ...

Stimmt, aber das schluckt der Compiler nicht.

>Danke an AVerr, genau da lag der Fehler :D

Bitte? Wie hast du denn dein Programm getestet, wenn der Compiler es 
nicht compiliert? Einfach die Fehlermeldung ignoriert und ein altes, 
sich nie änderndes Hexfile in den AVR geschrieben? Ich ahne Schlimmes.

MfG
Falk

von Malte (Gast)


Lesenswert?

Nein, der Compiler hat mir nichts gesagt (AVR Studio 4.18).
Er hat es wohl einfach irgendwie compiliert. Hat mich ja auch gewundert 
:D

von Falk B. (falk)


Lesenswert?

@  Malte (Gast)

>Nein, der Compiler hat mir nichts gesagt (AVR Studio 4.18).

Glaub ich nicht.

von Karl H. (kbuchegg)


Lesenswert?

Malte schrieb:
> Nein, der Compiler hat mir nichts gesagt (AVR Studio 4.18).

Mit Sicherheit nicht.

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.