Es kommt gelegentlich vor, das die Programmierung via ISP Schnittstelle nicht funktioniert. Hier werden verschiedene Ursachen und deren Lösung gezeigt.
Die ISP Programmierung funktioniert nur dann, wenn der Takt der ISP Schnittstelle maximal 1/4 des CPU Taktes beträgt. Da alle neueren AVR mit einem internen Takt von 1MHz ausgeliefert werden darf der Takt in diesem Fall maximal 250kHz betragen. Da der interne Takt durch einen relativ ungenauen RC Oszillator erzeugt wird sollte man aber sicherheitshalber einen kleineren Takt als 250kHz wählen. Beim AVR Studio wären das 125kHz.
Die meisten AVR bieten die Möglichkeit, den Reset Pin als normalen IO Pin zu verwenden. Hierzu muss die Fuse RSTDISBL programmiert werden. Wurde dies, beabsichtigt oder nicht, getan, ist der AVR weder über ISP noch debugWire zu erreichen. Diese Fuse lässt sich normalerweise nicht über die ISP Schnittstelle programmieren.
Man kann das am einfachsten überprüfen wenn sich noch ein lauffähiges Programm im Controller befindet. Läuft es, wenn man den Reset Pin auf Low zieht, hat man Pech. In diesem Fall hilft nur noch JTAG oder die parallele Programmieren. Dazu benötigt man ein STK500, ein JTAGICE, den AVR Dragon oder etwas ähnliches.
Mit der Fuse SPIEN lässt sich die Programmierung über die SPI Schnittstelle deaktivieren. Wurde diese Fuse, beabsichtigt oder unabsichtlich, gelöscht, ist eine Programmierung über ISP nicht mehr möglich. Diese Fuse lässt sich normalerweise nicht über die ISP Schnittstelle programmieren. Der AVR lässt sich nur über JTAG oder parallele Programmierung zurücksetzen.
Damit der AVR überhaupt arbeiten kann benötigt er einen Takt. Ohne Takt auch kein ISP. Der CPU Takt kann entweder durch den internen RC Oszillator erzeugt werden oder durch eine externe Quelle. Als externe Quellen kommen Quarze, Quarzoszillatoren oder RC Oszillatoren in Frage (siehe AVR Clock Source). Man muss jedoch festlegen um welche Quelle es sich handelt. Dies geschieht mit den CKSEL Fusebits. Sollte hier eine falsche Quelle eingestellt sein erhält der Controller keinen Takt.
Ältere AVR wie der ATmega8 und der ATmega32 haben noch die CKOPT Fuse. Wenn ein externer Quarz mit mehr als 8MHz verwendet wird muss diese Fuse unbedingt programmiert werden. Im unprogrammierten Zustand wird der Oszillator mit geringerer Leistung betrieben was dazu führen kann das die Leistung nicht ausreicht um den Quarz zum schwingen zu bringen. Das gemeine dabei ist, das es durchaus eine ganze Weile funktionieren kann.
Befindet sich der AVR in einer Schaltung besteht die Möglichkeit, das eine oder mehrere der ISP Leitungen durch einen Teil der Schaltung gestört werden. So kann zum Beispiel ein betätigter Taster eine der Leitungen auf ein festes Potential legen oder eine zu große Kapazität verschleppt das Signal zu stark. Man sollte bereits beim Entwurf der Schaltung Wert darauf legen, das den ISP Pins keine Funktion zukommt, die die Programmierung beeinträchtigen können. LEDs wären zum Beispiel eine gute Möglichkeit.
In diesen Fällen hilft es, ein Rechtecksignal mit einer nahezu beliebigen Frequenz (ideal wären 250kHz bis 2MHz) an XTAL1 anzulegen. Als Quelle kann ein Quarzoszillator, ein anderer AVR, eine Schaltung mit NE555 oder jede andere Quelle dienen, die ein entsprechendes Signal liefert. Kürzlich habe ich einen Tiny25 dazu verwendet indem ich die CKOUT Fuse programmiert habe. Der Tiny25 hat dann seinen internen Takt von 1MHz an Pin 3 (PB4) ausgegeben. Wie ich das gemacht habe steht im Forum.
Wenn bei einem ATmega8, ATmega32 oder vergleichbaren Controller vergessen worden sein, die CKOPT Fuse zu programmieren, hilft es unter Umständen schon, einen kleineren Quarz zu verwenden. Es sollte ein Quarz mit maximal 8MHz sein. Damit dürfte der Oszillator wieder anschwingen.
Diskussion