Forum: Compiler & IDEs AVR Studio & gcc - Simulationsproblem


von Christoph H. (hurrican)


Lesenswert?

Hallo,

ich habe mit avr-gcc (WINAVR-20070525) im Studio (v4.13) ein Programm 
geschrieben was u.a. zwei Eingänge abfragt, ob diese NICHT gesetzt sind. 
Die EIngänge sind mit Pull-Up (PORTD=0x40, PORTB=0x01).
1
 if (!(PORTD & (1<<PD6)) && !(PORTB & (1<<PB0)))
2
{
3
...
4
}
Das Problem ist, dass bei der Simulation diese Abfrage immwer false 
ergibt, wenn die Eingänge low sind. Wenn ich aber schreibe
1
 if ((PORTD & (1<<PD6)) && (PORTB & (1<<PB0)))
2
{
3
...
4
}
um abzufragen, ob diese gesetzt sind, funktionierts (wenn sie auch 
gesetzt sind:).
Seltsamerweise ist auch der Assemblercode richtig. Hier mal ein 
Ausschnitt aus dem list-File:
1
if (!(PORTD & (1<<PD6)) && !(PORTB & (1<<PB0)))      //(!INPUT1 && !INPUT2)                          
2
 522:  96 9b         sbic  0x12, 6  ; 18
3
 524:  1e c0         rjmp  .+60       ; 0x562 <main+0xac>
4
 526:  c0 9b         sbic  0x18, 0  ; 24
5
 528:  1c c0         rjmp  .+56       ; 0x562 <main+0xac>
6
....//hier gehts dann weiter, wenn die Eingänge nicht gesetzt sind
7
{
nur in der Simulation funktionierts nicht.

Was mach ich da falsch? Was macht AVR-Studio/gcc falsch?

von Karl H. (kbuchegg)


Lesenswert?

Ich schätze mal du hast den De Morgan ausser acht gelassen

  ! ( a && b )   <==>   !a || !b

von Philipp B. (philipp_burch)


Lesenswert?

Hm, du redest von Eingängen, liest aber die PORTx-Register aus. Solltest 
du nicht eher von PINx lesen?

Mit Code in #defines solltest du übrigens sehr vorsichtig sein, da du 
dem Compiler damit Code zuschiebst, den du so nicht geschrieben hast. 
Ich sag' nur
1
#define sum a+b
2
if (sum * 3 == 9) {...}

Jedenfalls fehlt bei deinen Makros schonmal je eine schliessende 
Klammer.

@Peter:

Ich sehe nicht ganz, was du damit sagen willst, der Code ist doch sonst 
richtig.


EDIT: Was ist denn hier passiert, da war doch eben noch ein zweiter 
Beitrag von Christoph?!

von Christoph H. (hurrican)


Lesenswert?

Ok, das Problem hat sich gelöst.
Hab den guten alten Anfängerfehler gemacht und die Ports und nicht die 
Pins abgefragt:)

Trotzdem DANKE

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
Noch kein Account? Hier anmelden.