Forum: Compiler & IDEs Atmel Evalutionsboard- Probleme beim Schalten der LED


von Dominik B. (domib)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

Wie bereits im Betreff beschrieben habe ich ein Problem beim schalten 
der LEDS auf dem Atmel Board. Kurz vorweg, das AVR-GCC Tutorial habe ich 
bereits durchgelesen, zwar noch nicht komplett, aber eben bis zu der 
Stelle, an der ich dachte ich versuchen mal "learning by doing". Das 
Tutorial ist sehr gut aufgebaut, und eigentlich dachte ich auch ich 
hätte es verstanden. Nun irgendwie scheitert es aber bei der Umsetzung, 
und jetzt nach dem 3. Tag ohne sichtbare Erfolge hat wende ich mich doch 
mal an euch.

Es handelt sich hierbei einfach nur um ein reines Übungsprogramm, mit 
dem ich die Sachen einfach noch einmal praktisch anwenden wollte.

Wie oben im C-Code vermerkt wollte ich mit dem Taster T1 der an PD2 ( 
ATMEGA 32) hängt die LED1 am PORTD PD5 ein und aus schalten. Also erstes 
tasten LED an, weiteres tasten LED aus.

Mein Problem ist, das sich dich LED sofort an ist, und sich nicht 
ausschalten lässt.
Programmiert wird auf der VM unter WIN XP mit AVR-Studio 4 und 
Pony-Prog.

Da es mein erster Beitrag ist, kurz zu mir was:
Name sollte ja klar sein :-), 22 Jahre alt (jung?!), und komme aus dem 
Raum Nürnberg. Ich mache zur Zeit meinen Techniker, ab dem nächsten 
Semester mit der Fachrichtung Datenverarbeitung und wollte eben etwas 
vorarbeiten.

Bin für jeden Tipp dankbar.


Schönen Abend noch,

Dominik

von Karl H. (kbuchegg)


Lesenswert?

Dominik Bauer schrieb:


> Mein Problem ist, das sich dich LED sofort an ist, und sich nicht
> ausschalten lässt.

Dann musst du noch mal deine Verkabelung durchschauen oder überprüfen ob 
du auch das richtige Hex-File in den µC brennst.

Dein Programm hier in einen Mega16 (ist kompatibel zu einem Mega32) 
gebrannt macht genau das, was du programmierst hast. Die LED wird beim 
niederdrücken geschaltet und beim Loslassen wieder zurückgeschaltet.

von Dominik B. (domib)


Lesenswert?

Hallo,
Danke schon mal für die Hilfe.

Verkabelung passt, habe heute beide LEDS angesteuert und dauerhaft 
angeschaltet, daher sollte soweit alles ok sein.

Vielleicht habe ich mich etwas zu doof ausgedrückt :-)
Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht 
die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt 
wird.
Das ganze wollte ich mit Hilfe der Variable iT1 machen, darum setze und 
lösche ich diese in den if-Bedingungen.

Mfg.

Dominik

von Karl H. (kbuchegg)


Lesenswert?

Dominik Bauer schrieb:

> Vielleicht habe ich mich etwas zu doof ausgedrückt :-)
> Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht
> die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt
> wird.

Das ist aber etwas ganz anderes als du im Eröffnungsposting gesagt hast

> Mein Problem ist, das sich dich LED sofort an ist,
> und sich nicht ausschalten lässt.

denn diese Fehlerbeschreibgun trifft definitiv bei mir nicht zu. Solange 
ich die Taste drücke ist die LED auch aus (bzw an. je nachdem wie rum m 
an die LED ansteuert)


Wenn du etwas anderes willst, dann musst du das auch anders 
programmieren.
ZB dadurch, dass du beim Loslassen der Taste einfach mit der LED nichts 
tust anstelle von den Ausgang toggeln.

von Karl H. (kbuchegg)


Lesenswert?

Das Problem wird sein, dass dieser Kommentar hier
1
  if  ((PIND & (1<<PIND2)) && (iT1==0))    //Schalten von PD5 auf 1 wenn T1=0 und PIND2 high

im Grunde ein nichtssagender Kommentar ist (ganz abgesehen davon dass er 
falsch ist).
In diesem Kommentar sagst du nichts, was nicht auch im Code steht.
Schalten .... wenn t1=0 und PIND2 auf high.
Ja, gut. Das sehe ich aber auch im Code! Das ist nix neues. Da steht 
eindeutig

    if (  Pin_ist_high  &&  t1_ist_0 )

das ist genau dasselbe was auch der Kommentar sagt, nur halt in C 
Schreibweise.

Aber: Was genau bedeutet es denn wenn t1 auf 0 ist? Das hast du nicht 
geschrieben. Und wenn du dir klar machst, was das eigentlich bedeutet, 
dann ist auch die Lösung schon nahe bzw. klar warum im gegenteiligen 
Fall (im anderen if) eben mit der LED nichts zu tun ist.

Dieses t1 hat eine Bedeutung! Und darüber musst du dir im klaren sein, 
was die ist (und die Variable entsprechend ihrer Bedeutung benennen)

von Dominik B. (domib)


Lesenswert?

Hm, ok, anscheinend doch noch nicht so verstanden.

Also mit der Abfrage
if  ((PIND & (1<<PIND2))
überprüfe ich ob am PIND2 eine 1 anliegt, also der Taster der dort 
angeschlossen wird gedrückt wird, stimmt das noch so weit?
und mit der zusätzliche UND Verknüpfung mit iT1 wollte ich bezwecken das 
eben nur wenn eine 1 anliegt der Ausgange gesetzt wird. Daher setzte ich 
die Variable auch in der unteren if Abfragung wieder auf 0.

Wenn T1 auf 0 ist, heißt das auch am Eingang des Atmega eine 0 anliegt. 
das wollte ich eben mit der Abfrage
if  (((PIND & (1<<PIND2))==0x00) überprüfen. Und da die Variable iT1 
beim Einschalten eben auf 1 gesetzt wird, verknüpfe ich diese hier noch 
mit einem UND.

EDIT: Achso, ja klar, wenn t1 auf 0 ist soll ja eigentlich gar nix 
passiern. sondern eben erst wenn er das nächste mal wieder eine 1 
bekommt soll getoggelt werden.


Wie gesagt, kann sein das ich hier total falsch liege, ist mein erstes 
Übungsprogramm.

Vielen Dank

von Karl H. (kbuchegg)


Lesenswert?

Dominik Bauer schrieb:
> Hm, ok, anscheinend doch noch nicht so verstanden.
>
> Also mit der Abfrage
> if  ((PIND & (1<<PIND2))
> überprüfe ich ob am PIND2 eine 1 anliegt, also der Taster der dort

Du denkst schon in viel zu vielen Details

Dein Programm sieht so aus


   if(   Taste ist gedrückt   &&
         Taste war vorher nicht gedrückt )
   {
       // Jemand muss die Taste niedergedrückt haben

       Led Umschalten

       Merken, dass die Taste jetzt gedrückt ist, damit
       beim nächsten Mal abfragen dieser Zweig nicht
       wieder betreten wird, weil es ja keine Veränderung
       im Zustand der Taste gab, wenn die Taste auch weiterhin
       gedrückt bleibt
   }

   if(   Taste is nicht gedrückt   &&
         Taste war vorher gedrückt )
   {
      // DIe Taste ist wieder losgelassen worden


      Merken dass die Taste jetzt nicht gedrückt ist, damit
      beim nächsten Niederdrücken der Taste der Tastendruck
      durch Vergleich das aktuell vorliegenden Tastenzustands
      mit dem vorhergehenden Zustand der Vorgang des Niederdrückens
      selbder festgestellt werden kann
   }



Du willst durch regelmässiges Nachsehen am Eingang feststellen, ob in 
der Zwischenzeit seit dem letzten Nachsehen die Taste ihren Zustand 
(gedrückt / nichtgedrückt) verändert(!) hat!

Das ist die Bedeutung von t1: Darüber Buch zu führen, wie der 
Tastenzustand war als du das letzte mal nachgesehen hast. Nur dann wenn 
dieser Zustand nicht mehr mit dem aktuellen Zustand übereinstimmt, dann 
machst du möglicherweise eine Aktion. Je nachdem ob du feststellst, dass 
dir deine Werte das Niederdrücken oder das Loslassen der Taste anzeigen 
und ja nachdem ob dafür eine Aktion vorgesehen ist. Aber um eines kommst 
du nicht rum: Jede Taste die niedergedrückt wird, muss auch irgendwann 
wieder losgelassen werden. WEnn du daher in beiden Fällen eine Aktino 
machst, wobei das eine das Gegenteil vom anderen bewirkt, dann landest 
du automatisch am Ende nach einem Tastendruck wieder im Urzustand, weil 
ja ein Tastendruck zwangsweise aus Niederdrücken und Loslassen besteht.


Wenn du ins Badezimmer reinschaust und das Licht ist aus, kannst du 
nichts weiter sagen als das das Licht aus ist.
SIehst du aber eine halbe Stunde später nach und dann brennt plötzlich 
das Licht, dann muss irgendwer in der Zwischenzeit das Licht 
eingeschaltet haben.
Beim nächsten Nachsehen brennt das Licht immer noch, ergo hat sich in 
der Zwischenzeit nichts getan.
Bis dann beim 4.ten mal Nachsehen, das Licht wieder aus ist. Also muss 
es in der Zwischenzeit jemand ausgeschaltet haben.


Du willst nur bei jedem mal, wenn das Badezimmerlicht eingeschaltet 
wurde, eine Lampe im Wohnzimmer umschalten. Wenn das Badezimmerlicht 
ausgeschaltet wurde, lässt du das Wohnzimmerlicht in Ruhe. Folge: 
Jedesmal wenn jemand im Badezimmer das Licht einschaltet, welchselt im 
Wohnzimmer das Licht seinen Zustand.

von citb (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht
>> die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt
>> wird.

Und da kommt dann sicher noch die Problematik "Entprellen" hinzu.

citb

von Dominik B. (domib)


Lesenswert?

Ok, das habe ich jetzt verstanden.--> Also Abfragen ob die Taste nicht 
gedrückt ist, und davor gedrückt wurde (über die Variable)
.

Nur wie frage ich ab ob die Taste nicht gedrückt ist.
if ((PIND & (0<<PIND2)) ??


Mfg,

Dominik

von Dominik B. (domib)


Lesenswert?

citb schrieb:
> Karl Heinz Buchegger schrieb:
>> Der Taster T1 soll als Schalter fungieren, also beim ersten drücken geht
>>> die LED1 an und bleibt solange an bis erneut der Taster T1 gedrückt
>>> wird.
>
> Und da kommt dann sicher noch die Problematik "Entprellen" hinzu.
>
> citb


Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die 
Internen Pull-Ups aktiviert worden sind?

von citb (Gast)


Lesenswert?

Dominik Bauer schrieb:
> Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die
> Internen Pull-Ups aktiviert worden sind?

Eher nicht, da treten je nach Schaltung boese Nebebeffekte auf.
Einfach mal die Forensuche bemuehen, es gab gerade letztens einen Thread 
dazu.


citb

von Dominik B. (domib)


Lesenswert?

citb schrieb:
> Dominik Bauer schrieb:
>> Langt es nicht wenn der Taster Hardware-technisch Entprellt ist, und die
>> Internen Pull-Ups aktiviert worden sind?
>
> Eher nicht, da treten je nach Schaltung boese Nebebeffekte auf.
> Einfach mal die Forensuche bemuehen, es gab gerade letztens einen Thread
> dazu.
>
>
> citb



Danke, werd ich machen :-) Jetzt aber erst mal die Feierabend Sonne 
genießen.

Mfg
Dominik

von Karl H. (kbuchegg)


Lesenswert?

Dominik Bauer schrieb:
> Ok, das habe ich jetzt verstanden.--> Also Abfragen ob die Taste nicht
> gedrückt ist, und davor gedrückt wurde (über die Variable)
> .
>
> Nur wie frage ich ab ob die Taste nicht gedrückt ist.
> if ((PIND & (0<<PIND2)) ??

No.

Eine 0 kannst du schieben bis du schwarz wirst, das bleibt immer 0.

  if( ! (PIND & (1<<PIND2) )

so wie du das auch sagst:
Es ist nicht der Fall, dass die Taste gedrückt ist :-)

von Dominik B. (domib)


Lesenswert?

Ok, ich habe das jetzt mal versucht umzusetzen. Code schaut nun 
folgendermaßen aus:

1
 
2
3
  if  ((PIND & (1<<PIND2)) && (iT1==0)) 
4
 //Taster gedrückt und davor nicht gedrückt
5
    {
6
    PORTD = PORTD ^ 0b00100000;    //schalten
7
8
          iT1=1;              
9
    }
10
11
12
  if  (!(PIND & (1<<PIND2)) && (iT1==1))
13
//Taster NICHT gedrückt und davor gedrückt 
14
    {
15
      iT1=0;            
16
  
17
    }


Vielleicht mal meine (falsche?!) Denkweiße dazu:

erste Abfrage: Wenn Taster gedrückt und er davor nich gedrückt war, 
setzt er den PORTD auf 0b00100000 und die Variable auf 1

Jemand lässt den Taster los, Somit ist die erste if-Bedingung nicht mehr 
erfüllt und er prüft die 2. Also Taster NICHT gedrückt, und da T1 auf 1 
steht war sie davor gedrückt --> demnach setzt er die Variable wieder 
auf 0. Somit kann das ganze von vorne beginneng, und da es XOR verknüpft 
wird, wird eben beim nächsten Tasten das ganze auf 0 gesetzt.

Wo ist mein Denkfehler?
Programm macht folgendes:
LED1 ist dauerhaft an. Demnach kann ja was mit der ersten abfrage ob ein 
Taster gedrückt ist oder nicht, nicht stimmen ? Oder der Taster schaltet 
nicht richtig auf meim Board. Habe aber gerade kein Messgerät zur Hand 
um das zu überprüfen.

Danke schon mal für die "Nachhilfe"

Dominik

von Karl H. (kbuchegg)


Lesenswert?

Dominik Bauer schrieb:


> Wo ist mein Denkfehler?

Nirgends

> Oder der Taster schaltet
> nicht richtig auf meim Board.

Oder er hängt an einem anderen Pin oder ....
Der Taster prellt wie Sau (dann würdest du es allerdings zumindest ab 
und zu flackern sehen) ....
Vielleicht ist aber auch die LED an einem ganz anderen Pin ....
oder ....

Und jetz weißt du auch, warum in den Tuorien immer mit noch einfacheren 
Programmen angefangen wird. Denn, damit man mit einem Taster eine LED 
bei Tastendruck gezielt ein/aus schalten kann, müssen vorher schone eine 
Menge anderer Dinge geklappt haben.

> Habe aber gerade kein Messgerät zur Hand
> um das zu überprüfen.

Das wäre gut, wenn du das tun würdest.
Noch besser wäre es, erst mal mit einem einfacheren Programm einfach nur 
zu überprüfen ob du zb die LED ansteuern kannst.

von Dominik B. (domib)


Lesenswert?

Hallo,

Ich denke ich hab den Fehler gefunden.

Wenn ich mit dem Messgerät direkt am PD2 messe, und den Taster nicht 
drücke, liegen bereits 2,7V an. Beim drücken des Tasters liegen dann 5V 
an.
Ich nehme an das die 2.7V im Ruhezustand bereits zu einem high Signal 
führen.

Anscheindend is das ein Fehler auf meim Board, da dieses Phänomen an 
allen drei Tastereingängen vorliegt.


Vielen Dank für die Hilfe!


Dominik

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.