Hallo miteinander,
gene beantworte ich die aufgetauchten Fragen.
- warum?
Ich habe mir ein Monitor-Programm entwickelt, welches zum bring-up
bisher gute Dienste geleistet hat. All die üblichen Kommandos
funktionieren schon (flash read, eeprom read/write/fill, register
read,...). Nur das register write will nicht.
- was geht nicht?
Der Werte [data] landet nicht in dem gewünschten Register. Wenn ich das
Register mit meiner Funktion wieder auslese, steht nicht der Wert drin,
bzw. die Ausgänge ändern Ihren Status nicht. Die Lesefunktion ist OK, da
ich Port-Pins korrekt einlesen kann, wenn ich z.B. das externe Signal
ändere.
- welche Register?
Eigentlich alle. Die CPU-Register 0x0 - 0x1F sind sicherlich nicht von
großem Interesse. Jedoch der restliche Bereich schon.
Gerne mache ich auch eine Fallunterscheidung in Abhängigkeit der
gewünschten Adresse, wenn man unterschiedliche Registerbereiche
unterschiedlich behandeln muss.
Im Preliminary data-sheet des 644P (Seite 417, Fußnote 4) steht:
When using the I/O specific commands IN and OUT, the I/O addresses $00 -
$3F must be used. When addressing I/O registers
as data space using LD and ST instructions, $20 must be added to these
addresses. The ATmega164P/324P/644P is a
complex microcontroller with more peripheral units than can be supported
within the 64 location reserved in Opcode for the
IN and OUT instructions. For the Extended I/O space from $60 - $FF, only
the ST/STS/STD and LD/LDS/LDD instructions
can be used.
Daraus entnehme ich, dass ich auf alle Register mit dem asm Befehl ST
zugreifen kann. Mit in und out nur auf 0x20-0x5F (bzw. 0x0 - 0x3F).
Genau an dem Punkt stehe ich nun.
Gruß
Uwe
(dl4sdx)