mikrocontroller.net

Forum: Compiler & IDEs if wegoptimiert?


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(1)
  {
    if ((PIND & (1<<PD3))>0)  //Taster an PD3 gedrückt?
    {
      uart_puts("PD3 gedrückt");
      PORTD|=(1<<PD5);
    }
    else
    {
    PORTD&=(!(1<<PD5));  
    PORTD|=(1<<PD5);  
    }
    
  
  }

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)

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Gruss

Michael

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
if(!(PIND & (1<<PD3))){
 //taste gedrueckt tu was
}else{
 // Taste nicht gedrueckt mach was anderes
}


Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

  

Autor: Dirk (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

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

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



Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

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

Autor: Walter (Gast)
Datum:

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

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

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

Autor: Peter Dannegger (peda)
Datum:

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

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.