AVR Studio & gcc - Simulationsproblem

OP #664051
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?
#664240
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?!

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