Mathias hat geschrieben:Das Datenblatt ist bei Seite 442 fertig.
Gibt halt verschiedene Versionen. Die Register Summary ist da auch drin, ab Seite 428.
"When using the I/O specific commands IN and OUT, the I/O addresses 0x00 - 0x3F must be used. When addressing I/O Registers as data space using LD and ST instructions, 0x20 must be added
to these addresses..."
Der Hintergrund ist, dass Atmel ursprünglich für die Befehle "in" und "out" nur die Adressen 0..63 vorgesehen hat, weil das Befehlsspeicher spart (so wie auch adiw, sbiw oder ein ldd maximal 63 kann). Allerdings wurden es sehr schnell mehr als 64 in/out-Register, so dass man diese dann über ld / st wie den RAM ansprechen musste. Da allerdings auf den Adressen 0..31 die 32 Arbeitsregister liegen - ja, die kann man auch wie Ram ansprechen - durften die in / out Register erst ab Adresse 32 beginnen, was 0x20 entspricht. Daher die Verschiebung um 0x20, wenn man statt mit in / out mit ld / st auf die Ports zugreift.
Mathias hat geschrieben:Bei folgendem Code, motzt der Compiler
sbi PORTB, 0B00010000
Dein Port B hat 17 Pins? Impressive!
Bei sbi wird nicht die Bitmaske, sondern die Pinnummer angegeben, also: Setze Pin 4 in Port B => sbi PORTB, 4, gezählt von Null an. Mit google avr sbi kommt übrigens als erster Link die Seite, auf der der Befehl sbi erklärt wird. sbi PORTB, 4 geht ebenso wie sbi PORTB, 0B00000100. Natürlich nur, wenn PORTB definiert ist.