www.mikrocontroller.net

Forum: Compiler & IDEs Wert PIN abfrage


Autor: Oliver S. (eragon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe folgende frage. Wen ich den Wert eines Eingangs auslesen 
will mach ich das ja über das Register PINx.

Bin aber über etwas gestolpert:

Wen ich die Abfrage so schreibe dan funktioniert das.
if ((PINC&0x04)==0)


So leider nicht.
if ((PINC&0x04)==1)

Pullups sind eingeschaltet. Taster ligt an Eingang und ist and GND 
angeschlossen.
Wieso hat er mit ==1 ein Problem?

switch(PINC&0x04)
{
    case 0:
    LED_1_on;

    case 1:
    LED_1_off;
}

Funktioniert wiederum.

Also sind och beide Werte vorhanden. Was hab ich da bei der IF abfrage 
nicht gescheckt?

Da PINC&0x04 ==> 1 oder 0 ist

(1 oder 0) == 1

Das muss doch in einem Fall true sein.

Danke für eure Hilfe.
Seh grad vor lauter Bäumen den Wald nicht mehr.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PINC&0x04 ergibt 0 und 4 und nicht 0 und 1 !!!
versuche mal das hier:
if ((PINC&0x04)==0x04)
...

Autor: Sven H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast hat es schon gesagt.

Anscheind hast Du die Operation an sich nicht verstanden.

& = bitweise und verknüpfung

Port c (z.b.) 00101100
      &
Maske 00000100


= 00000100 oder 0000000


In der Regel funktioniert auch folgendes:

if (PINC&0x04)
{

}


Da alles ungleich 0 wahr ist.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven H. wrote:
> In der Regel funktioniert auch folgendes:
>
> if (PINC&0x04)
> {
>
> }
Nicht nur "in der Regel". Es sollte in solchen Fällen grundsätzlich die 
"erzwungene" Auswertung als Wahrheitswert benutzt werden. Erstens 
erspart das Schreib- und Nachdenkarbeit, zweitens ist damit auch 
gewährleistet, dass es keine Schwulitäten mit der integer promotion 
gibt.

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> switch(PINC&0x04)
> {
>     case 0:
>     LED_1_on;
>
>     case 1:
>     LED_1_off;
> }

Kann mir nicht vorstellen, dass das so funktioniert. Mal abgesehen davon 
dass LED1_on/off hier keine Funktionen sondern Makros sind, sollte die 
LED mit diesem Code immer aus sein. Jeder case-Zweig muss mit einer 
'break'-Anweisung beendet werden, sonst rauscht dein Controller 
ungebremst in den nächsten Case-Zweig.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... wrote:
> Kann mir nicht vorstellen, dass das so funktioniert.
Stimmt, das kann so nicht funktionieren.

Autor: Oliver S. (eragon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also da hab ich was schönes angerichtet. Der Grund für meine frgae oben 
war: Ha ca. 1 jahr nix mehr programmiert. Und dan wollte das irgendwie 
nicht. Ihr habt natürlich recht. Switch-case ist schrott so.

Nun hab ich das Problem auch gefunden. Hab da aber noch ne frage: Ich 
hab das mit schönen Macros programmiert. Wie macht ihr das?


// LED 1
#define LED_1_port      PORTC
#define LED_1_ddr      DDRC
#define LED_1_bit      0

// Taster 1
#define taster_1_port      PORTC
#define taster_1_pin      PINC
#define taster_1_ddr      DDRC
#define taster_1_bit      2


#define LED_1_on      LED_1_port  &= ~_BV(LED_1_bit)
#define LED_1_off      LED_1_port  |=  _BV(LED_1_bit)


#define taster_1_get    (taster_1_pin   &   _BV(taster_1_bit))

Mit meiner Tasterabfrage erhalte ich einfach 0 oder 1,2,4,8,16.

Solange man das weis. Wusst ich leider nicht mehr. :)

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.