Einfache Pin Überprüfung

Gast #1870335
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?
#1870369
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
Gast #1870659
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
Gast #1871615
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
#1871663
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

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