mikrocontroller.net

Forum: Compiler & IDEs Einfache Pin Überprüfung


Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
while (1)
{
  LedSet(1);
  while (PIND & (1<<PD5)
  {
    LedSet(0); //LED aus
  }
  while (!(PIND & (1<<PD5))
  {
    LedSet(1); //LED an
  }
}

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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...
http://www.mikrocontroller.net/articles/AVR-Tutori...

MfG
Falk

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei beiden while Bedingungen machst du eine Klammer mehr auf, als zu ...

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Malte (Gast)

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

Glaub ich nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Mit Sicherheit nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.