AVR Programmierung
Hier finden sich verschiedene Dinge rund um die Programmierung von ATMELs AVR MPUs.
Ich arbeite mit den ATMEGA-Prozessoren (vorrangig ATMEGA8) und evaluiere meinen Code normalerweise mit dem Pollin Evaluationsboard inklusive Addon-Board, wie im Bild ersichtlich.
Programmiert werden meine ATMEGAs mit dem USBTinyISP von Adafruit.
Immer wenn mir irgendwas unklar war und ich länger nachforschen musste, werde ich es hier niederschreiben. :)
ATMEGA verfust
Die Fusebits bei ATMEL-Mikrocontroller werden geliebt und gehasst. Zum Einen bieten sie die einfache Möglichkeit, Eigenschaften des Mikrocontrollers bequem zu setzen, andererseits fördert die Logik, mit der das passiert immer wieder Konfusionen: 0 bedeutet "gesetzt" bzw. "programmiert" und 1 bedeutet "ungesetzt" bzw. "nicht programmiert".
Darüber hinaus ist ein detailliertes Wissen darüber, was man tut, wenn man dieses oder jenes Bit setzt vonnöten, um die Richtige Konfiguration zu finden.
Es passiert oft genug, dass man einem Mikrocontroller beispielsweise sagt "du hast einen externen quarz" und diesen aber falsch einstellt - damit sperrt man sich dann selbst aus und kann diesen Mikrocontroller nicht mehr programmieren und auch die Fusebits nicht mehr korregieren.
Es gibt jedoch eine Möglichkeit, den Mikrocontroller zu retten: über einen selbst generierten externen Taktgeber, können die Fusebits reprogrammiert werden.
Dazu ist allerdings ein weiterer Mikrocontroller vonnöten.
Ein einfaches Programm, welches mit jedem loop den Zustand an einem beliebig wählbaren Pin toggelt, gibt den Takt mit:
PORTB ^= (1<<1);
Wobei PORTB der von mir gewähte Port ist und ich dort PIN 1 beschalte.
Den so programmierten Mikrocontroller steckt man nun auf ein Breadboard, verbindet die VCC- und GND-Pins entsprechend und schließlich den gewählten taktgebenden Pin (in meinem Fall Pin B1) mit dem XTAL Pin A des zu rettenden Mikrocontroller, der im Programmer steckt.
Sehr wichtig ist noch, dass man dem ISP-Programmer mitteilt, dass er nicht so schnell programmieren soll: -B 100 als Parameter dazu hat bei mir mit etwa 87 kHz geklappt (es soll der ISP-Takt X, welcher sich mittels 1000/(1,5*B)=X kHZ errechnet immer maximal 1/4 des eingegebenen Taktes sein - zum Beispiel: 1000/(1,5*100)=9,8 kHz<1/4*87 kHz).
Nun bekommt der zu rettende Mikrocontroller seinen Takt vom Rettungscontroller und kann mit avrdude mit neuen Fusebits versorgt werden.
Das gesamte Programm kompilierbar für ATMEGA8:
taktgeber.tar.gz (5KB)
Die richtigen Fusebitsettings kann man sich unter anderem bei engbedded.com online zusammenstellen.