Ok, das Problem hat sich erübrigt. Man darf Reset nicht von Anfang an
auf GND legen, sondern erst eine Weile, nachdem der AVR Saft gekriegt
hat. Im Manual stand, man soll Spannung anlegen, während Reset auf 0
liegt; funktioniert so aber nicht.
Aber jetzt das nächste Problem:
Ich bekomm es einfach nicht auf die Reihe, den ATmega168 letztendlich zu
flashen. Ich kann nun erfolgreich "Programming Enable"-Instruction
senden und bekomme beim dritten Byte die erwartete 0x53 wieder. Das
Auslesen der Signatur-Bytes funktioniert ebenfalls, und ich bekomme die
passenden Bytes für meinen ATmega168 zurück.
Aber wie kann ich den AVR nun flashen? Wenn ich das richtig verstanden
habe, muss ich zuerst nacheinander, byteweise (abwechselnd Low- und
High-Byte mit verschiendenen Instructions) mit der "Load Program Memory
Page"-Instruction einen Buffer füllen, der so groß ist wie eine Page.
Anschließend müsste ich den Buffer mit der "Write Program Memory
Page"-Instruction in den Flash schreiben lassen und danach kurz warten.
Aus dem Manual wird mir aber allerdings überhaupt nicht ersichtlich, wie
ich die Adressen der einzelnen Bytes und der Pages angeben soll?! Hab
schon alle Varianten durchprobiert, hab auch schon alle möglichen
ISP-Programmer-Sources durchgeschaut, aber die verwenden teils
unterschiedliche Varianten um die Adressen zu übergeben - alles sehr
verwirrend.
Aus der Figure 27-8 hab ich mir dann für die Instructions das hier
konstruiert:
Buffer beladen:
1 | 0x20 / 0x28 ||| 0x00 ||| buffer_offset >> 1 ||| data_byte
|
Page schreiben:
1 | 0x4C ||| page_offset >> 9 ||| (page_offset >> 1) & 0xFF ||| 0x00
|
wobei buffer_offset jeweils von 0 bis PAGESIZE (128 in diesem Fall)
zählt und dann wieder von 0 an und page_offset 0 bis zur Anzahl der zu
schreibenden Pages - 1 zählt.
Aber das funktioniert nicht. Auch wenn ich die entsprechenden Stellen
wieder auslesen will kommt fast immer 0, manchmal Werte um 80 raus;
könnte aber auch daran liegen, dass ich beim Auslesen ebenfalls die
Adressen falsch angebe.