Forum: Compiler & IDEs if wegoptimiert?


von Dirk (Gast)


Lesenswert?

Hallo, ich hab hier ein paar Probleme..

Und zwar will ich etwas über Uart an den Rechner senden, wenn eine Taste 
gedrückt wird.

Das Senden ist auch kein Problem...

So funktioniert das ganze z.B. wunderbar:
1
while(1)
2
  {
3
    if ((PIND & (1<<PD3))>0)  //Taster an PD3 gedrückt?
4
    {
5
      uart_puts("PD3 gedrückt");
6
      PORTD|=(1<<PD5);
7
    }
8
    else
9
    {
10
    PORTD&=(!(1<<PD5));  
11
    PORTD|=(1<<PD5);  
12
    }
13
    
14
  
15
  }

Lass ich den else-Block aber weg oder leer, wird "PD3 gedrückt" immer 
gesendet. Egal ob der Taster gedrückt wird oder nicht.

Wird das if wegoptimiert???

Ich benutze das AVR-Studio mit GCC (vers 3.4.6 ? )
(optimierungseinstellung -Os oder -O0 macht keinen Unterschied)

von mr.chip (Gast)


Lesenswert?

Hallo

Externe Pullups bzw. in deinem Fall eher Pulldowns angeschlossen? 
Interne Pullups aktiviert?

Gruss

Michael

von Dirk (Gast)


Lesenswert?

Hallo,

>if ((PIND & (1<<PD3))>0)  //Taster an PD3 gedrückt?

Was soll diese Abfrage bezwecken?

Wie ist deine Taste an den Mikrocontroller angeklemmt ? Hast du den 
Taster einfach an den I/O Pin und an GND? Ja, dann sollte die Abfrage 
eher so ausehen.
1
if(!(PIND & (1<<PD3))){
2
 //taste gedrueckt tu was
3
}else{
4
 // Taste nicht gedrueckt mach was anderes
5
}


von FBI (Gast)


Lesenswert?

Hi,

die Zeile (im else-Block)
1
PORTD&=(!(1<<PD5));
ist auch ein typischer Fehler!
sollte wohl eher so sein:
1
PORTD &= ~(1<<PD5);

  

von Dirk (Gast)


Lesenswert?

*sich die Vorschläge anhört und ins Grübeln kommt.. dann pfeif *
Ich hab es voll verplant das der Taster bei Nichtbetätigung auf GND 
liegt, bei Betätigung auf +5V.

Deshalb muss der interne Pull UP natürlich nicht gesetzt werden (was ich 
getan hatte). Aber warum gibt es anscheinend Probleme wenn man ihn doch 
setzt?

---
..Das kommt davon wenn man sich seine Entwicklungsumgebung nicht selber 
designt, aber Änderung ist schon in der Produktion ;)

Vielen Dank für eure Anregungen!

Dirk

von Werner B. (Gast)


Lesenswert?

Weil der (hoffentlich vorhandene) Pulldown zusammen mit dem internen 
Pullup einen Spannungsteiler bildet. Dessen Teilerverhältnis liegt 
offenbar über der  Schaltschwelle.
Darum merke man sich: Taster möglichst immer nach GND schalten, dann 
treten solche Probleme nicht auf.

von Karl H. (kbuchegg)


Lesenswert?

> Ich hab es voll verplant das der Taster bei Nichtbetätigung auf GND
> liegt, bei Betätigung auf +5V.

BIst du dir da ganz sicher?

Üblich ist: Ein nichtbetätigter Taster lässt den Eingang offen.
Erst wenn der Taster betätigt wird, stellt er die Verbdindung
zu GND bzw. Vcc (je nach Verschaltung her).

Das würde das beobachtete Verhalten ganz zwnaglos erklären.
Ist dein Taster betätigt, so stellt der Taster die Verbindung
zu Vcc her. Ist der Taster nicht betätigt, so bleibt der
Eingang offen und der interne Pullup stellt die Verbindnug
zu Vcc her. Egal ob der Taster gedrückt ist oder nicht: Du
hast immer Vcc am Eingang. Entweder über den Taster oder
über den internen Pullup



von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

..ja, ich bin mir sicher, dass es so angeschlossen ist ;)

Und ja, ich finde es auch ungewöhnlich .. ich selbst mache es auch so 
wie Karl Heinz beschrieben hat.

Bei der Hardware die ich benutze handelt es sich allerdings um das 
Atmel-Evaluation Board v2 von Pollin..

Hab mal ein bild gebastelt..
So ist die Schaltung. Den internen PullUp hab ich jetzt mal mit 1k 
angenommen. Damit liegt der Pegel bei nicht Betätigung natürlich bei
5*33/34V (4,85V ;) ) was ja immer noch ziemlich High ist :)

Somit hat sich jetzt alles erledigt und ich blick wieder voll durch.

Merry Christmas

Dirk

von Walter (Gast)


Lesenswert?

hä, versteh ich nicht,
bei Nichtbetätigung 4,85V
bei Betätigung 5V
das ist doch nicht das was du willst, oder?

von Karl H. (kbuchegg)


Lesenswert?

> das ist doch nicht das was du willst, oder?

Ganz genau. Drum ist er auch letztendlich auf die
zündende Idee gekommen, den internen Pullup nicht
einzuschalten :-)

von Peter D. (peda)


Lesenswert?

Wenn die Schaltung stimmt, dann ist sie großer Mist.

Bei jedem Tastendruck reißt Du nämlich Deine VCC kurzzeitig auf 0V 
runter.

Ideal, um allerlei merkwürdiges Programmverhalten zu generieren.

Der 330nF hat da absolut nichts verloren, sofort raus damit !



Peter

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.