Gast
#99962
Hallo,
ich habe da ein Problem, wo ich nicht weiter komme.
Folgender Programmauszug:
case 0:
{
sbi (PORTC,1);
sbi (PORTC,2);
cbi (PORTC,0);
PORTD = a |= ( PIND &= 0x80);
zaehler = 1;
break;
}
PortD als Ausgänge definiert.
Ich will den aktuellen Zustand der Ausgänge einlesen, ein Bit, das ich
nicht
verändern möchte , herausfiltern ( PORTD.7) und mit den Bits der
Variable a
logisch ODER verknüpfen.
Dabei soll das 7.Bit des Ausgangs seinen Zustand behalten.
Nur irgendwie habe ich einen Denkfehler.Somit habe ich mir den
Assemblercode
angeschaut, und etwas seltsames entdeckt.
Assembler Code ( Auschnitt);
27e: 02 97 sbiw r24, 0x02 ; 2
280: c9 f0 breq .+50 ; 0x2b4
282: 08 95 ret
284: a9 9a sbi 0x15, 1 ; 21
286: aa 9a sbi 0x15, 2 ; 21
288: a8 98 cbi 0x15, 0 ; 21
28a: 80 b3 in r24, 0x10 ; 16
28c: 80 78 andi r24, 0x80 ; 128
28e: 80 bb out 0x10, r24 ; 16
290: 80 b3 in r24, 0x10 ; 16
292: 82 2b or r24, r18
294: 82 bb out 0x12, r24 ; 18
296: 81 e0 ldi r24, 0x01 ; 1
298: 0a c0 rjmp .+20 ; 0x2ae
In Zeile 28a ließt er den Port ein,in 28c wird mit 0x80 UND verknüpft
und in
Zeile 28e auf PIND !!! ausgegeben, sowie in Zeile 290 von PIND wieder
eingelesen.
Doch laut Datenblatt ist PIND nur lesbar !?!
Darum müßte er in Zeile 290 den alten PIND Wert wieder einlesen.
Ehrlich gesagt, ich verstehe das nicht ganz.
Kann mir jemand mal das erklären ?
mit freundlichen Grüßen
Jogibär