Hallo m.a.r.v.i.n,
das funktioniert nicht:
Code:
PORTB |= (1 << PB3); /* setzt Port B.3 auf HIGH */
PORTB &= (1 << PB3); /* setzt Port B.3 auf LOW */
Das ist das Assemblerlisting dazu:
Code:
PORTB |= (1 << PB3); /* setzt Port B.3 auf HIGH */
9a: c3 9a sbi 0x18, 3 ; 24
PORTB &= (1 << PB3); /* setzt Port B.3 auf LOW */
9c: 88 b3 in r24, 0x18 ; 24
9e: 88 70 andi r24, 0x08 ; 8
a0: 88 bb out 0x18, r24 ; 24
So ist es richtig:
Code:
PORTB |= (1 << PB3); /* setzt Port B.3 auf HIGH */
PORTB = (PINB & (~(1 << PB3))); /* setzt Port B.3 auf LOW */
Das Assemblerlisting dazu:
Code:
PORTB |= (1 << PB3); /* setzt Port B.3 auf HIGH */
9a: c3 9a sbi 0x18, 3 ; 24
PORTB = (PINB & (~(1 << PB3))); /* setzt Port B.3 auf LOW */
9c: 86 b3 in r24, 0x16 ; 22
9e: 87 7f andi r24, 0xF7 ; 247
a0: 88 bb out 0x18, r24 ; 24
Du musst das Pinregister lesen und den geänderten Wert zum Portregister schreiben!
Oder du benutzt zum Setzen und Rücksetzen der Bits gleich die alten GCC-Macros:
Code:
#define sbi(p,b) p|=(1<<(b))
#define cbi(p,b) p&=(~(1<<(b)))
sbi( PORTB, PB3 ); // setze bit3 portb
cbi( PORTB, PB3 ); // rücksetze bit3 portb
Ronny10
Lesezeichen