if wegoptimiert?

Gast #461504
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)
Gast #461511
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
}

Gast #461527
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
Gast #461553
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.
#461948
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


Gast #462060
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
Angehängte Dateien:
#462079
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

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