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.
Alex schrieb: > state |= !getbit( PINB, PINB2 <<0); > state |= !getbit( PIND, PIND6 <<1); > state |= !getbit( PIND, PIND5) <<2; Welches von denen möchtest du tun? :-)
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).
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.
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.
1 | if ( !getbit( PIND, PIND6) ^ !!getbit( state, 1)){ |
Peter
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.
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.