mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik eigentlich trivial


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, komme einfach nicht weiter. Möchte zustand von Pins abfragen und 
beim Wechsel über RS232 zum Rechner melden.

    if ( !getbit( PINB, PINB2) ^ getbit( state, 0)){
      uart_puts( !getbit( PINB, PINB2)? "P1:HI":"P1:LO");
      clearbit( state, 0);
      state |= !getbit( PINB, PINB2 <<0);
      uart_puts_P( NL);
    }
    if ( !getbit( PIND, PIND6) ^ getbit( state, 1)){
      uart_puts( !getbit( PIND, PIND6)? "P2:HI":"P2:LO");
      clearbit( state, 1);
      state |= !getbit( PIND, PIND6 <<1);
      uart_puts( getbit( state, 1)? " 1":" 0");
      uart_puts_P( NL);
    }
    if ( !getbit( PIND, PIND5) ^ getbit( state, 2)){
      uart_puts( !getbit( PIND, PIND5)? "P3:HI":"P3:LO");
      clearbit( state, 2);
      state |= !getbit( PIND, PIND5) <<2;
      uart_puts_P( NL);

Der Pin B2 funktioniert einwandfrei, doch die anderen laufen jedes mal 
in die if Bedienung und senden immer mehrmals das der Pin auf HI ist.
Die Variable state ist global angelegt, makros sind wie folgt definiert:

#define   clearbit(ADR,BIT) (ADR&=~(1<<BIT))
#define   getbit(ADR, BIT)  (ADR & (1<<BIT))

Mir scheint es so als ob die if Anweisung nicht korrekt ist.

Danke im Voraus.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> state |= !getbit( PINB, PINB2 <<0);

> state |= !getbit( PIND, PIND6 <<1);

> state |= !getbit( PIND, PIND5) <<2;

Welches von denen möchtest du tun?
:-)

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peinlich, ist die folge von langem herumprobieren. So ist es theoretisch 
richtig:

    if ( !getbit( PINB, PINB2) ^ getbit( state, 0)){
      uart_puts( !getbit( PINB, PINB2)? "P1:HI":"P1:LO");
      clearbit( state, 0);
      state |= !getbit( PINB, PINB2) <<0;
      uart_puts_P( NL);
    }
    if ( !getbit( PIND, PIND6) ^ getbit( state, 1)){
      uart_puts( !getbit( PIND, PIND6)? "P2:HI":"P2:LO");
      clearbit( state, 1);
      state |= !getbit( PIND, PIND6) <<1;
      uart_puts( getbit( state, 1)? " 1":" 0");
      uart_puts_P( NL);
    }
    if ( !getbit( PIND, PIND5) ^ getbit( state, 2)){
      uart_puts( !getbit( PIND, PIND5)? "P3:HI":"P3:LO");
      clearbit( state, 2);
      state |= !getbit( PIND, PIND5) <<2;
      uart_puts_P( NL);
    }

Funktioniert aber trotzdem nicht. Die erste if Anweisung tut so wie 
erwartet, die folgenden senden immer Px:HI wenn der Pin auf lo geht( 
wegen optokopler wird invertiert).

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> Funktioniert aber trotzdem nicht.

Dann reduzier dein Problem.
Die erste lässt du mal, die dritte kommentierst du aus.
Die zweite veränderst du (ist sowieso um eine Zeile länger als die 
anderen?), bis sie läuft.
Wenn das getan ist, kommt die dritte Abfrage wieder rein.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> if ( !getbit( PIND, PIND6) ^ getbit( state, 1)){

Wenn Du ein logisches EXOR willst, mußt Du dafür sorgen, daß die 
Ausdrückke immer 0 oder 1 sind.
  if ( !getbit( PIND, PIND6) ^ !!getbit( state, 1)){


Peter

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt sind alle gleich. Geht trotzdem nicht wie erwartet, sendet immer 
wieder das der P2 HI ist, hört aber auf sobald wider der Pin auf LO 
geht.

state ist uint8_t und global.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Boolesche xor ist das "!="
Wie wärs damit?
So ein unfug. Binäre und boolesche Operatoren zu kreuzen. Entweder alles 
binär, oder alles bool. Zumal der wert "True" nicht definiert ist und 
viel mehr als "nicht Null" zu werten ist(2 ist ebenfalls True, genauso 
wie 234- nur 0 ist false). Wenn man damit bitweise opereriert... pffff. 
Undefiniert^3. (Hoch, kein Xor ;-)
Eigentlich Trivial wäre es gewesen sich ordentlich zu informieren ;-)
Beschreibungen über Logische und binäre Operatoren von C(++) gibt es wie 
Sand am Meehr.

MFG

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft !!! Peter hat recht! Wusste ich doch da da was an der if Anweisung 
nicht stimmt.

Verstehe aber trotzdem nicht der getbit liefert doch ein boolisches 
wert?

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

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
> Läuft !!! Peter hat recht! Wusste ich doch da da was an der if Anweisung
> nicht stimmt.
>
> Verstehe aber trotzdem nicht der getbit liefert doch ein boolisches
> wert?

Das weiß hier keiner, weil keiner dein getbit kennt.
Und im übrigen frägst du mir etwas zu viel die PIN Bits ab. Genügend 
Pech vorausgesetzt, ändert sich hier

    if ( !getbit( PIND, PIND5) ^ getbit( state, 2)){
      uart_puts( !getbit( PIND, PIND5)? "P3:HI":"P3:LO");
      clearbit( state, 2);
      state |= !getbit( PIND, PIND5) <<2;
      uart_puts_P( NL);
    }

vom ersten getbit( PIND, PIND5 ) bis zum letzten getbit( PIND, PIND5 ) 
der Pin Zustand und du registrierst etwas falsches für den nächsten 
Vergleichsdurchgang.

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.