<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luky</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luky"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Luky"/>
	<updated>2026-04-21T16:47:37Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=30252</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=30252"/>
		<updated>2008-08-15T13:25:20Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein.&lt;br /&gt;
Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie.&lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. &lt;br /&gt;
&lt;br /&gt;
Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
&lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ARM_Board.jpg|AT91SAM7S Testboard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma [[ARM]] entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige Schnittstellen. NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Full-Speed Controller (12Mbit/s).&lt;br /&gt;
&lt;br /&gt;
=== Qual der Wahl ===&lt;br /&gt;
&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen und weniger Designfehler aufweist. Unter anderem bis zu 55MHz SPI-Takt möglich, damit kann man z.B. einen schnellen seriellen ADC ansteuern. &lt;br /&gt;
&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
=== Thumb Mode ===&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die zweitkleinste aus der ARM–Serie AT91SAM von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
&lt;br /&gt;
=== Varianten und Speicher ===&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle zurückgreifen.&lt;br /&gt;
*AT91SAM7S128 (128k Flash, 32k RAM)&lt;br /&gt;
*AT91SAM7S256 (256k Flash, 64k RAM)&lt;br /&gt;
*AT91SAM7S512 (512k Flash, 64k RAM), das „Flaggschiff“ &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE).&lt;br /&gt;
&lt;br /&gt;
=== Takt- und Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei [[Ultra low power| batteriebetriebenen]] Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
&lt;br /&gt;
=== Ausstattung ===&lt;br /&gt;
&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
&lt;br /&gt;
*Interruptcontroller mit 8 verschiedenen Prioritäten&lt;br /&gt;
*2 externe Interrupts&lt;br /&gt;
*JTAG Schnittstelle zum Debuggen&lt;br /&gt;
*I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
*Zähler/Timer&lt;br /&gt;
*4-Kanal 16-Bit PWM-Controller&lt;br /&gt;
*3 programmierbare Taktausgänge&lt;br /&gt;
*8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne [[Pegelwandler]] an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte [[DMA]] Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel [[TWI]] genannt), ein [[I2S |I²S]] Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 [[USART]]S mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Full-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Selbst ist der Bastler ===&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&amp;lt;BR&amp;gt;&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf [[Platinenherstellung mit der Photo-Positiv-Methode | Ätztechniken]] noch auf [[SMD Löten]] eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, dass die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
=== Einfach ist besser ===&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standardbauteilen (alles bei Reichelt zu bekommen) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
=== Quarz und USB Bootloader ===&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz [[Baudratenquarz]], welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S256 empfiehlt sich für die Entwicklung, da er grosse Ressourcen an RAM und FLASH bereitstellt. Man kann aber natürlich auch nur den 64er nehmen, wenn man sicher ist mit 16kB RAM auszukommen.&lt;br /&gt;
*Vias (siehe Text)&lt;br /&gt;
*Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
*Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
*100nF Kerko SMD 0603 (15x)&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
*Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
*SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
*2,2µF KERKO oder ELKO&lt;br /&gt;
*Stiftleisten (siehe Text)&lt;br /&gt;
*Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
*Taster für Reset falls gewünscht&lt;br /&gt;
*USB-B Buchse Print&lt;br /&gt;
*Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
*Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
*USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
*Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
*Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
*Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
*/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
*die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
*Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
&lt;br /&gt;
*char	1 Byte&lt;br /&gt;
*short	2 Bytes&lt;br /&gt;
*Int, long	4 Bytes&lt;br /&gt;
*long long	8 Bytes&lt;br /&gt;
*float	4 Bytes&lt;br /&gt;
*double	8 Bytes&lt;br /&gt;
&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man wenn möglich auf sie verzichten und auf [[Festkommaarithmetik]] zurückgreifen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
//ODER&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle [[USART]] zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
[[SPI]] oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
&lt;br /&gt;
*MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
*MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
*SCK (System Clock)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf AT91SAM7S Microcontroller Series Schematic Check List]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3883 SAM-BA]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3784 ATMEL Evaluation Kit]  Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* [http://yagarto.de/ YAGARTO]&lt;br /&gt;
* [http://atmel.com/dyn/products/app_notes.asp?family_id=605 Aplication Notes]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools.asp?family_id=605 ATMEL-Software]&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCDDebugger]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=30015</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=30015"/>
		<updated>2008-08-12T18:10:10Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein.&lt;br /&gt;
Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie.&lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. &lt;br /&gt;
&lt;br /&gt;
Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
&lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ARM_Board.jpg|AT91SAM7S Testboard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma [[ARM]] entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige Schnittstellen. NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Full-Speed Controller (12Mbit/s).&lt;br /&gt;
&lt;br /&gt;
=== Qual der Wahl ===&lt;br /&gt;
&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen und weniger Designfehler aufweist. Unter anderem bis zu 55MHz SPI-Takt möglich, damit kann man z.B. einen schnellen seriellen ADC ansteuern. &lt;br /&gt;
&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
=== Thumb Mode ===&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die zweitkleinste aus der ARM–Serie AT91SAM von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
&lt;br /&gt;
=== Varianten und Speicher ===&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle zurückgreifen.&lt;br /&gt;
*AT91SAM7S128 (128k Flash, 32k RAM)&lt;br /&gt;
*AT91SAM7S256 (256k Flash, 64k RAM)&lt;br /&gt;
*AT91SAM7S512 (512k Flash, 64k RAM), das „Flaggschiff“ &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE).&lt;br /&gt;
&lt;br /&gt;
=== Takt- und Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei [[Ultra low power| batteriebetriebenen]] Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
&lt;br /&gt;
=== Ausstattung ===&lt;br /&gt;
&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
&lt;br /&gt;
*Interruptcontroller mit 8 verschiedenen Prioritäten&lt;br /&gt;
*2 externe Interrupts&lt;br /&gt;
*JTAG Schnittstelle zum Debuggen&lt;br /&gt;
*I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
*Zähler/Timer&lt;br /&gt;
*4-Kanal 16-Bit PWM-Controller&lt;br /&gt;
*3 programmierbare Taktausgänge&lt;br /&gt;
*8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne [[Pegelwandler]] an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte [[DMA]] Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel [[TWI]] genannt), ein [[I2S |I²S]] Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 [[USART]]S mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Full-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Selbst ist der Bastler ===&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&amp;lt;BR&amp;gt;&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf [[Platinenherstellung mit der Photo-Positiv-Methode | Ätztechniken]] noch auf [[SMD Löten]] eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, dass die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
=== Einfach ist besser ===&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standardbauteilen (alles bei Reichelt zu bekommen) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
=== Quarz und USB Bootloader ===&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz [[Baudratenquarz]], welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S256 empfiehlt sich für die Entwicklung, da er grosse Ressourcen an RAM und FLASH bereitstellt. Man kann aber natürlich auch nur den 64er nehmen, wenn man sicher ist mit 16kB RAM auszukommen.&lt;br /&gt;
*Vias (siehe Text)&lt;br /&gt;
*Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
*Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
*100nF Kerko SMD 0603 (15x)&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
*Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
*SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
*2,2µF KERKO oder ELKO&lt;br /&gt;
*Stiftleisten (siehe Text)&lt;br /&gt;
*Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
*Taster für Reset falls gewünscht&lt;br /&gt;
*USB-B Buchse Print&lt;br /&gt;
*Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
*Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
*USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
*Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
*Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
*Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
*/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
*die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
*Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
&lt;br /&gt;
*char	1 Byte&lt;br /&gt;
*short	2 Bytes&lt;br /&gt;
*Int, long	4 Bytes&lt;br /&gt;
*long long	8 Bytes&lt;br /&gt;
*float	4 Bytes&lt;br /&gt;
*double	8 Bytes&lt;br /&gt;
&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man wenn möglich auf sie verzichten und auf [[Festkommaarithmetik]] zurückgreifen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
//ODER&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle [[USART]] zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
[[SPI]] oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
&lt;br /&gt;
*MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
*MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
*SCK (System Clock)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf AT91SAM7S Microcontroller Series Schematic Check List]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3883 SAM-BA]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3784 ATMEL Evaluation Kit]  Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* [http://yagarto.de/ YAGARTO]&lt;br /&gt;
* [http://atmel.com/dyn/products/app_notes.asp?family_id=605 Aplication Notes]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools.asp?family_id=605 ATMEL-Software]&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCDDebugger]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29957</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29957"/>
		<updated>2008-08-11T14:39:57Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ARM_Board.jpg|AT91SAM7S Testboard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma [[ARM]] entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige Schnittstellen. NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Full-Speed Controller (12Mbit/s).&lt;br /&gt;
&lt;br /&gt;
=== Qual der Wahl ===&lt;br /&gt;
&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen und weniger Designfehler aufweist. Unter anderem bis zu 55MHz SPI-Takt möglich, damit kann man z.B. einen schnellen seriellen ADC ansteuern. &lt;br /&gt;
&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
=== Thumb Mode ===&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die zweitkleinste aus der ARM–Serie AT91SAM von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
&lt;br /&gt;
=== Varianten und Speicher ===&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle zurückgreifen.&lt;br /&gt;
*AT91SAM7S128 (128k Flash, 32k RAM)&lt;br /&gt;
*AT91SAM7S256 (256k Flash, 64k RAM)&lt;br /&gt;
*AT91SAM7S512 (512k Flash, 64k RAM), das „Flaggschiff“ &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE).&lt;br /&gt;
&lt;br /&gt;
=== Takt- und Stromversorgung ===&lt;br /&gt;
&lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei [[Ultra low power| batteriebetriebenen]] Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
&lt;br /&gt;
=== Ausstattung ===&lt;br /&gt;
&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
&lt;br /&gt;
*Interruptcontroller mit 8 verschiedenen Prioritäten&lt;br /&gt;
*2 externe Interrupts&lt;br /&gt;
*JTAG Schnittstelle zum Debuggen&lt;br /&gt;
*I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
*Zähler/Timer&lt;br /&gt;
*4-Kanal 16-Bit PWM-Controller&lt;br /&gt;
*3 programmierbare Taktausgänge&lt;br /&gt;
*8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne [[Pegelwandler]] an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte [[DMA]] Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel [[TWI]] genannt), ein [[I2S |I²S]] Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 [[USART]]S mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Full-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Selbst ist der Bastler ===&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&amp;lt;BR&amp;gt;&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf [[Platinenherstellung mit der Photo-Positiv-Methode | Ätztechniken]] noch auf [[SMD Löten]] eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, dass die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
=== Einfach ist besser ===&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standardbauteilen (alles bei Reichelt zu bekommen) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
=== Quarz und USB Bootloader ===&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz [[Baudratenquarz]], welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S256 empfiehlt sich für die Entwicklung, da er grosse Ressourcen an RAM und FLASH bereitstellt. Man kann aber natürlich auch nur den 64er nehmen, wenn man sicher ist mit 16kB RAM auszukommen.&lt;br /&gt;
*Vias (siehe Text)&lt;br /&gt;
*Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
*Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
*100nF Kerko SMD 0603 (15x)&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
*15pF Kerko SMD 0603 (2x)&lt;br /&gt;
*1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
*Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
*SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
*2,2µF KERKO oder ELKO&lt;br /&gt;
*Stiftleisten (siehe Text)&lt;br /&gt;
*Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
*Taster für Reset falls gewünscht&lt;br /&gt;
*USB-B Buchse Print&lt;br /&gt;
*Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
*Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
*USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
*Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
*Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
*Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
*/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
*die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
*Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
&lt;br /&gt;
*char	1 Byte&lt;br /&gt;
*short	2 Bytes&lt;br /&gt;
*Int, long	4 Bytes&lt;br /&gt;
*long long	8 Bytes&lt;br /&gt;
*float	4 Bytes&lt;br /&gt;
*double	8 Bytes&lt;br /&gt;
&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man wenn möglich auf sie verzichten und auf [[Festkommaarithmetik]] zurückgreifen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
//ODER&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle [[USART]] zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
[[SPI]] oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
&lt;br /&gt;
*MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
*MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
*SCK (System Clock)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf AT91SAM7S Microcontroller Series Schematic Check List]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3883 SAM-BA]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools_card.asp?tool_id=3784 ATMEL Evaluation Kit]  Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* [http://yagarto.de/ YAGARTO]&lt;br /&gt;
* [http://atmel.com/dyn/products/app_notes.asp?family_id=605 Aplication Notes]&lt;br /&gt;
* [http://atmel.com/dyn/products/tools.asp?family_id=605 ATMEL-Software]&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCDDebugger]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board.jpg&amp;diff=29956</id>
		<title>Datei:ARM Board.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board.jpg&amp;diff=29956"/>
		<updated>2008-08-11T14:38:16Z</updated>

		<summary type="html">&lt;p&gt;Luky: Bild ARM Testboard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bild ARM Testboard&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board.jpg.jpg&amp;diff=29955</id>
		<title>Datei:ARM Board.jpg.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board.jpg.jpg&amp;diff=29955"/>
		<updated>2008-08-11T14:38:10Z</updated>

		<summary type="html">&lt;p&gt;Luky: Bild ARM Testboard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bild ARM Testboard&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29954</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29954"/>
		<updated>2008-08-11T13:58:53Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Layouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität.&lt;br /&gt;
Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SO8.PDF SO8 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/e/ef/SOIC16.pdf SOIC16 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SOT23.pdf SOT23 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/4/4c/TSSOP28.pdf TSSOP28 Adapter]&lt;br /&gt;
&lt;br /&gt;
Die Layouts wurden nicht mit Eagle erstellt, sondern mit einem einfachen Zeichenprogramm. Bei einer Platine mit einem einzigen IC braucht man nicht unbedingt mehr.&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Adapterplatinen.JPG|800px|Einige Beispiele]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29296</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29296"/>
		<updated>2008-07-26T09:10:52Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Allgemeine ARM Programmierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
//ODER&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
ATMEL Evaluation Kit. Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3784&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29295</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29295"/>
		<updated>2008-07-26T09:07:37Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* PIO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
ATMEL Evaluation Kit. Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3784&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29294</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29294"/>
		<updated>2008-07-26T09:06:18Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* UART */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
ATMEL Evaluation Kit. Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3784&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29292</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29292"/>
		<updated>2008-07-26T07:55:06Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität.&lt;br /&gt;
Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SO8.PDF SO8 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/e/ef/SOIC16.pdf SOIC16 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SOT23.pdf SOT23 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/4/4c/TSSOP28.pdf TSSOP28 Adapter]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Adapterplatinen.JPG|800px|Einige Beispiele]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29250</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29250"/>
		<updated>2008-07-22T20:30:15Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Interessante Seiten + Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
ATMEL Evaluation Kit. Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot; (incl. .bin File!)&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3784&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29249</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29249"/>
		<updated>2008-07-22T20:29:01Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Interessante Seiten + Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
ATMEL Evaluation Kit. Besonders interessant sind die Bespiele im &amp;quot;AT91SAM7S-EK Software Package&amp;quot;&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3784&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29234</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29234"/>
		<updated>2008-07-22T14:56:11Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* UART */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
//Global Pointer to USART1&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;&lt;br /&gt;
&lt;br /&gt;
//Initialize Serial Interface&lt;br /&gt;
void uart1_init (void) { &lt;br /&gt;
	&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin&lt;br /&gt;
&lt;br /&gt;
//Dann wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) {&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29233</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29233"/>
		<updated>2008-07-22T14:53:57Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/f/f3/ARM_Board_TOP.pdf Oberseite, bereits gespiegelt]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/7/7b/ARM_Board_Bottom.pdf Unterseite]&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_TOP.pdf&amp;diff=29232</id>
		<title>Datei:ARM Board TOP.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_TOP.pdf&amp;diff=29232"/>
		<updated>2008-07-22T14:53:18Z</updated>

		<summary type="html">&lt;p&gt;Luky: Minimalistisches AT91SAM7S Board&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Minimalistisches AT91SAM7S Board&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_Bottom.pdf&amp;diff=29231</id>
		<title>Datei:ARM Board Bottom.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_Bottom.pdf&amp;diff=29231"/>
		<updated>2008-07-22T14:52:18Z</updated>

		<summary type="html">&lt;p&gt;Luky: Minimalistisches AT91SAM7S Board&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Minimalistisches AT91SAM7S Board&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29229</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29229"/>
		<updated>2008-07-22T14:51:33Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Schaltplan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/b/b6/ARM_Board_Schematic.pdf Schaltplan als PDF]&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_Schematic.pdf&amp;diff=29228</id>
		<title>Datei:ARM Board Schematic.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:ARM_Board_Schematic.pdf&amp;diff=29228"/>
		<updated>2008-07-22T14:50:15Z</updated>

		<summary type="html">&lt;p&gt;Luky: Schaltplan eines minimalistischen AT91SAM7S Boards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schaltplan eines minimalistischen AT91SAM7S Boards&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29226</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29226"/>
		<updated>2008-07-22T14:49:19Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista] ARM Entwicklung unter Windows Vista]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29225</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29225"/>
		<updated>2008-07-22T14:47:59Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität. Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SO8.PDF SO8 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/e/ef/SOIC16.pdf SOIC16 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SOT23.pdf SOT23 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/4/4c/TSSOP28.pdf TSSOP28 Adapter]&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Adapterplatinen.JPG|800px|Einige Beispiele]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29224</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29224"/>
		<updated>2008-07-22T14:47:43Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität. Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
Layouts&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SO8.PDF SO8 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/e/ef/SOIC16.pdf SOIC16 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/2/25/SOT23.pdf SOT23 Adapter]&lt;br /&gt;
* [http://www.mikrocontroller.net/wikifiles/4/4c/TSSOP28.pdf TSSOP28 Adapter]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Adapterplatinen.JPG|800px|Einige Beispiele]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:TSSOP28.pdf&amp;diff=29223</id>
		<title>Datei:TSSOP28.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:TSSOP28.pdf&amp;diff=29223"/>
		<updated>2008-07-22T14:47:05Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SOT23.pdf&amp;diff=29222</id>
		<title>Datei:SOT23.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SOT23.pdf&amp;diff=29222"/>
		<updated>2008-07-22T14:46:27Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SOIC16.pdf&amp;diff=29221</id>
		<title>Datei:SOIC16.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SOIC16.pdf&amp;diff=29221"/>
		<updated>2008-07-22T14:45:44Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SO8.pdf&amp;diff=29220</id>
		<title>Datei:SO8.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SO8.pdf&amp;diff=29220"/>
		<updated>2008-07-22T14:39:14Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29219</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29219"/>
		<updated>2008-07-22T14:38:19Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität. Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
Layouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bilder&lt;br /&gt;
&lt;br /&gt;
[[Bild:Adapterplatinen.JPG|Einige Beispiele]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Adapterplatinen.JPG&amp;diff=29218</id>
		<title>Datei:Adapterplatinen.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Adapterplatinen.JPG&amp;diff=29218"/>
		<updated>2008-07-22T14:35:04Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29204</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29204"/>
		<updated>2008-07-22T06:43:16Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* UART */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Characte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
ARM Entwicklung unter Windows Vista&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29203</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29203"/>
		<updated>2008-07-22T06:41:52Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Character&lt;br /&gt;
}&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
ARM Entwicklung unter Windows Vista&lt;br /&gt;
* [[http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29184</id>
		<title>Entwicklungsboard mit AT91SAM7Sxxx - selbstgemacht</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_AT91SAM7Sxxx_-_selbstgemacht&amp;diff=29184"/>
		<updated>2008-07-21T17:49:16Z</updated>

		<summary type="html">&lt;p&gt;Luky: Artikel online gestellt für Artikelwettbewerb&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller mit ARM7 Kern sind toll. Wirklich.&lt;br /&gt;
Der Einarbeitungsaufwand ist nicht so groß wie viele glauben und wenn man den Schritt einmal gewagt hat, wird man von den Möglichkeiten begeistert sein. Und dann wäre da auch noch der Preis: 6,25€ bei Reichelt für den AT91SAM7S64 bzw. 9,85€ für die große Variante SAM7S256&lt;br /&gt;
Dafür bekommt man höchstens einen ATMEGA128 mit einem Bruchteil des Speichers, Geschwindigkeit und Peripherie. &lt;br /&gt;
AVRs setze ich nur mehr entweder im DIP-Gehäuse für schnelle Basteleien ein, oder aber wenn es besonders stromsparend sein soll.&lt;br /&gt;
Dieser Artikel beschreibt die Fertigung eines Entwicklungsboards zum selbst Ätzen aus leicht erhältlichen Teilen und behandelt auch kurz die Inbetriebnahme und Programmierung mit Gratisprogrammen. Leider muss ich mich hier auf Windows (XP) beschränken. &lt;br /&gt;
Vogel – und Obstfreunde habens leider nicht so leicht und müssen sich auf einschlägigen Seiten informieren. Vista zickt (natürlich?) ebenfalls, es gibt jedoch einen extra Artikel darüber.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Die Firma ARM entwickelt Mikrocontrollerkerne verschiedener Leistungsklassen, stellt jedoch keine Endprodukte her, sondern lizenziert die Architektur an Halbleiterproduzenten.&lt;br /&gt;
Diese ergänzen den Kern mit Peripherieeinheiten und fertigen den Chip.&lt;br /&gt;
ARM – Lizenznehmer sind u.a. TI, Analog Devices, Nintendo, NXP (ex. Philips) und Atmel.&lt;br /&gt;
Diese Hersteller bieten zu sehr aggressiven Preisen Mikrocontroller mit softwarekompatiblem Kern, aber unterschiedlicher Auslegung der Peripherie an. So verfügen die Modelle von Analog Devices beispielsweise über einen sehr schnellen ADC und DAC (ADuC70xx, sehr empfehlenswert wenn man was regeln muss...), NXP hat bei den LPC21xx /LPC23xx Modellen ein schnelles Speicherinterface und Atmel bei der AT91SAM-Reihe einen mächtigen DMA-Controller und viele, hochwertige, Schnittstellen. &lt;br /&gt;
NXP und Atmel implementieren bei einigen Modellen auch einen USB 2.0 Hi-Speed Controller.&lt;br /&gt;
Meine Wahl fiel zu Gunsten von Atmel aus, da der AT91SAM7S zwar durch den langsameren Speicher nicht die Geschwindigkeit den NXP-Controllers erreichen kann, aber dafür bessere  Hardware-Schnittstellen (u.a. bis zu 55MHz SPI-Takt! Damit kann man einen schnellen seriellen ADC ansteuern...) und weniger Designfehler aufweist.&lt;br /&gt;
Datenblätter, in denen die (ganz tolle!) gewünschte Spezifikation heruntergebetet wird sind mir absolut unsympathisch und erhöhen nicht gerade das Vertrauen ins Produkt, wenn dann im fast dickeren Errata-Sheet steht, was sie nicht richtig hinbekommen haben. Ich habe auch auf anderen Gebieten schlechte Erinnerungen an Philips und mir daher, auch aufgrund der positiven Erfahrungen sowohl mit AVRs als auch ATMEL- Mitarbeitern, für AT91SAM7S entschieden. ATMEL schreibt nur Dinge die Funktionieren ins Datenblatt rein und lässt andere gleich weg (TWI Master, RTC mit Uhrenquarz etc. waren sicher mal geplant, haben aber nicht funktioniert, also stehen sie auch nicht im Datenblatt) So freut man sich nicht auf Dinge die man dann aber doch nicht nutzen kann.&lt;br /&gt;
&lt;br /&gt;
Die verwendete Controllerfamilie ist die (zweit)kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle. &lt;br /&gt;
Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM.&lt;br /&gt;
Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist.&lt;br /&gt;
Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.&lt;br /&gt;
Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann man auf die pinkompatiblen, größeren Modelle SAM7S128 (128k Flash, 32k RAM), SAM7S256 (256k Flash, üppige 64k RAM) oder auf das „Flaggschiff“ AT91SAM7S512 mit 512k Flash und ebenfalls 64k RAM zurückgreifen. &lt;br /&gt;
Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP.&lt;br /&gt;
Die kleineren Variante (SAM7S16/32/321) im 48-Pin Gehäuse sind schwer erhältlich und kaum bis gar nicht billiger. Darüberhinaus verliert man die Möglichkeit für ein pinkompatibles Upgrade.&lt;br /&gt;
Es gibt auch größere Varianten mit Ethernet – und CAN-Controller (SAM7X) sowie externem Speicherinterface (SAM7SE). &lt;br /&gt;
Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit. Andernfalls arbeitet der Bootloader nur mit RS232.&lt;br /&gt;
Ein integrierter Taktcontroller kann bis zu 3 verschiedene Taktsignale an Pins ausgeben, was bei einigen Projekten ein unschätzbarer Vorteil gegenüber anderen Controllern ist, bei denen man den Takt für andere ICs extra generieren müsste.&lt;br /&gt;
Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein.&lt;br /&gt;
Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Dieser muss aber noch richtig verbunden werden.&lt;br /&gt;
Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen im vollen Betrieb bei ca. 40mA bei 5V Versorgungsspannung.&lt;br /&gt;
Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken sowie nicht benötigte Teile abzuschalten.&lt;br /&gt;
Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Natürlich ist hier der Hinweis angebracht, das man bei besonderen Anforderungen besser einen externen Supervisor IC anhängen sollte.&lt;br /&gt;
Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:&lt;br /&gt;
Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand und Anti-Glitch-Filter zum einfachen Entprellen.&lt;br /&gt;
Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.&lt;br /&gt;
Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.&lt;br /&gt;
Zur Kommunikation mit anderen ICs sind ein SPI-Interface (max. mit Controllergeschwindigkeit taktbar!), eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die allseits bekannte und beliebte (oder auch nicht) 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.&lt;br /&gt;
Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3  programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche günstige Entwicklerboards für die AT91SAM7S Serie. Aber selbermachen ist einfach interessanter und lehrreicher. Bestellen kann ja jeder...&lt;br /&gt;
Das hier vorgestellte Headerboard passt schön in die billigen Steckbrettchen („STECKBOARD 2K1V“, aber auch in andere) von Reichelt und kann von jedem selbst gebaut werden, der zweiseitige Platinen Ätzen kann. Es ist natürlich nur als Vorschlag gedacht. Ich werde jedoch hier weder auf Ätztechniken noch auf SMD-Löten eingehen, da es dafür einfach schon zu viele Artikel gibt. Es sei nur gesagt, das die „Zuerst alle Beinchen mit viel Zinn vollschmieren und danach mit Entlötlitze alles überflüssige entfernen“ Methode bei mir ausgezeichnet funktioniert.&lt;br /&gt;
Leider ist es aber notwendig, Durchkontaktierungen (VIAs) zu setzen. Draht durchstecken und auf beiden Seiten verlöten geht aber hier nicht, da sich bei meinem Layout einige VIAs unter dem Mikrocontroller befinden. Man braucht also Durchkontaktierungsnieten (0,6mm Innendurchmesser) z.B. auch von Reichelt als NIETEN 0,6MM. Die ziemlich teure und trotzdem sehr wackelige Presse ist aber nicht nötig. Mit etwas probieren kann man die Nieten mit einer Pinzette wunderbar durch ein 0,8mm Loch stecken und dann, je nach gewünschtem Perfektionismus, auf der anderen Seite entweder nur festlöten oder vorsichtig mit Hammer und einem ev. leicht konischen und vor allem feinen Stift auch dort flachklopfen.&lt;br /&gt;
Viel Spass beim Experimentieren.&lt;br /&gt;
&lt;br /&gt;
Meine Platine wurde nicht auf geringstmöglichen Platzbedarf optimiert, sondern auf leichten Aufbau, Verwendung von Standartbauteilen (alles bei Reichelt zu bekommen...) und möglichst großer Flexibilität hin entwickelt.&lt;br /&gt;
Wenn man 3 Löcher bohrt kann man anstelle des vorgesehenen DPACK-Gehäuses z.B. problemlos TO220 Spannungsregler verwenden. Ich habe einen LF33CV verwendet, jeder andere Linearregler welcher bei 4V Eingangsspannung noch 3,3V erzeugen kann geht aber auch.&lt;br /&gt;
Falls man kein Steckbrett verwenden will, können die Stiftleisten auch an der Oberseite montiert werden. Die Verbindung zu anderen Teilen kann man dann sehr einfach mit Drahtstücken herstellen.&lt;br /&gt;
&lt;br /&gt;
Im Layout sind die unbedingt empfehlenswerten 100nF Blockkondensatoen nicht eingezeichnet. Man muss daher bei jedem Via, welches die Spannungsversorgungspins des Controllers mit der Rückseite verbindet, einen 100nF Kerko auf Masse löten.&lt;br /&gt;
&lt;br /&gt;
Ich habe mich weitgehend an Olimex und Original ATMEL Schaltplänen orientiert. Empfehlenswert ist auch das ATMEL-Dokument „AT91SAM7S Microcontroller Series Schematic Check List“.&lt;br /&gt;
Der Quarz ist ein 18,432MHz Baudratenquarz, welcher vom integrierten Bootloader bevorzugt wird, und mit dem man auch wunderbar die USB- Taktrate erzeugen kann. Die KERKOS beim Quarz müssen zwar eigentlich auf den verwendeten Typ angepasst werden (Datenblatt Quarz + µC). 22pF haben bislang aber noch immer und überall funktioniert...&lt;br /&gt;
Wird ein anderer Quarz verwendet, muss der PLL-Filter angepasst werden. Es gibt hierfür ein Berechnungstool bei ATMEL.&lt;br /&gt;
Der Filter sowie der Quarz sollen möglichst nahe am IC liegen um Störungen zu minimieren.&lt;br /&gt;
Da ein interner Resetcontroller eingebaut ist und dieser auch verwendet wird, muss der /RESET PIN nicht beschaltet werden.&lt;br /&gt;
Es existieren mehrere Varianten der USB-Pullup Schaltung. Die von mir gewählte hat den Vorteil, dass der Widerstand im Normalzustand mit VCC verbunden ist und die Schaltung damit dem PC gleich beim Einstecken den Anmeldewunsch signalisiert, wie es der Bootloader haben möchte. Will man dies nicht, hängt man die Basis des npn-Transistors an einen Pin des Controllers (Olimex verwendet PA16) und kann sich so bei Bedarf anmelden lassen.&lt;br /&gt;
Soll die Schaltung ausschließlich USB-Powered laufen und sich immer an den PC anmelden, kann der Widerstand auch direkt an VCC hängen.&lt;br /&gt;
Es ist auch möglich den Pullup-Widerstand direkt an einen Pin des Controllers zu hängen. Im Ausgangszustand hängt die Datenleitung dann aber über 1,5k + 10-15k vom internen Pullup auf VCC. Dieser Fall ist nicht Spezifikationskonform, aber ich habe schon einige Schaltungen damit gesehen.&lt;br /&gt;
Zusätzlich ist noch ein Spannungsteiler vorgesehen um festzustellen, ob die 5V USB-Spannung anliegen. Aufgrund der 5V-Toleranz der Eingänge wäre dies zwar nicht unbedingt nötig, aber sicher ist sicher, vor allem weil die USB-Spannung ja auch größer sein kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schaltplan ==&lt;br /&gt;
&lt;br /&gt;
Alle nicht bezeichneten Kondensatoren sind 100nF, die Widerstände 10k&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stückliste ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S256 (empfehlenswert für die Entwicklung, man kann aber natürlich auch nur den 64er nehmen wenn man sicher ist, mit 16kB RAM auszukommen.&lt;br /&gt;
Vias (siehe Text)&lt;br /&gt;
Spannungsregler incl. der benötigten Kondensatoren. Muss bei 4,5V- Spannungsabfall an der Schutzdiode noch 3,3V liefern können.&lt;br /&gt;
Schutzdiode (bedrahtet) z.B. 1N4001 oder auch Schottky&lt;br /&gt;
100nF Kerko SMD 0603 (15x)&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
Quarz 18,432MHz, HC49U-S incl. Kondensatoren&lt;br /&gt;
15pF Kerko SMD 0603 (2x)&lt;br /&gt;
1nF + 10nF Kerko SMD 0603 für PLL-Filter&lt;br /&gt;
Widerstände SMD 0603: 1k5(2x), 15k, 45k, 27Ohm (2x), 10k (3x)&lt;br /&gt;
SMD-LED + Vorwiderstand für 3,3V (2x)&lt;br /&gt;
2,2µF KERKO oder ELKO&lt;br /&gt;
Stiftleisten (siehe Text)&lt;br /&gt;
Wannenstecker 20Pol falls JTAG gewünscht&lt;br /&gt;
Taster für Reset falls gewünscht&lt;br /&gt;
USB-B Buchse Print&lt;br /&gt;
Beschaltung für USB-Pullup-Widerstand nach Wahl (Text!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Layout ==&lt;br /&gt;
&lt;br /&gt;
LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es werde Licht (Testlauf) ==&lt;br /&gt;
&lt;br /&gt;
Der AT91SAM7S Bootloader ist leider ziemlich unpraktisch (NXP und Analog haben das wesentlich besser hinbekommen!) und daher nur als Notfallmaßnahme einzusetzen. Zum erstmaligen Einrichten und testen ist er aber optimal:&lt;br /&gt;
Zuerst muss SAM-BA heruntergeladen und installiert werden. Achtung: Der Neustart ist tatsächlich notwendig, sonst funktioniert es nicht.&lt;br /&gt;
Dann wird der TST Pin des Controllers mit VCC verbunden (per Jumper) und die Schaltung mit 5V versorgt. Man kann auch den USB-Stecker einstecken. Windows wird dann jedoch jammern, das das USB-Gerät nicht erkannt wurde, außer man hat vorher den Steuerungspin der Pullup-Beschaltung auf GND gehängt Der Transistor sperrt dann und der Widerstand hängt frei.. Nach ca. 10-15sec kann man wieder abstecken und TST entweder offen lassen oder auf GND legen (Jumper umstecken). Nun verbindet man das Board über USB mit dem PC. Es sollte sich als SAM7Sxx Testboard anmelden (Pullup auf VCC?). Ist dies erfolgreich, kann man SAM-BA starten, USB als Connection und den verwendeten Mikrocontrollertyp (+ -EK für Evaluation Kit, Atmel geht davon aus das alle ihr Paket kaufen...) auswählen.&lt;br /&gt;
Man kann nun ein beliebiges Testprogramm, z.B. aus den zahlreichen Beispielen von ATMEL herunterladen. Leider darf ich dieses hier nicht zur Verfügung stellen, aber die Beispielprogramme sollte man sich eh ansehen…&lt;br /&gt;
Die Frage nach dem Unlock beantwortet man mit YES und wenn er dann nachfragt ob die Bereiche wieder Gelockt werden sollten verneint man dies.&lt;br /&gt;
Der Controller ist nun nicht mehr gesperrt und kann einfach über JTAG programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Hat der Test nicht funktioniert sollte man einige Dinge überprüfen:&lt;br /&gt;
-Spannungen 3,3V + 1,8V OK?&lt;br /&gt;
-USB+ mit 1,5KOhm auf VCC gezogen?&lt;br /&gt;
-Schwingt der Quarz? Ev. Wert der KERKOS doch überprüfen&lt;br /&gt;
-Wenn möglich Stromaufname mit gedrücktem RESET-Knopf messen und mit Normalbetrieb vergleichen&lt;br /&gt;
-Die Pins PA0-3 müssen HIGH-Pegel haben (Interne Pullups, Siehe Datenblatt)&lt;br /&gt;
-/RESET muss offen oder höchstens mittels Pullup auf VCC gezogen sein&lt;br /&gt;
-die Pins ERASE und JTAGSEL müssen offen oder auf GND gelegt sein&lt;br /&gt;
-Spannung am TST-Pin in beiden Fällen (VCC + GND) überprüfen&lt;br /&gt;
&lt;br /&gt;
Wenn das Board nun (endlich?) funktioniert, kann man sich dem Programmieren zuwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Softwareseite ==&lt;br /&gt;
&lt;br /&gt;
Die ARM-Prozessorkerne werden von der Gnu Compiler Collection (gcc) voll unterstützt. Der ist gut und gratis, wie hier allgemein bekannt sein sollte.&lt;br /&gt;
Der gcc Compiler ist in der Lage, sowohl 32Bit Code als auch 16-Bit Thumb Code sowie Mischcode zu erzeugen.&lt;br /&gt;
Es gibt zahlreiche Open-Source Entwicklungsumgebungen für ARM Prozessoren.&lt;br /&gt;
Hervorzuheben sind WinARM, ein eher kompaktes Paket, und YAGARTO, welches Eclipse als Entwicklungsumgebung einbindet. Es gibt bei ATMEL auch eine umfangreiche Beschreibung incl. Beispielcode, welche die Einrichtung einer kompletten Entwicklungsumgebung mit JTAG - Debugger erklärt.&lt;br /&gt;
Auf weiterführende Erklärungen soll daher hier verzichtet werden, auch weil die Programme sehr stark weiterentwickelt werden und die Informationen daher bald veraltet wären.&lt;br /&gt;
Empfehlenswert ist auch die Homepage von Atmel mit zahlreichen Beispielen und Application Notes.&lt;br /&gt;
Ganz nett ist auch AT91.com, auch wenn die Informationen dort etwas verstreut liegen und ohne Anmeldung fast nix geht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmierung (nur ganz kurz, versprochen...) ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine ARM Programmierung ===&lt;br /&gt;
&lt;br /&gt;
Mikrocontroller werden im Allgemeinen in C programmiert. Assembler macht auf Maschinen dieser Leistungsklasse nur in Ausnahmefällen (Startup-Code, siehe unten) einen Sinn.&lt;br /&gt;
Auf Grundlagen der Sprache wie z.B. Strukturen und Grundlagen der Zeiger wird hier nicht weiter eingegangen. Dafür gibt’s tolle C Tutorials oder sogar Bücher.&lt;br /&gt;
Der verwendete Compiler kennt für die ARM-Architektur folgende Datentypen:&lt;br /&gt;
char	1 Byte&lt;br /&gt;
short	2 Bytes&lt;br /&gt;
Int, long	4 Bytes&lt;br /&gt;
long long	8 Bytes&lt;br /&gt;
float	4 Bytes&lt;br /&gt;
double	8 Bytes&lt;br /&gt;
Bei float und double handelt es sich um Fließkommazahlen.&lt;br /&gt;
Da ihre Verarbeitung auf dem Mikrocontroller ohne Fließkommaeinheit, wie dem hier verwendeten, sehr rechenaufwändig ist, sollte man, wenn möglich, auf sie verzichten und Festkommazahlen mit möglichst kleinem Wertebereich wählen, da der Speicher auf diesen kleinen Systemen meistens ebenfalls kostbar ist.&lt;br /&gt;
Die Festkommatypen gibt es jeweils vorzeichenlos (unsigned) und vorzeichenbehaftet.&lt;br /&gt;
&lt;br /&gt;
Alle Peripherieeinheiten des Controllers werden durch das Setzen von Werten in bestimmten Registern konfiguriert. Ein Register ist nichts anderes als eine bestimmte Adresse im Adressbereich des Controllers. Bei einem 32Bit Controller ist jedes dieser Register 32Bit breit.&lt;br /&gt;
Atmel liefert für jeden Controller eine header-Datei (.h) in welcher u.a. für jedes Register einfacher merkbare Namen definiert werden. Der weiter unten beschriebene PIO Controller hat z.B seine Basisadresse bei 0xFFFFF400. Da diese Adresse schwer merkbar ist, wird sie mit &lt;br /&gt;
	#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) //Base Address&lt;br /&gt;
als AT91C_BASE_PIOA definiert. Es ist im Programm also egal ob man 0xFFFFF400 oder  AT91C_BASE_PIOA schreibt.&lt;br /&gt;
Bei AT91PS_PIO handelt es sich um einen unsigned Integer Wert.&lt;br /&gt;
Ab dieser Adresse liegen die einzelnen Konfigurationsregister. &lt;br /&gt;
In der header-Datei ist zum Zugriff auf diese eine Struktur definiert:&lt;br /&gt;
	typedef struct _AT91S_PIO {&lt;br /&gt;
		AT91_REG	 PIO_PER;  // PIO Enable Register&lt;br /&gt;
		AT91_REG	 PIO_PDR;  // PIO Disable Register&lt;br /&gt;
		AT91_REG	 PIO_PSR;  // PIO Status Register&lt;br /&gt;
		...&lt;br /&gt;
	} AT91S_PIO, *AT91PS_PIO;&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf diese Speicherzellen werden Zeiger (Pointer) verwendet. Dies kann auf 2 verschiedene Arten geschehen:&lt;br /&gt;
	AT91PS_PIO pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
	AT91S_PIO *pPIO = AT91C_BASE_PIOA;  // Global Pointer to PIO&lt;br /&gt;
pPIO ist ein Zeiger welcher auf die Struktur PIO_PER an der Adresse AT91C_BASE_PIOA zeigt.&lt;br /&gt;
Beide Deklarationen sind gleichwertig und ihre Verwendung von persönlichen Vorlieben abhängig.&lt;br /&gt;
Um auf das richtige Register im richtigen Speicherbereich zuzugreifen verwendet man  Zeigeroperationen:&lt;br /&gt;
&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = 0xFFFFFFFF;&lt;br /&gt;
setzt alle 32Bit im PIO_PER Register. Das Präfix 0x bedeutet, das die Zahl hexadezimal dargestellt wird und x-&amp;gt;y ist eine Abkürzung für den Befehl *(x.y), also ein Zeiger auf eine in einem Struct liegende Variable.&lt;br /&gt;
Normalerweise weist man Registern jedoch nicht direkt einen Wert zu, sondern setzt einzelne Bits.&lt;br /&gt;
	#define LED_MASK ( (1&amp;lt;&amp;lt;0)|(1&amp;lt;&amp;lt;1)|(1&amp;lt;&amp;lt;2)|(1&amp;lt;&amp;lt;3) )&lt;br /&gt;
(1&amp;lt;&amp;lt;n) ist eine Bitschiebeoperation. 1 wird binär um n Bits nach rechts verschoben.&lt;br /&gt;
(1&amp;lt;&amp;lt;3) ergibt binär dargestellt 1000.&lt;br /&gt;
„|“ ist der ODER – Operator. LED_MASK hat also am Ende den binären Wert 1111.&lt;br /&gt;
Die ersten 4 Bits im Register werden nun folgendermaßen gesetzt:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER = LED_MASK; // Enable PIO for LEDs&lt;br /&gt;
Eine kleine Besonderheit des AT91SAM7 ist, das die Register kein Löschen von Bits erlauben bzw. benötigen. Man muss/kann dazu das Disable- oder Clear-Register verwenden.&lt;br /&gt;
Das Gegenteil des vorherigen Befehls lautet daher:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = LED_MASK;// Disable PIO for LEDs&lt;br /&gt;
Dies erlaubt eine sehr einfache, sichere und schnelle Programmierung ohne die sonst bei Mikrocontrollern notwendigen Bitoperationen ( &amp;amp; AND, | OR) beim Schreiben in Register.&lt;br /&gt;
Manchmal benötigt man von einer Zahl nur einen Teil. Um z.B. nur die unteren 8 Bits einer Zahl n zu erhalten, um diese beispielsweise über USB zu versenden, verwendet man ((n) &amp;amp; 0xFF)&lt;br /&gt;
Dieser Befehl führt eine binäre AND Verknüpfung mit binär 11111111 durch. Alle höheren Bits werden damit zu 0.&lt;br /&gt;
Die Bitschiebeoperationen &amp;lt;&amp;lt; und &amp;gt;&amp;gt; kann man auch für eine schnelle Multiplikation bzw. Division durch Potenzen von 2 verwenden. ((n) &amp;gt;&amp;gt; 2) teilt n durch (2^2) = 4 und ((n) &amp;lt;&amp;lt; 3) multipliziert die Zahl mit (2^3) = 8.&lt;br /&gt;
Dies ist jedoch nicht unbedingt notwendig, da der Compiler diese Optimierungen (wenn sinnvoll und möglich) automatisch durchführt. &lt;br /&gt;
Bei der Programmierung von Peripheriecontrollern muss beachtet werden, das diese nach dem Einschalten bzw. nach einem Reset nicht mit einem Taktsignal versorgt werden und man dieses erst einschalten muss, indem man den Power Managment Controller konfiguriert.&lt;br /&gt;
	*AT91C_PMC_PCER =	(1 &amp;lt;&amp;lt; AT91C_ID_PIOA); // Enable Clock for PIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
&lt;br /&gt;
Das Programm make mit der dazugehörigen Konfigurationsdatei Makefile dient dazu, den Kompiliervorgang zu automatisieren.&lt;br /&gt;
Verwendet werden dabei die Optionen all (kompiliert das gesamte Projekt), clean (löscht alle durch den Compiler erzeugten Dateien) sowie program.&lt;br /&gt;
Diese werden als Parameter beim Aufruf des Programmes make übergeben.&lt;br /&gt;
Die ersten Beiden sind nicht controllerspezifisch und die Optionen werden in der make-Dokumentation erklärt.&lt;br /&gt;
Program dient dem automatischen Übertragen der kompilierten Datei auf den Controller.&lt;br /&gt;
Dazu muss der verwendete Programmieradapter angegeben werden.&lt;br /&gt;
Informationen hierzu findet man bei seinem JTAG-Adapter.&lt;br /&gt;
Die Option OPT mit den Auswahlmöglichkeiten [0, 1, 2, 3, s] stellt den Optimierungsgrad des Compilers ein.&lt;br /&gt;
0 bedeutet keine Optimierung und sollte beim Debuggen verwendet werden.&lt;br /&gt;
Im endgültigen Programm kann man 3 (schnellstmöglicher Code) oder s (kleinstmöglicher Code, in einigen Fällen daher sogar schneller als 3) verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debuggen ===&lt;br /&gt;
&lt;br /&gt;
Ein Debugger dient dazu, den Programmablauf sowie Variablenwerte während der Programmausführung zu überwachen. &lt;br /&gt;
Aufgrund der beschränkten Ressourcen auf einem Mikrocontroller kann das nicht wie bei einem PC  mit einem nebenher laufenden Programm erfolgen. Man greift daher auf die oben erwähnte JTAG-Schnittstelle zu.&lt;br /&gt;
Ein JTAG-Adapter kommuniziert dabei mit dem Mikrocontroller und das Programm OpenOCD übersetzt zwischen JTAG-Hardware und dem in der Entwicklungsumgebung implementierten Software-Debugger. Da es viele verschiedene Möglichkeiten gibt beschränke ich mich hier auf einen Link auf die Seite von OpenOCD, wo auch verwendbare Hardware aufgezählt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Startvorgang ===&lt;br /&gt;
&lt;br /&gt;
ARM-Mikrocontroller sind nicht gleich nach dem Einschalten der Betriebsspannung bereit, Befehle auszuführen, sondern müssen zuerst konfiguriert werden.&lt;br /&gt;
Atmel stellt für seine Controller sogenannte Startup-Files für verschiedene Konfigurationen zur Verfügung. Diese sind, zumindest teilweise, in Assemblercode geschrieben.&lt;br /&gt;
Sie kümmern sich um die Erzeugung des Haupttaktes mittels PLL aus dem angeschlossenen Quarz, die Platzierung von Interruptroutinen im RAM und die Behandlung von Programmfehlern.&lt;br /&gt;
Werden von einem Befehl ungültige Speicherbereiche überschrieben, kann dies abgefangen und automatisch eine Fehlerbehandlungsroutine bzw. Debugcode aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PIO ===&lt;br /&gt;
&lt;br /&gt;
Der schon teilweise in der Einleitung erwähnte PIO (Parallel Input Output) Controller kümmert sich   um einen 32-Pin breiten IO-Port (PA0 bis PA31). &lt;br /&gt;
Jeder Pin kann als allgemeiner Ein-oder Ausgang verwendet werden oder einem der beiden Peripheriecontroller (A oder B) zugewiesen werden.&lt;br /&gt;
Konfiguriert man den Pin als Eingang, indem man das betreffende Bit im Konfigurationsregister setzt, kann man einen internen Pullup aktivieren, eine Funktion zum Ausfiltern von Eingangssignalen kürzer als ein halber Taktzyklus aktivieren, was bei angeschlossensen Tastern das gefürchtete Prellen verhindert, oder einen Pin-Change-Interrupt aktivieren, welcher bei jedem Wechsel des Pinzustandes eine Routine aufrufen kann.&lt;br /&gt;
Nach dem Einschalten sind, wie schon bei der Hardwarebeschreibung erwähnt, alle Pins als Eingänge mit aktiviertem Pullup konfiguriert.&lt;br /&gt;
Der folgende Befehl schreibt den Zustand des Ports in die 32Bit breite Variable n.&lt;br /&gt;
	n = pPIO-&amp;gt;PIO_PDSR;  // Read Pin Data&lt;br /&gt;
Als Ausgang konfiguriert kann jeder Pin 8mA treiben. Die ersten 4 Pins (High-Drive) sind sogar in der Lage, 16mA zu liefern. Der Ausgang kann auch als Open-Drain konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel konfiguriert die in LED_MASK definierten Pins als Ausgänge und setzt sie auf HIGH und anschließend auf LOW:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PER  = LED_MASK;  // Enable PIO for LEDs&lt;br /&gt;
	pPIO-&amp;gt;PIO_OER  = LED_MASK;  // LED1..4 are Outputs&lt;br /&gt;
	pPIO-&amp;gt;PIO_SODR = LED_MASK;  // Turn on LED&#039;s (&amp;quot;1&amp;quot;)&lt;br /&gt;
	pPIO-&amp;gt;PIO_CODR = LED_MASK;  // Turn off LED&#039;s (&amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Will man einen Pin nicht als allgemeinen Ein-bzw. Ausgang nutzen, sondern z.B. die SPI-Schnittstelle verwenden, muss man den Pin einem der beiden Peripheriecontroller zuweisen:&lt;br /&gt;
	pPIO-&amp;gt;PIO_ASR = ( AT91C_PA13_MOSI );  //MOSI Pin Controller A zuweisen&lt;br /&gt;
und den PIO-Controller für diesen Pin deaktivieren:&lt;br /&gt;
	pPIO-&amp;gt;PIO_PDR = ( AT91C_PA13_MOSI );  //PIO für MOSI deaktivieren&lt;br /&gt;
Im Datenblatt werden die Funktionen der einzelnen Pins aufgelistet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UART ===&lt;br /&gt;
&lt;br /&gt;
Die Verwendung der seriellen Schnittstelle USART (Universal Synchronous Asynchronous Receiver Transceiver) zur Kommunikation mit einem PC wird anhand eines Beispieles erklärt:&lt;br /&gt;
&lt;br /&gt;
AT91PS_USART * pUSART = AT91C_BASE_US1;  //Global Pointer to USART1&lt;br /&gt;
&lt;br /&gt;
void uart1_init (void) {  //Initialize Serial Interface&lt;br /&gt;
	//Zuerst den Takt für den Schnittstellencontroller aktivieren&lt;br /&gt;
*AT91C_PMC_PCER = (1 &amp;lt;&amp;lt; AT91C_ID_US1);  // Enable Clock for USART1&lt;br /&gt;
&lt;br /&gt;
//Die Pins 21 und 22 werden dem Peripheriecontroller A zugewiesen. &lt;br /&gt;
//Dieser hat somit die Kontrolle über sie.&lt;br /&gt;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 |  // Enable RxD1 Pin */&lt;br /&gt;
                  AT91C_PA22_TXD1;   // Enable TxD1 Pin */&lt;br /&gt;
&lt;br /&gt;
//Zuerst wird ein Reset der Schnittstelle ausgelöst &lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RSTRX |   // Reset Receiver&lt;br /&gt;
                  AT91C_US_RSTTX |   // Reset Transmitter&lt;br /&gt;
                  AT91C_US_RXDIS |   // Receiver Disable&lt;br /&gt;
                  AT91C_US_TXDIS;    // Transmitter Disable&lt;br /&gt;
&lt;br /&gt;
//Im Mode Register werden alle Einstellungen durchgeführt&lt;br /&gt;
  pUSART-&amp;gt;US_MR = AT91C_US_USMODE_NORMAL |  // Normal Mode&lt;br /&gt;
                  AT91C_US_CLKS_CLOCK    |  // Clock = MCK&lt;br /&gt;
                  AT91C_US_CHRL_8_BITS   |  // 8-bit Data&lt;br /&gt;
                  AT91C_US_PAR_NONE      |  // No Parity&lt;br /&gt;
                  AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit&lt;br /&gt;
&lt;br /&gt;
//eine Baudrate von 115200Baud wird gesetzt&lt;br /&gt;
  pUSART-&amp;gt;US_BRGR = (MCK/16/115200 );  // Baud Rate Divisor&lt;br /&gt;
&lt;br /&gt;
//und die Schnittstelle aktiviert&lt;br /&gt;
  pUSART-&amp;gt;US_CR = AT91C_US_RXEN  |  // Receiver Enable&lt;br /&gt;
                  AT91C_US_TXEN;    // Transmitter Enable&lt;br /&gt;
}&lt;br /&gt;
//Die Funktion sendet einen 8Bit Wert &lt;br /&gt;
int uart1_putc(int ch) { // Write Character to Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_TXRDY)); // Wait for Empty Tx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_THR = ch);               // Transmit Character&lt;br /&gt;
}&lt;br /&gt;
//warten, bis ein Byte empfangen wurde, und dieses ausgelesen&lt;br /&gt;
int uart1_getc ( void ) { // Read Character from Serial Port&lt;br /&gt;
	while (!(pUSART-&amp;gt;US_CSR &amp;amp; AT91C_US_RXRDY));  // Wait for Full Rx Buffer&lt;br /&gt;
	return (pUSART-&amp;gt;US_RHR);                     // Read Character&lt;br /&gt;
}&lt;br /&gt;
Die serielle Schnittstelle ist sehr einfach zu verwenden und vor allem beim Fehlersuchen sehr praktisch. Zum Anschluss an einen PC benötigt man jedoch einen geeigneten Pegelkonverter, welcher den 0V/3.3V Pegel des Mikrocontrollers auf +-12V shiftet.&lt;br /&gt;
Man muss ebenfalls auf die Taktgeschwindigkeit des Controllers aufpassen, da dieser nicht mit jeder Einstellung einen für schnelle USART-Übertragung geeigneten Takt erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
&lt;br /&gt;
SPI oder Microwire ist ein von Motorola entwickeltes serielles Bussystem, das in vielen Mikrocontrollern implementiert ist. Es gibt dabei einen Master, welcher maximal 255 Slaves anspricht. Die Slaves dürfen nur nach Aufforderung durch den Master senden. Der Bus besteht aus 3 Leitungen:&lt;br /&gt;
MOSI (Master Out Slave In), auch als SDO (Serial Data Out) bezeichnet&lt;br /&gt;
MISO (Master In Slave Out) oder SDI (Serial Data In) sowie &lt;br /&gt;
SCK (System Clock)&lt;br /&gt;
Zusätzlich benötigt man zu jedem Slave eine Slave Select (SS) oder Cable Select (CS) Leitung, mit welcher der Master den oder die angesprochenen Slaves selektiert.&lt;br /&gt;
Der Bus benötigt daher relativ viele Leitungen (min. 3 + 1 Select pro Slave für bidirektionale Kommunikation), ist aber recht schnell und sehr flexibel.&lt;br /&gt;
Daher wird er auch oft für Punkt-zu Punkt Hochgeschwindigkeitsverbindungen wie z.B. zwischen Mikrocontroller und externem Speicher oder in modernen PC zur Anbindung des BIOS-Flash-Speichers an die Southbridge verwendet.&lt;br /&gt;
Es gibt kein festgelegtes Übertragungsprotokoll und ebenfalls mehrere Übertragungsmöglichkeiten:&lt;br /&gt;
Daten können entweder „Little Endian“, d.h. das LSB (Least significant Bit, also niederwertigstes Bit) wird zuerst übertragen, oder aber „Big Endian“, wo das MSB (Most significant Bit) zuerst geschickt wird, gesendet werden. Je nach Gerät werden die Daten bei steigender oder fallender Taktflanke übernommen und ob ein HIGH- oder LOW-Pegel am SS Eingang den Slave aktiviert ist ebenfalls unterschiedlich. Der Takt kann im Ruhezustand ebenfalls entweder HIGH oder LOW sein und pro Übertragung können zwischen 8 und 16 Bit geschickt werden.&lt;br /&gt;
Die SPI Implementierung im Controller muss also hochgradig konfigurierbar sein.&lt;br /&gt;
Wie bei allen Peripherieeinheiten des AT91SAM7 muss auch bei SPI zuerst der Takt aktiviert und die Pins dem richtigen Peripheriecontroller zugewiesen werden.&lt;br /&gt;
Um einen Wert (8 bis 16Bit breit, je nach Einstellung) zu senden, schreibt man ihn in das SPI_TDR Register.&lt;br /&gt;
Er wird dann automatisch im Hintergrund übertragen, und sobald der Wert gesendet ist, wird je nach Konfiguration ein Interrupt aufgerufen oder nur das Bit AT91C_SPI_TDRE (Transmit Data Register Empty) im SPI_SR Register gesetzt.&lt;br /&gt;
Ein empfangener Wert landet im SPI_RDR Register. Bei Empfang kann ebenfalls ein Interrupt ausgelöst oder nur das Bit SPI_RDRF (Receive Data Register Full) gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmable Clock Output Controller ===&lt;br /&gt;
&lt;br /&gt;
Als sehr praktisch hat sich der programmierbare Taktausgang erwiesen.&lt;br /&gt;
Dieser kann auf 3 Pins PCK0..2 ein durch Division durch Potenzen von 2 aus dem PLL- Prozessor-oder 32kHz- Slow-Clock Signal gewonnenes Taktsignal ausgeben.&lt;br /&gt;
Die Signale können per Software ein- oder ausgeschaltet werden.&lt;br /&gt;
Es zeigte sich, das die generierten Signale sehr frequenzstabil sind und nur einen sehr kleinen Jitter aufweisen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== USB ===&lt;br /&gt;
&lt;br /&gt;
Die USB-Schnittstelle des AT91SAM7Sxxx hat eine maximale Bandbreite von 1Mbytes/s und entspricht der USB 2.0 full-speed Spezifikation. Diese sieht einen mit einem Transistor schaltbaren Pullup Widerstand auf 3,3V vor, mit dem das Gerät seinen Anmeldewunsch mitteilen kann. Man kann auf diesen auch verzichten und die Datenleitung über 1,5kOhm direkt mit 3,3V verbinden. Der Controller muss sich dann direkt nach dem Start korrekt am PC anmelden, da dieser sonst nach einer Timeout-zeit meldet, das das USB-Gerät nicht erkannt wurde. Die Einhaltung des Zeitfensters stellte jedoch auf allen getesteten Systemen kein Problem dar.&lt;br /&gt;
Der USB-Controller muss mit 48MHz +-0,25% getaktet werden. Der dazu nötige PLL-Takt von 96MHz (2*48MHz) wird aus dem Quarztakt von 18,432MHz erzeugt und beim Startup-Vorgang eingestellt. &lt;br /&gt;
Empfehlenswert ist das Framework von ATMEL, welches einen virtuellen COM-Port auf dem PC (getestet mit Windows XP + VISTA) zur Verfügung stellt.&lt;br /&gt;
Näheres steht auf der ATMEL-Seite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Natürlich schrecken die enormen Möglichkeiten des Controllers im ersten Moment ab, aber wenn man die Anleitungen Schritt-für-Schritt durchgeht und an einem interessanten Beispielprojekt von ATMEL etwas herum spielt, wird man bald Freude daran finden.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß dabei!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interessante Seiten + Downloads ==&lt;br /&gt;
&lt;br /&gt;
AT91SAM7S Microcontroller Series Schematic Check List&lt;br /&gt;
* http://www.atmel.com/dyn/resources/prod_documents/doc6258.pdf&lt;br /&gt;
&lt;br /&gt;
SAM-BA&lt;br /&gt;
* http://atmel.com/dyn/products/tools_card.asp?tool_id=3883&lt;br /&gt;
&lt;br /&gt;
YAGARTO&lt;br /&gt;
* http://yagarto.de/&lt;br /&gt;
&lt;br /&gt;
Aplication Notes&lt;br /&gt;
* http://atmel.com/dyn/products/app_notes.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
ATMEL- Software&lt;br /&gt;
* http://atmel.com/dyn/products/tools.asp?family_id=605&lt;br /&gt;
&lt;br /&gt;
OpenOCDDebugger&lt;br /&gt;
* http://openocd.berlios.de/web/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
ARM Entwicklung unter Windows Vista&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/ARM_Entwicklung_unter_Windows_Vista]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ARM]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29183</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29183"/>
		<updated>2008-07-21T17:42:54Z</updated>

		<summary type="html">&lt;p&gt;Luky: /* Downloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität. Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
Layouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bilder&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte]][[Kategorie:Wettbewerb]]&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SO8.PDF&amp;diff=29182</id>
		<title>Datei:SO8.PDF</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SO8.PDF&amp;diff=29182"/>
		<updated>2008-07-21T17:41:57Z</updated>

		<summary type="html">&lt;p&gt;Luky: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29181</id>
		<title>SMD 2 Steckbrett Adapter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=SMD_2_Steckbrett_Adapter&amp;diff=29181"/>
		<updated>2008-07-21T16:41:26Z</updated>

		<summary type="html">&lt;p&gt;Luky: Artikel online gestellt für Artikelwettbewerb&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Manchmal kommt der Wunsch auf, SMD-Bauteile auf dem Steckbrett oder einer Lochrasterplatine einzusetzen. Bei Lochraster gibt es ja bekanntlich die wildesten Konstruktionen, um SMD-ICs verwenden zu können, aber für Steckbretteinsätze habe ich nichts wirklich brauchbares zu vernünftigen Preisen gefunden. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Ich habe mir daher ein paar Adapter von häufig verwendeten SMD-Gehäusen auf ein Steckbretttaugliches Format entworfen und möchte diese nun hier vorstellen. Es handelt sich um einfache, einseitige Platinen welche sehr einfach auch auf Reststücken geätzt werden können.&lt;br /&gt;
Die Adapter bestechen durch ihre Universalität. Das bedeutet aber umgekehrt auch, das je nach verwendetem IC und gewünschter Beschaltung auf dem Adapter ev. ein paar Anpassungsarbeiten mit einem scharfen Messer (ein Skalpell ist sehr empfehlenswert!) und Lötzinn notwendig sein können.&lt;br /&gt;
Zum Verbinden mit dem Steckbrett verwende ich gewöhnliche Stiftleisten, allerdings sollte man vorher prüfen, ob diese ohne Beschädigung ins gewünschte Steckbrett passen.&lt;br /&gt;
100nF Block- und ev. auch die Bufferkondensatoren sollten direkt als SMD-Bauteile auf den Adapter gelötet werden. Auch Einstellwiderstände kann man wunderbar direkt auf den Adapter anbringen und sich so z.B. direkt einen zweistufigen Verstärker oder Filter mit einem SO8 OPV aufbauen, der nur noch ins Steckbrett gesteckt werden muss und einen Eingang sowie einen Ausgang nebst Spannungsversorgung hat.&lt;br /&gt;
Es ist eine Massefläche vorgesehen, welche natürlicherweise mit den GND-Pins des ICs verbunden werden muss. Hat dieser getrennte Analog-und Digitalmassen, macht es bei einem Testaufbau meist keinen Sinn, diese zu teilen da dies bei einen Steckbrettaufbau nichts bringt. Hochpräzise Analogschaltungen oder gar HF-Komponenten sind auf diesen Adaptern definitiv falsch aufgehoben, aber bei ADC/DACs, Konverter, Schnittstellenbausteine und Speicher kann man zumindest die Funktion überprüfen, wenn auch nicht immer mit voller Taktrate und Auflösung.&lt;br /&gt;
&lt;br /&gt;
Die Teile sollten Selbsterklärend sein, also werde ich einfach die Layouts als PDF zur Verfügung stellen sowie einige Bilder der Adapter im Einsatz als Inspiration.&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
Layouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bilder&lt;/div&gt;</summary>
		<author><name>Luky</name></author>
	</entry>
</feed>