lernen an praktischen Beispielen . . .
Es wird gezeigt wie man mit einfachen Mitteln eine Atmega4809-CPU per UPDI
programmieren kann.
Ein einfacher UPDI-Programmer und der Umgang damit wird vorgestellt.
Ein einfaches Testprogramm mit LED wird erstellt und über Bootloader
geladen.
Es wird gezeigt wie man eine Entwicklungsumgebung für C einrichtet und
ein erstes Programm zum Laufen bringt.
Viel Erfolg !
Video: "UPDI Programming an ATmega4808" |
|
es ist mit einfachen Mitteln möglich einen Atmega4808 mit einem
kleinen Programm zu versehen. Das Video zeigt wie es geht.. der Atmega4809
hat mehr Pins und damit mehr Möglichkeiten. Der Umgang damit ist
jedoch ebenso einfach.. siehe unten.. |
In den 70er Jahren waren Computer kein Allgemeingut. Mein erster Taschenrechner
am Gymnasium - ein Triumph-Adler 88T mit grüner Fluoreszenzanzeige und
Sin/Cos/Tan - kostete 260 DM. Die 4 NiCd-Akkuzellen waren rasch leer. Der
Brother 738SR für das Mathe/Physik-Abitur lief mit seiner stromsparenden
LCD-Anzeige mit 2 LR44-Knopfzellen mehr als 1 Jahr.
1977 gab es am Asam-Gymnasium einen Computerraum mit HP9810A-Rechner. Ein
rotes LED-Display zeigte die Rechenregister X, Y, Z an. Programme wurden auf
Magnetstreifenkarten (eingebaute Lese-/Schreib-Einheit) oder Loch-/Strichkarten
(Lesegerät HP98603A) gespeichert. Der Plotter (HP98623A) erlaubte hochauflösende
graphische Ausgaben. Die US-Preise lagen bei $2475 Rechner, $675 Drucker,
$485 Plotter, $500 500 weitere mögliche Programmschritte, $485 Mathe-Modul
Sin/Cos + Plotten, $485 Statistik-Modul. Das System wurde 1971 von HP als
Nachfolger des HP9100A eingeführt.
Im Elektrotechnik-Studium ab 1979 war es nicht einfach privat etwas mit Mikroprozessoren
wie 8080, 8085, Z80 oder 68000 zu entwickeln, denn preiswerte PCs, Laptops,
Monitore, Drucker, C-Compiler gab es nicht. Ein PET 2001-Computer mit 1MHz-CPU
und Kassettenlaufwerk als Massenspeicher kostete anfangs um 3000 DM.
An der TU München wurde von uns Studenten statt "C" Umgang
mit Fortran gefordert. Die Zeilen des Programms konnte man mit großen
Stanzgeräten codiert auf Karten lochen und diese im Leibnitz-Rechenzentrum
einlesen lassen. Bei Fehlern im Programm lochte man neue Karten. Für
wenige Studenten gab es Platz an einen Eingabeterminal um die Arbeit mit den
Lochkarten zu vermeiden.
Fa. Intel hatte ein Entwicklungssystem für MCS80-Mikroprozessoren, das
um 50000 DM teuer in Firmen wie Siemens stand. Betriebssystem und Programme
wurden auf großen 5 1/4"-Disketten gespeichert. RAM-Speicher mit
1MB oder mehr - Fehlanzeige.
Wer als Student ohne viel Geld etwas mit Mikroprozessoren machen wollte musste
lernen mit einfachsten Mitteln Ergebnisse zu erzielen. Ein einfaches Entwicklungsboard
mit 8085 ließ sich als doppelseitige Leiterplatte auflösen, mit
Höhensonne belichten und ätzen. Als Durchkontaktierung diente abisolierter
Kupferdraht. Platinen rasch mal per Internet in China billig machen lassen
- Fehlanzeige. Leiterplattenerstellung per PC - Fehlanzeige. Das Layout wurde
1:1 auf Transparentpapier erstellt. Die Lochreihen und Durchkontaktierungen
wurden aufgeklebt/aufgerubbelt und die Leiterbahnen kamen von einer schmalen
Rolle. Nach dem Ätzen wurde von Hand jedes Loch gebohrt. Lötstopplack
- Fehlanzeige.
Statt C-Compiler oder Assembler war Maschinensprache nutzbar. Programme ließen
sich mit Bleistift auf Papier schreiben. Die Adressen für die Sprünge
konnte man von Hand ausrechnen. Programme ausdrucken - Fehlanzeige. Kopierer
oder Scanner Fehlanzeige.
Statt einem teurem Monitor als Ausgabe konnte man sich eine Hexadezimal-Anzeige
zusammenbauen zur Anzeige von Adresse und Daten. Der Programmablauf ließ
sich einzelschrittweise verfolgen. Es war möglich Programmcode in einem
2kB-RAM-Speicher abzulegen und ihn dort zu entwickeln. Um den Code beim Abschalten
des Netzteils nicht zu verlieren ließ sich das RAM per Batterie puffern.
Erst wenn das Programm brauchbar funktionierte brannte man sich ein EPROM.
Da Programmiergeräte teuer waren konnte man sich selbst etwas bauen mit
ein paar Tasten, 7-Segment-Anzeigen, Dekodern, Treibern, Timern und Logik.
Komfortabler wurde das Programmieren von EPROMs durch eine Zusatzplatine für
Anschluss am parallelen Bus der Mikrocontroller-Platine. Ein extra Netzteil
lieferte die für EPROMs nötige Programmierspannung von 21V.
Für das Löschen der EPROMs gab es teure UV-Löschgeräte.
Billiger war es eine UV-Lampe als Sonderangebot zu erwerben und ein Gehäuse
darum zu bauen.
Wenn man eine Ausgabe auf Bildschirm wollte war dazu ein alter Schwarzweiß-Fernseher
nutzbar in den man eine Buchse hinten einbaute. Etwa 40 Zeichen pro Zeile
ließen sich brauchbar lesbar darstellen. Das nötige Videointerface
dazu konnte man auf einer Leiterplatte aufbauen. Die Punkte für die Zeichen
wurden aus einem Character-ROM ausgelesen. Eine Logik mit Zählerbausteinen
erzeugte das Video-Signal für die Darstellung auf dem Fernseher.
Für Studenten bezahlbare Laptops mit Tastatur und hochauflösendem
TFT-Display gab es zur Ein- und Ausgabe noch lange nicht. Man konnte sich
ein Video-Terminal zusammenzubauen mit Z80. Nur kostete das eine Menge Geld
für Gehäuse, Netzteil, Platine, CPU, Speicher, Videochip.
Eine Tastatur zur Eingabe von Zeichen über parallele bzw. serielle Schnittstelle
kostete 1981 mehr als heute ein gebrauchter Laptop. Von Fa. Rafi bekam ich
eine hochwertige Tastatur ohne Gehäuse und das nötige EPROM für
30 DM. Durch Messen am Sockel fand ich heraus was programmiert werden muss
um bei Tastendruck den gewünschten ASCII-Code auf die parallele Schnittstelle
zu bekommen. Ein Gehäuse dazu klebte ich aus Sperrholzteilen zusammen,
rundete die Ecken ab und lackierte es weiß.
Die Softwarebasis des selbstgebauten 8085-Systems war ein kleines Monitorprogramm
dessen Funktionen man selbst erweitern konnte. Das Programm las die Zeichen
von der Tastatur ein, verarbeitete diese Eingaben, beschrieb den RAM-Speicher,
programmierte EPROMs und gab Zeichen über das Videointerface aus.
Um Erfahrungen mit 16bit-Mikroprozessoren zu sammeln wurde ein 68000-System
aufgebaut. Die ICs wurden auswechselbar in Carrierstifte gesteckt. Diese wurden
auf der Unterseite der Doppeleuropakarte mit Fädeldraht verbunden. Auf
eine zweite solche Leiterplatte kam batteriegepufferter SRAM-Speicher. Die
Teile waren teuer, aber das Ergebnis zufriedenstellend. Am Ende lief auf dem
Board ein 68000-Assembler.
Zur Inbetriebnahme der Systeme war ein gutes Oszilloskop wichtig. Das 70MHz-Oszilloskop
HM705 von Hameg mit 2 Kanälen und Trigger after Delay kostete 1983 2179
DM.
Fazit:
Der Selbstbau eines 8085- oder 68000-Mikroprozessorsystems für Lernzwecke
war um 1983 zeitintensiv, teuer, aber lehrreich. Trotz Draht-Wirrwarr mit
Lackdraht auf der Platinenunterseite funktionierte das 68000-System gut. Per
Tastspitze konnte man an jedem Pin leicht messen.
Heute ist vieles einfacher, denn es gibt preisgünstige Mikrocontrollerchips
mit
+ integriertem, elektrisch wiederprogrammierbarem Flash-Speicher,
+ integriertem SRAM-Schreib-Lese-Speicher,
+ integrierter Peripherie wie USART, SPI, I2C.
Dazu gibt es
+ preisgünstige gebrauchte Laptops,
+ freie C-Compiler und Entwicklungswerkzeuge.
Um zu lernen wie Dinge zusammenhängen und was mit einfachen Mitteln möglich
ist dient dieses Tutorial.
Mikrocontroller bestehen aus vielen Transistorfunktionen. Zunächst verwendete
man einzelne Transistoren für den Bau von Rechenanlagen. Leiterplatten
konnten diverse Transistoren und auch Kernspeicher aufnehmen. Dann wurden
Transistoren auf Siliziumscheiben integriert. Durch stetige Verkleinerung
ließen sich immer mehr Transistoren auf kleinerer Fläche unterbringen.
Transistorfunktionen
Schauen wir kurz wie sich Transistorschaltungen über die Jahre entwickelt
haben:
1943 patentierte gedruckte Leiterplatte (Paul Eisler)
1947 funktionsfähiger Germanium-Transistor (Shockley, Bardeen, Brattain)
1953 erster Silizium-Einkristall (Siemens-Verfahren)
1954 erster funktionsfähiger Silizium-Transistor (Gordon Teal), Transistor-Radio
1961 monolitisch integrierte Schaltung (RTL-Patent Bob Noyce)
1966 Standard TTL Quad Nand Gate-Gatter mit 2 Eingängen (Fairchild)
1967 DTL-Logik-Array mit 32 Gattern (Fairchild)
1969 4-Chips für Rechenmaschinen: 4bit Logik-IC CPU, ROM, RAM, Schieberegister
(Ted Hoff, Intel)
1970 Entwicklung Intel 4001 (2048bit ROM), 4002 (320bit RAM), 4003 (10bit
Schiebereg.), 4004 (4bit CPU)
1971 4bit Mikroprozessor Intel 4004 in Serie (4 Chip-Design von Ted Hoff)
1972 8bit Mikroprozessor Intel 8008 als Nachfolger 4004 mit 2250 Transistoren,
108kHz
1974 erster vollwertiger 8bit-Mikroprozessor Intel 8080 mit 4500 Transistoren,
2MHz
1974 8bit Mikroprozessor Motorola 6808
1975 8bit Mikroprozessor AMD 8080A
1975 8bit Mikroprozessor Zilog Z80 (Federico Faggin)
1976 8bit Mikrocontroller Intel 8748 - Familie MCS-48
1978 Fairchild Advanced Schottky TTL (FAST)-Logik (Fairchild)
1978 16bit Prozessor Intel 8086 mit 29000 Transistoren, 5-10MHz
1979 abgespeckter 16bit Prozessor Intel 8088 mit 8bit-Bus
1979 32bit Prozessor Motorola 68000 mit 68000 Transistoren
1982 16bit Prozessor Intel 80286 mit 134000 Transistoren für AT-Rechner
1984 32bit Prozessor Motorola 68020
1985 32bit Prozessor Intel 386DX mit 275000 Transistoren
1985 Fairchild Advanced CMOS Technologie (FACT)-Logik (Fairchild)
1993 32bit Prozessor Intel Pentium 80586 60-233MHz
1994 32bit Mikrocontroller Motorola 68F333 auf Basis 68000
1995 32bit Prozessor Intel Pentium Pro 150-200MHz
1997 32bit Prozessor Intel Pentium II 80686 233-400MHz
1999 32bit Prozessor Intel Pentium III 450-600MHz
2000 32bit Prozessor Intel Pentium 4 1.3-2GHz
2004 32bit Prozessor Intel Pentium 4 Prescott 3,8GHz usw.
Mikroprozessoren und Mikrocontroller lebten von Basisentwicklungen wie die
4 Chips der 4000-Serie von Intel, deren Integration zum Durchbruch mit den
8bit-Controllern 8080 und 8085 führte. Der Z80 war noch fortschrittlicher.
Es folgte der 16bit-Prozessor Z8000.
Kleinere Strukturen in der Halbleiterindustrie ermöglichten die Integration
von immer mehr Transistoren bei steigenden Taktfrequenzen und fallender Spannung.
Die Entwicklung ging von 4bit über 8bit, 16bit, 32bit zu 64bit-Systemen.
Speicher
Mikrocontroller brauchen Speicher für Programm, Stack und Daten. Anfangs
wurden recht kleine Lesespeicher ROM (ReadOnlyMemory) und Schreib-Lese-Speicher
RAM (RandomAccessMemory)-Speicher eingesetzt.
Da ROM-Speicher nicht mehrmals beschrieben werden kann musste der Code fehlerfrei
sein, bevor man ihn so verewigen konnte. Schreib-Lese-Speicher RAM war vergleichsweise
teuer. Beim Abschalten der Spannung verlieren RAMs ihren Inhalt. Parallel
angesteuerte batteriegepufferte RAMs (z.B. 8kB) waren gut aber teuer.
Ein paralleler Zugriff auf Speicher erforderte viele Pins und damit viel Platz
auf der Leiterplatte. Platzsparende SMD-Bauweise mit kleinen Balls unter dem
Chip gab es damals nicht. Dafür war der parallele Zugriff schnell weil
Daten und Adressen rasch übertragen werden konnten.
EPROM-Speicher (EraseableProgrammableReadOnlyMemory) waren ein Fortschritt
weil man solche Speicher mehrmals mit UV-Licht löschen (spezielle Lampe)
und mit Hilfe einer erhöhten Programmierspannung (z.B. 21V) elektrisch
neu beschreiben konnte.
Bequemer handhabbar waren elektrisch löschbare Speicher EEPROM (ElectricErasableProgrammableReadOnlyMemory)
ab 1986 weil die lange Wartezeit für das Löschen per UV-Lampe so
entfiel. Da bei EEPROM auf das Quarzfenster verzichtet werden konnte waren
die Bausteine billiger.
Es folgten Flash-Speicher die anfangs jedoch nicht sehr viele Schreib-/Löschzyklen
vertragen konnten.
1974 UV-Licht löschbarer ErasableProgrammableReadOnlyMemory NMOS-EPROM
(George Perlegos)
1986 elektrisch löschbarer nichtflüchtiger Speicher in CMOS-Technologie
(Fairchild)
Rechner-Architekturen
Hard- und Software von Rechnern und Controllern wandelten sich über die
Zeit.
Auf Rechner mit Mechanik, Relais, Röhren folgten Transistoren und integrierte
Schaltkreise ICs.
1623 zahnradgetriebene Rechenmaschine (Wilhelm Schickard, Tübingen)
1937 Rechenmaschine (Binärziffernmaschine) Z1 (Konrad Zuse)
1939 Relais-Rechenmaschine Z2 (Konrad Zuse)
1941 frei programmierbarer Rechner Z3: 600 Relais für Rechenwerk, 1600
Relais für Speicher (Konrad Zuse)
1944 Relaisrechner Harvard Mark I mit Lochstreifen (Howard H. Aiken)
1946 Electronic Numerical Integrator and Computer ENIAC: 17468 Röhren,
1000 Rechnungen/Sekunde
1950 mechanische Rechenmaschinen mit Handkurbel bei Fa. Moll
1951 UNIVersal Automatic Computer UNIVAC I (Eckert-Mauchly Computer Corporation)
1952 Relais-/Röhrenrechner ARRA (Mathematisches Zentrum Amsterdam)
1954 Relais-/Röhrenrechner ARRA II
1955 TRansistorized Airborne DIgital Computer TRADIC (AT&T Bell Labs)
1958 Electrologica X1 mit Germanium-Transistoren, Dioden (Bart Loopstra, Carel
Scholten)
1959 IBM 1401 mit Transistoren, Kondensatoren, Dioden auf Platinen
1962 mechanische Rechenmaschine Walther für Addition/Subtraktion
1963 mechanische Rechenmaschine Walther Admulta für Addition/Subtraktion/Multiplikation/Division
1964 erster Tischrechner mit Transistoren, Kernspeicher IME 84 (Industria
Macchine Elettroniche)
1967 erster Taschenrechner (Jack Kilby, Jerry Merryman, James Van Tassel von
Texas Instruments)
1968 Demonstration Computermaus (Douglas C. Engelbart)
1975 Altair 8800-Computer, programmiert per Kippschalter (Ed Roberts)
1976 Apple I-Rechner der Fa. Apple Computer (Steve Wozniak, Steve Jobs, Ron
Wayne)
1977 Apple II-Rechner
1977 Personal Electronic Transactor PET 2001 1MHz MOS6502, 4kB RAM (Chuck
Peddle, Commodore)
1981 IBM-PC 5150 mit Intel 8088, 4.77MHz, 48kB RAM, 5 ISA-Slots, Betriebssystem
PC-DOS
1983 Apple Lisa mit graphischer Bedienoberfläche, 1MB RAM
1984 Apple Macintosh mit 68000, graphischer Oberfläche, Maus, flimmerfreiem
Schwarzweißbildschirm
1984 IBM PC AT mit 80286, 6MHz, bis 16MB RAM, 1.2MB Floppy Disk
1994 32bit Mikrocontroller Motorola 68F333 auf Basis 68000
2023 64bit Mikroprozessor Intel Core i9 mit 16 CPU, 5.5GHz bis 128GB RAM
Leider setzte sich die bessere 68000-Architektur gegenüber 8086/80x86
bei PCs nicht durch. IBMs PC-Design mit Steckplätzen die eine Erweiterung
erlaubten fand Nachahmer und verbreitete sich durch billigere kompatible Rechner
aus Fernost rasch. Es folgten Entwicklungen wie PowerPC, ARM und RISC-V.
Betriebssysteme
Als Ablaufsteuerung für PCs kamen Betriebssysteme wie PC-DOS, MS-DOS
und Windows:
1970 Betriebssystem für PDP7 in 8kB (Ken Thompson, Dennis Ritchie)
1981 IBM-PC mit Betriebssystem PC-DOS
1985 Microsoft Windows
1995 Windows 95-Betriebssystem
Entwicklungshilfsmittel
Mindestens genauso wichtig wie der Mikrocontroller-Chip selbst sind dazu passende
Entwicklungshilfsmittel für Hard- und Software.
Vieles zum Thema Mikrocontroller ist heute online im Internet zu finden und
oft gratis herunterzuladen. Das Internet begann in den 70er Jahren und wurde
gegen 1998 populär als mehr Menschen einen Zugang dazu hatten - erst
per Modem z.B. Call by Call und dann per DSL-Router, Kabel-Router oder Glasfaser.
1969 Arpanet als Vorläufer des Internet
1973 Erfindung Ethernet (Robert Metcalfe)
Für die Entwicklung von Hardware finden sich auf den Seiten der Hersteller
Datenblätter der Chips und dazu Applikationshinweise, Schaltpläne,
Bauteile und Entwicklungsboards.
Auf der Softwareseite gibt es Hilfsmittel wie Assembler, C-Compiler, BASIC-Interpreter,
Microphython und Treiber für Bauteile wie Feuchtesensoren, Temperatursensoren,
AD-Wandler, DA-Wandler, Displays. Wer mag kann sich Treiber auch selbst schreiben.
Dabei lernt man eine ganze Menge.
Es gibt auch Projekte wie Arduino wo unterschiedliche Mikrocontroller programmiert
und getestet auf Leiterplatten angeboten werden. Dazu gibt es eine kostenlose
integrierte Entwicklungsumgebung IDE, wo C-Code eingegeben, kompiliert, auf
das Board geladen und getestet werden kann. Es ist auch möglich bei Bedarf
einen passenden Bootloader zu installieren, der genutzt werden kann um Code
aufzuspielen.
Bücher vermitteln Basiswissen oder fortgeschrittenes Wissen zu Mikrocontrollern.
Zu manchen Büchern gehören auch Bauteilsätze um die Beispielprogramme
aus dem Internet gleich auszuprobieren. Es ist viel einfacher auf solche Art
und Weise mit Fertighardware an Beispielen und deren Änderungen zu lernen
als von Null mit einem unprogrammierten Einzelchip anzufangen.
Falls Probleme auftreten gibt es im Internet Foren wo man Fragen stellen kann.
AVR-Mikrocontroller
Interessante Mikrocontroller wie die AVR-Serie wurden von der Fa. Atmel entwickelt
die mittlerweile von Fa. Microchip übernommen wurde. Atmel startete die
Entwicklung mit einer 8bit CPU und bot dann auch eine größere Variante
an die hier nicht betrachtet werden soll.
1984 Gründung Fa. Atmel (George Perlegos)
1992 Erfindung AVR-CPU durch 2 unzufriedene Studenten (Alf-Egil Bogen, Vegard
Wollan)
1997 Fa. Atmel stellt den Mikrocontroller Atmel AVR vor
2003 500Mio Mikrocontroller Atmel AVR verschickt
2007 Atmel AVR für Arduino Uno startet Erfolgsgeschichte der Arduino-Produkte
2015 7 Mrd Mikrocontroller Atmel AVR verschickt
Das Besondere an den Atmel AVR ist die RISC-Architektur. RISC bedeutet "Reduced
Instruction Set Computer". Im Gegensatz zu CISC "Complex Instruction
Set Computer" wird ein reduzierter Befehlssatz verwendet. Der Rechnerkern
kann daher kleiner ausfallen und die meisten Befehle schneller abarbeiten.
Viele Befehle werden beim AVR in einem Zyklus abgearbeitet.
Mit AVR-GCC steht für die AVR-Chips ein leistungsfähiger kostenloser
C-Compiler zur Verfügung. Es gibt auch den BASIC-Compiler BASCOM.
Obwohl 8bit Busbreite im Zeitalter von 32 oder 64bit-Anwendungen überholt
erscheinen mag kann man damit gut lernen und arbeiten. Wichtig ist es zu verstehen
was man tut.
Es waren 2 Studenten die 1992 aus Unzufriedenheit die AVR-Controller erfanden.
Eine Erfolgsgeschichte begann die unter Fa. Microchip fortgesetzt werden soll.
Hier soll der Atmega4809 näher betrachtet werden.
Mikrocontroller Atmega4809 |
Der Atmega4809-Mikrocontroller verfügt über Eigenschaften wie:
+ 48kB Flash-Programmspeicher (10000 Programmierzyklen)
+ 6kB SRAM (Schreib-Lese-Speicher)
+ 256 Bytes EEPROM (elektrisch löschbarer Speicher, 100000 Programmierzyklen)
+ 32 8bit-Register R0-R31
+ Hardware-Multiplizierer (für Multiplikation 8bits auf 16bit in 2 Zyklen)
+ 20MHz interner Oszillator (bei 5V, 105°C)
+ 32768Hz interner Oszillator
+ 16bit Timer/Counter mit Compare-Funktion
+ 16bit Timer/Counter mit Input-Capture-Funktion
+ 16bit RealTimeCounter RTC
+ 4 USART für serielle Ein-/Ausgabe
+ SPI-Interface für schnelle Ein-/Ausgabe über SPI-Bus
+ TWI-Interface für Ein-/Ausgabe über I2C-Bus
+ Analog-Komparator
+ 10bit AD-Wandler 150kS/s für Erfassung analoger Spannungen
+ Referenzspannungen 0.55V, 1.1V, 1.5V, 2.5V, 4.3V
+ Watchdog Timer WDT
+ 41 programmierbare IO-Pins für Ein- und Ausgabe
+ UPDI-Interface zum Programmieren per 1 Pin
+ interner Bootloader zum Laden von Programmen
+ 40 Pins PDIP oder 48 Pins VQFN/TQFP verfügbar
Wer meint daß 48kB Programmspeicher "wenig ist" der sei daran
erinnert daß ein selbstgebautes 8085-System mit ~2kB auskam. Der erste
IBM-PC hatte 48kB RAM, wo Programme per Diskette hineingeladen werden konnten.
Professionelle Programme waren so möglich.
Neben dem 4809 gibt es kleinere Chip-Varianten wie:
- ATmega3209 32kB Flash, 4kB SRAM
- ATmega1609 16kB Flash, 2kB SRAM
- ATmega809 8kB Flash, 1kB SRAM
- ATmega4808, ATmega3208, ATmega1608 und ATmega808 haben 32 bzw. 28 Pins.
Die kleineren Varianten sollen hier aus Platzgründen nicht betrachtet
werden.
Beim Lernen wird man mit dem 4809 weniger rasch an Grenzen zu stoßen
wie z.B. SRAM zu klein.
Das Datenblatt "ATmega4808/4809 Data Sheet DS40002173C" von 2021
hat 560 Seiten.
Der 4809 ist in Gehäuseformen verfügbar wie:
+ 40 Pin Plastik Dual Inline Package PDIP
+ 48 Pin Thin Quad FlatPack TQFP
Bei PDIP fehlen 8 Pins. Dafür lässt sich DIL40 für Versuche
auf ein Steckbrett stecken. Bei Defekt kann rasch getauscht werden.
Wer mehr als 40 Pins braucht kann das TQFP-Teil auf eine Platine löten
und diese auf ein Steckbrett stecken.
Platine mit Atmega4809 an 5V, wo alle CPU-Pins an Anschlüssen liegen.
Auf der Rückseite sitzt ein FT232RL-Baustein für USB.
Der 4809 erhält ~5V per USB oder Spannungsregler IC3. FT232RL erlaubt
Anschluss an USB.
Die maximal mögliche Taktfrequenz des Atmega4809 hängt von Betriebsspannung
und Temperatur ab. Bei 125°C sind 16MHz möglich.
Unter 4.5V werden keine 20MHz garantiert. Bei 2.7V sollen 8MHz gehen bzw.
10MHz bis 105°C (Table 32-3 Datenblatt S.461).
Damit 20MHz genutzt werden können wird der Chip über einen Spannungsregler
(links bei der USB-Buchse) mit 5V versorgt.
LEDs zeigen Datenverkehr (Receive RX, Transmit TX) der seriellen Schnittstelle
an. Eine weitere LED hängt für Testzwecke an PF5.
Als C-Compiler für 4809 sind denkbar:
+ AVR-GCC-Compiler z.B. aus Arduino-IDE
+ MPLAB® XC8 Compiler
+ BASCOM BASIC-Compiler
Als Entwicklungsumgebung für den Atmega4809 ist möglich:
+ Atmel Studio 6.2/7 für Entwicklung C/C++ und Assembler-Code
+ Microchip MPLAB X IDE für Entwicklung Code für Microchip Mikrocontroller
und DSPs
+ IAR Embedded Workbench für AVR
+ Keil µVision für AVR
+ Arduino-IDE mit AVR-GCC-Compiler für AVR -> dazu MegaCoreX
+ WinAVR mit AVR-GCC-Compiler, Makefile, AVRDUDE
+ BASCOM BASIC-Compiler und IDE für AVR
Hinweise zur Nutzung der oberen 4 Umgebungen finden sich im "Atmel START
User's Guide".
"Atmel START" kann genutzt werden um Code für AVR-Controller
zu erzeugen (Users Guide S.90 7.2).
Bei "Atmel START" gibt es auch Beispiel-Projekte und einen "example
browser".
Hinweise zur Programmierung in C finden sich in "AVR1000b: Getting Started
with Writing C-Code for AVR MCUs".
+ Beispiele zum Umgang mit Bit Masken _bm, Bit Group Masken _gm, Group Configuration
Masken_gc.
+ Beispiele zur Nutzung von Bitpositionen wie z.B. ADC_ENABLE_bp.
Es wird gezeigt wie man bits in Registern setzen/rücksetzen kann ohne
die anderen bits zu beeinflussen.
Es gibt Kurzbeschreibungen mit Beispielen zur Nutzung von Peripherie-Einheiten:
+ TB3209 - Getting Started with ADC (Analog Digital Converter)
+ TB3211 - Getting Started with AC (Analog Comparator)
+ TB3213 - Getting Started with RTC (Real Time Counter)
+ TB3214 - Getting Started with TCB (TimerCounter B)
+ TB3215 - Getting Started with SPI (Seriell Parallel Interface)
+ TB3216 - Getting Started with USART (serielle Schnittstelle)
+ TB3217 - Getting Started with TCA (TimerCounter A)
+ TB3218 - Getting Started with CCL (Configurable Custom Logic)
+ TB3229 - Getting Started with GPIO (General Purpose Input Output)
Der 4809 hat PORTMUX zur flexiblen Verbindung von internen Einheiten zu IO-Pins:
+ EVSYSROUTEA -> EVOUTA, EVOUTC, EVOUTD an PA2/PA7, PC2/PC7, PD2/PD7
+ CCLROUTEA -> LUT0, LUT1, LUT2, LUT3 an PA3/PA6, PC3/PC6, PD3/PD6, PF3/PF6
+ USARTROUTEA -> USART0[1:0], USART1[1:0] , USART2[1:0], USART3[1:0] an
PA[3:0]/PA[7:4], PC[3:0]/PC[7:4], PF[3:0]/PF[6:4], PB[3:0]/PB[5:4]
+ TWISPIROUTEA -> TWI0[1:0], SPI0[1:0] an PA[3:2]/PC[3:2], PA[7:4]/PC[3:0]/PE[3:0]
+ TCAROUTEA -> TCA0[2:0] an PA[5:0], PB[5:0], PC[5:0], PD[5:0], PE[5:0],
PF[5:0]
+ TCBROUTEA -> TCB0, TCB1, TCB2, TCB3-Output an PA2/PF4, PA3/PF5, PC0/PB4,
PB5/PC1 (Datenblatt S.140f).
Der 4809 kann Pins weniger steil schalten zur Reduzierung von Störstrahlung:
+ PORTCTRL-> Slew Rate Limit Enable (SLR) bit ggf. setzen (Datenblatt S.149,153,164).
Die Anstiegszeit lässt sich so erhöhen 2.5 -> 19ns bei 3V, 1.5
-> 9ns bei 5V
und die Abfallzeit 2 -> 21ns bei 3V, 1.3 -> 11ns bei 5V (Datenblatt
S.470f)
Der 4809 kann Pullup-Widerstände an Pins schalten:
+ PINnCTRL -> PULLUPEN Pull-up Enable (Datenblatt S.165).
Der 4809 kann IO-Pins invertieren:
+ PINnCTRL -> INVEN Inverted I/O Enable (Datenblatt S.165).
Der 4809 kann IO-Pins als Interrupt nutzen und abschalten:
+ PINnCTRL -> ISC[2:0] Input/Sense Configuration (Datenblatt S.165).
Dabei gibt es folgende Möglichkeiten:
+ INTDISABLE -> kein Interrupt, Input buffer enabled
+ RISING -> Interrupt auf steigender Flanke
+ FALLING -> Interrupt auf fallender Flanke
+ BOTHEDGES -> Interrupt auf steigender und fallender Flanke
+ LEVEL -> Interrupt bei Low Pegel
+ INPUT_DISABLE -> kein Interrupt, Input buffer disabled (Pin abgeschaltet).
Der 4809 hat konfigurierbare Logik CCL mit
+ Logikfunktionen
+ kombinatorische Logik mit bis zu 3 Eingängen
+ D-Flip Flop, JK-Flip Flop, D-Latch, RS-Latch
+ 4 programmierbare Look-up Tabellen LUT0-LUT3 (Datenblatt S.372).
Der 4809 hat einen Real Time Counter RTC der mit 32768Hz-Quarz laufen kann:
+ als Echtzeituhr oder Wecker nutzbar
+ Genauigkeit der Uhr einstellbar (Datenblatt S.261).
Der 4809 hat einen analogen Komparator AC der 2 Eingänge vergleichen
kann.
Ein DACREF kann die Vergleichsspannung erzeugen.
Hysterese ist einstell-/abschaltbar. Invertieren schaltbar (Datenblatt S.392).
Der 4809 hat programmierbare "Fuses" zur Konfiguration wie:
+ Watchdogverhalten -> WDTCFG
+ BrownOutDetect -> BODCFG
+ Oszillator-Konfiguration -> OSCCFG (16 oder 20MHz: FREQSEL=0, =1)
+ Systemkonfiguration 0 -> SYSCFG0 (CRC, Reset-Pin)
+ Systemkonfiguration 1 -> SYSCFG1 (Startup-Timing)
+ Code-Ende -> APPEND
+ Ende Bootblock -> BOOTEND (Datenblatt S.54 7.8.1)
Wichtig ist dass sinnvolle Werte für die Fuses eingestellt werden:
+ Fuse BODCFG -> BODLEVEL0, BODLEVEL2, BODLEVEL7 bei 1.8V, 2.6V, 4.3V
+ Fuse OSCCFG -> OSCLOCK, FREQSEL[1:0]
+ Fuse SYSCFG1 -> SUT[2:0] Start-Up Time Setting 0ms-64ms
+ Fuse APPEND -> APPEND[7:0] Application Code Section End
+ Fuse BOOTEND -> BOOTEND[7:0] Boot Section End
Fuses können nur per UPDI-Schnittstelle verändert werden.
Erst nach Reset werden Änderungen der Fuses wirksam (Datenblatt S.53
7.8).
Als "Main Clock" sind über CLKSEL[1:0] im Register MCLKCTRLA
wählbar:
+ interner 16/20MHz-Oszillator OSC20M
+ interner 32.768kHz-Oszillator OSCULP32K
+ externer 32.768kHz-Oszillator XOSC32K
+ externer Clock EXTCLK (Datenblatt S.94 10.5.1).
Der interne RC-Oszillator 16/20MHz hat Register zur Frequenzkorrektur bei
3V, 5V:
+ OSC16ERR3V Oszillatorfrequenz-Fehler bei 16MHz, 3V
+ OSC16ERR5V Oszillatorfrequenz-Fehler bei 16MHz, 5V
+ OSC20ERR3V Oszillatorfrequenz-Fehler bei 20MHz, 3V
+ OSC20ERR5V Oszillatorfrequenz-Fehler bei 20MHz, 5V (Datenblatt S.50f 7.7.2.8f).
Über das oberste bit in MCLKCTRLA wird der "Main Clock" CLK_MAIN
zum CLKOUT-Pin geleitet.
Über das Register MCLKCTRLB ist ein Prescaler wählbar und aktivierbar:
+ PEN schaltet den Prescaler ein/aus
+ DIV2 -> teilt CLK_MAIN durch 2
+ DIV4 -> teilt CLK_MAIN durch 4
+ DIV6 -> teilt CLK_MAIN durch 6
+ DIV8 -> teilt CLK_MAIN durch 8
+ DIV10 -> teilt CLK_MAIN durch 10
+ DIV12 -> teilt CLK_MAIN durch 12
+ DIV16 -> teilt CLK_MAIN durch 16
+ DIV24 -> teilt CLK_MAIN durch 24
+ DIV32 -> teilt CLK_MAIN durch 32
+ DIV48 -> teilt CLK_MAIN durch 48
+ DIV64 -> teilt CLK_MAIN durch 64 (Datenblatt S.95 10.5.2).
Über das Register XOSC32KCTRLA ist der externe 32.768kHz-Oszillator konfigurierbar:
Über CSUT[1:0] und SEL wird die Startzeit für das Anschwingen des
Quarz ausgewählt.
SEL schaltet um zwischen externem Quarz und externem Takt am TOSC1-Pin.
RUNSTDBY schaltet den Quarzoszillator aktiv falls ENABLE=1 (Datenblatt S.102
10.5.9).
Es erscheint sinnvoll einen Programmieradapter für UPDI zu kaufen oder
zu bauen.
Programmierung per UPDI ist auch möglich mit dem Onboard-Debugger des
"ATmega4809 Curiosity Nano"-Boards.
UPDI-Programmer bereitstellen |
UPDI bedeutet "Unified Program and Debug Interface". Man kann damit
Chips wie den Atmega4809 programmieren, die Fuses verändern und ggf.
auch den Programmablauf verfolgen.
Es gibt Programmer für UPDI in unterschiedlicher Ausführung und
Preislage. Manche werden von "Atmel Studio 7" unterstützt das
viel Rechenleistung (moderne Hardware) und Win10 erfordert.
Hier soll ein Weg ohne das Studio gezeigt werden.
Auf Platinen "Arduino nano 3" ist üblicherweise ein Bootloader
installiert, mit dessen Hilfe eine Software aufgespielt werden kann um die
Platine zu einem UPDI-Programmer zu machen.
Im Internet findet sich ein Beitrag "UPDI programmer software for Arduino
(targets ATtiny 417 / 814 / 816 / 817 / 1614 / 1616 / 1617 and similar MCUs)
ElTangas/jtag2updi" und dazu die Datei jtag2updi-master.zip.
In dieser zip-Datei ist die Datei JTAG2UPDI.hex zu finden. Diese kann auf
den Arduino nano 3 installiert werden. Dazu gibt es mehrere Möglichkeiten:
+ per Arduino IDE (diese nutzt eine Kommandozeile für AVRDUDE)
+ direkt mit AVRDUDE, z.B. über eine batch-Datei oder ein Eingabefenster.
Im Netz sind unterschiedliche Versionen von AVRDUDE.exe zu finden. Wichtig
ist eine dazu passende AVRDUDE.conf-Datei. Wenn diese beiden Dateien vorhanden
sind lässt sich avrdude aufrufen und der chip auf der Arduino nano 3-Platine
programmieren mit einer Zeile wie:
avrdude -v -v -p atmega328p -c arduino -P COM7 -b 57600 -U flash:w:JTAG2UPDI.hex
wobei mit COM7 hier der serielle Port gemeint ist der sich im Windows-Gerätemanager
meldet wenn die Arduino nano 3-Platine angesteckt wird. Wenn beim Anstecken
ein gelbes Rufzeichen im Gerätemanager erscheint fehlt der passende Treiber.
Auf der Arduino nano-Platine kann ein FTDI-Baustein verbaut sein oder ein
CH340-Chip. Nach Installation des passenden Treibers sollte das gelbe Rufzeichen
verschwinden. Der Port der dann angezeigt wird kann dann oben an Stelle von
COM7 eingetragen werden.
Die obige Zeile kann in eine Batchdatei eingetragen werden wie z.B. program.bat.
Dies ruft man dann auf.
Es ist auch möglich ein Fenster "Eingabeaufforderung" aufzurufen
und die obige Zeile dort einzugeben.
Die Dateien avrdude.exe, avrdude.conf und JTAG2UPDI.hex sollten sich dann
im angezeigten Ordner befinden.
Auf diese Weise sollte sich die Arduino nano 3-Platine erfolgreich mit JTAG2UPDI.hex
über den Bootloader programmieren lassen. Der neue UPDI-Programmer ist
nun betriebsbereit. Mit 5V betriebene Atmega4809-Chips sollten sich damit
programmieren lassen.
per UPDI Bootloader programmieren |
Mit Hilfe des UPDI-Programmers kann man einen Bootloader auf den Atmega4809
flashen, wenn man dies möchte.
Der Vorteil eines Bootloaders ist dass man damit auch ohne UPDI-Programmer
per USB Programme in den Atmega4809 laden kann.
Von Nachteil ist dass der Bootloader einige Byte Speicherplatz kostet.
Zum Brennen des Bootloaders kann die Arduino IDE vorteilhaft verwendet werden.
Daher soll die Vorgehensweise hier kurz beschrieben werden. Als Beispiel wird
Arduino 1.8.18 genutzt (arduino-1.8.18-windows.exe).
Installieren Arduino IDE:
+ arduino-1.8.18-windows.exe aufrufen
+ alles installieren lassen incl. USB-Treiber in Programme (x86)/Arduino
Es fehlt nun noch die Unterstützung für die Atmega4809-CPU. Dazu
kann man "MegaCoreX" von github herunterladen (https://github.com/MCUdude/MegaCoreX).
Die Datei "MegaCoreX-master.zip" auf der Festplatte speichern.
Arduino-Umgebung mit MegaCoreX erweitern:
+ MegaCoreX-master.zip auf der Festplatte auspacken
+ verschieben des Ordners nach "C:\Programme (x86)\Arduino\hardware)"
+ den Ordner "hardware" erzeugen falls nicht existent
Die Arduino IDE aufrufen. Unter "Werkzeuge", "Board" sollte
unter "MegaCoreX" nun eine Liste mit Atmega4809 und anderen CPUs
dieser Serie angezeigt werden.
Die Arduino IDE kennt nun den Atmega4809 und einen kleinen Bootloader (512
byte) dazu.
Zum Programmieren des Bootloaders in den 4809 muss der UPDI-Programmer (rechts)
mit dem UPDI-Pin des 4809 (links) verbunden werden.
+ Arduino nano (mit UPDI-Programm im Flash) Pin D6 über 4.7k mit UPDI-Pin
Atmega4809 verbinden
+ Arduino nano RST über 470nF mit 5V verbinden
+ GND der beiden Controller verbinden
+ 5V der beiden Controller verbinden
Das Bild zeigt wie es gemacht wird. Links der 4809 und rechts der UPDI-Programmer.
Anschluß UPDI-Programmer Pin D6 über 4.7k an UPDI-Pin 4809. 470nF
zwischen RST und VCC.
Zum Programmieren des 4809 wird der Programmer (rechts) über USB mit
dem Laptop verbunden. Beide Platinen werden so mit 5V versorgt (kleiner Verlust
über Diode und Kabel). Der USB-Chip des Programmers meldet sich im Gerätemanager
z.B. mit USB-SERIAL CH340 (COM4). Falls eine gelbe Warnung erscheint muss
der nötige Treiber noch installiert werden.
Der Bootloader kann nun über die Arduino IDE programmiert werden:
+ unter "Werkzeuge", "Board", "MegaCoreX" Atmega4809
wählen
+ folgende Einstellungen prüfen und ggf. ändern (andere Optionen
ignorieren)
+ Bootloader: "Optiboot (UART3 default pins)"
+ Clock: "Internal 16 MHz"
+ Pinout: "48 pin standard"
+ Reset pin: "Reset"
+ Programmer: "JTAG2UPDI"
Den Programmer (rechts) über USB verbinden, z.B. COM4 meldet sich.
+ in der Arduino IDE den Port für UPDI-Programmer wählen (hier COM4).
+ unter "Werkzeuge" Bootloader brennen wählen -> Bootloader
in Atmega4809 brennen.
Es sollte eine Meldung erscheinen wie: "Der Bootoader wurde gebrannt".
512Byte.
Nun sollte der serielle Bootloader des Atmega4809 arbeiten.
Falls eine Fehlermeldung erscheint wie "Fehler beim Brennen des Bootloaders"
kann dies ein Hinweis auf eine unbrauchbare Datei avrdude.conf sein. Eine
passende Datei sollte dann im Netz gesucht werden. Mit der avrdude.conf von
"ElTangas" gab es keine Probleme.
Ein Nachteil des Bootloaders ist daß dieser die unteren 512byte im Flash
belegt und damit Programme die für Betrieb ab Adresse 0 gelinkt wurden
nicht ladbar sind. AVRDUDE verweigert dann das Laden.
Test des Bootloaders mit LED-Blinkprogramm |
Zum Test soll nun ein einfaches LED-Blinkprogramm erstellt und über den
Bootloader auf den 4809 heruntergeladen werden. Dazu gibt es Beispiele in
der Arduino IDE die man aufrufen kann.
+ entferne das USB-Kabel zum Programmer (Nano-Board) falls noch nicht getan
+ wähle in der Arduino-IDE das LED-Blinkprogramm aus unter "Datei"
"Beispiele" "Basics" "Blink"
+ ändere Programm ledPin=39 pinMode(ledPin,OUTPUT), digitalWrite(ledPin,HIGH)
etc.
+ stecke das Atmega4809-Board über USB an -> es meldet sich z.B. mit
USB Serial Port (COM5)
+ wähle "Werkzeuge" "Board" Atmega4809 unter MegaCoreX
+ prüfe folgende Einstellungen, ggf. ändern (andere Optionen ignorieren)
+ Bootloader: "Optiboot (UART3 default pins)"
+ Clock: "Internal 16 MHz"
+ Pinout: "48 pin standard"
+ Reset pin: "Reset"
+ diesmal ist die Programmer-Option egal
+ per USB angestecktes Atmega4809-Board: Port "COM5"
+ mit "Sketch" "Hochladen" den Arduino-Sketch in den ATmega4809
laden.
Das Programm sollte nun laufen und die untere LED am 4809 blinken.
Es erscheint "Hochladen abgeschlossen" 790 bytes Flash, 4 bytes
RAM
In der Arduino IDE können nun C-Programme geschrieben, compiliert und
auf den 4809 per Bootloader geladen werden.
Serielle Ausgaben des 4809 über TX3 können über USB verfolgt
werden.
Eine weitere Möglichkeit C-Programme zu schreiben und zu übersetzen
ist die Nutzung von AVRGCC unter WinAVR.
WinAVR ist eine kompakte Entwicklungsumgebung mit AVRGCC für AVR-Controller.
Sie umfasst Entwicklungswerkzeuge wie:
+ AVR GNU Binutils
+ AVR GNU Compiler Collection (GCC)
+ avr-libc
+ AVRDUDE (Programmiertool)
+ AVR GNU Debugger (GDB) / Insight
+ Splint (braucht cygwin1.dll)
+ MFile (Makefilegenerator)
+ Cygwin DLLs
+ GNU programs/utilities incl. Make (make.exe), bash (sh.exe)
Der Vorteil ist daß mit WinAVR recht brauchbar und rasch einfache Programme
entwickelt werden können ohne Entwicklungsumgebungen aufwendig einrichten
zu müssen. Programme für AVR-Controller wie Atmega328, Atmega2560
oder Atmega32u4 sind damit problemlos erstellbar.
Mit WinAVR 2010 sind jedoch neuere Chips wie Atmega4809 nicht ohne weiteres
nutzbar. Der GCC 4.3.3-Compiler aus WinAVR 2010 ist veraltet. Neuere Versionen
erzeugen jedoch ggf. größeren Code.
Es ist möglich WinAVR 2010 mit neueren Paketen aufzufrischen um Atmega4809
nutzten zu können. Dies ist jedoch nicht so einfach. Daher hat Veit ein
avr-gcc-8.4.0_mingw64_binutils2.34.zip zusammengebaut das die Arbeit erleichtert.
+ avr-gcc-8.4.0_mingw64_binutils2.34.zip in Verzeichnis C:\WINAVR kopieren,
dort auspacken
+ avr-gcc-8.4.0_mingw64_binutils2.34.zip löschen
+ alle Ordner aus avr-gcc-9.1.0-x86-mingw herauskopieren, den leeren Ordner
dann löschen
Fehlende aktuelle Dateien nach C:\WINAVR\bin kopieren wie:
+ avrdude.exe (27.6.2019 455kB)
+ avrdude.conf (25.5.2020 497kB)
+ libusb0.dll (27.6.2019 67kB)
+ make.exe (27.6.2019 255kB)
Dateien aus WinAVR2010 (WinAVR-20100110-install.exe) nach C:\WINAVR\utils
kopieren wie:
+ cp.exe
+ diff.exe
+ echo.exe
+ msys-1.0.dll (für rm.exe, sed.exe, cp.exe, sh.exe)
+ rm.exe
+ sed.exe
+ sh.exe
+ msys-1.dll usw.
Den Pfad anpassen mit Start, Computer re Maustaste, Eigenschaften, Erweiterte
Systemeinstellungen, Erweitert, Umgebungsvariablen, Systemvariablen, Path,
Bearbeiten, Pfad ändern (C:\WINAVR\bin;C:\WINAVR\utils\bin;...), ok.
Wenn alles gutgegangen ist sollte ein einfaches Projekt wie "LED blinken"
mit Hilfe eines Makefiles rasch zum Laufen zu bringen sein.
Auch die Fuses sollten nun auslesbar und schreibbar sein mit Hilfe von AVRDUDE.
Beispiele für Auslesebefehle der Fuses sind:
avrdude -c jtag2updi -P com9 -p m4809 -U fuse0:r:FUSE_0.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse1:r:FUSE_1.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse2:r:FUSE_2.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse4:r:FUSE_4.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse5:r:FUSE_5.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse6:r:FUSE_6.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse7:r:FUSE_7.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U fuse8:r:FUSE_8.txt:d
avrdude -c jtag2updi -P com9 -p m4809 -U lock:r:FUSE_LOCK.txt:d
Jede Fuse wird dabei in eine Textdatei eingelesen.
Wichtig für das LED-Beispiel mit WinAVR ist eine Datei main.c wo die
Befehle stehen die die LED zum Blinken bringen sollen.
int main(void)
{
// Initalisierung Clock, Pins in/out
initialization();
while(1)
{
PORTF.OUT |= PIN5_bm; // LED ein - LED gg. GND
delay_ms(1000); // warte 1s
PORTF.OUT &= ~PIN5_bm; // LED aus
delay_ms(1000); // warte 1s
}
}
Schauen wir die Teile nacheinander an.
Ganz oben in der main.c stehen z.B. Anweisungen wie:
#include <stdint.h> // Integer-Datentypen 8-64bit
#include <avr/io.h> // Pins und Interrupt-Tabelle -> siehe auch iom4809.h
#include <avr/interrupt.h> // Interrupts
#include "main.h" // CPU-Frequenz
#include "delay.h" // Delay-Funktionen us, ms
Zunächst sind Systemeinstellungen zu machen. Dazu dient die Funktion
initialization().
In initialization()
+ wird die gewünschte Taktfrequenz eingestellt
+ werden Pins des 4809 als Eingang oder Ausgang definiert.
CLKCTRL_MCLKCTRLA und CLKCTRL_MCLKCTRLB kontrollieren den Takt.
um diese Register ansprechen zu können dient CPU_CCP als Freigabe.
PORTF.DIR bestimmt die Richtung der Pins an Port F.
Die LED an Pin F5 soll Ausgang sein. Daher wird dieses bit gesetzt.
void initialization(void)
{
// Main Clock Control A MCLKCTRLA S.83 9.5.1
// CLKSEL Clock Select, CLKOUT System Clock Out
CPU_CCP = CCP_IOREG_gc; // write access for 4 CPU instruct. - noetig !
CLKCTRL_MCLKCTRLA = 0x80; // 16/20MHz + CLKOUT aktiv -> mit Oszi Takt 16MHz
an Clockout-Pin
// Main Clock Control B MCLKCTRLB S.84 9.5.2
// PDIV Prescaler Division, PEN Prescaler Enable default 1 -> Teiler durch
6 aktiv
CPU_CCP = CCP_IOREG_gc; // write access for 4 CPU instruct. - noetig !
CLKCTRL_MCLKCTRLB = 0; // kein Prescaler
// PORTF nur 1 Pin auf Ausgabe, kein PF7
PORTF.DIR = (0<<6) | (1<<5) | (0<<4) | (0<<3) |
(0<<2) | (0<<1) | (0<<0);
// PF6 = RESET - in
// PF5 = AIN15, RX2, TCA5 LED3 - out
// PF4 = AIN14, TX2, TCA4 - in
// PF3 = AIN13, SCL, TCA3 - in
// PF2 = AIN12, SDA, TCA2 - in
// PF1 = TOSC2, RX2, TCA1 - in
// PF0 = TOSC1, TX2, TCA0 - in
}
Zur Aktivierung der LED wird Pin F5 eingeschaltet. PIN5_bm ist die Bitmaske
für Pin5.
PORTF.OUT |= PIN5_bm; // LED ein - LED gg. GND. Veroderung schaltet Pin
ein.
Zur Deaktivierung der LED wird Pin F5 ausgeschaltet. PIN5_bm ist die Bitmaske
für Pin5.
PORTF.OUT &= ~PIN5_bm; // LED aus. Verundung mit invertierter Bitmaske
schaltet Pin aus.
Diese Zeilen werden in einer Schleife durchlaufen, die LED geht also ständig
an und aus.
Damit das Blinken gut sichtbar ist wird nach dem Einschalten und Ausschalten
der LED jeweils 1s gewartet.
delay_ms(1000); // warte 1s
Zu main.c gehört eine Header-Datei main.h die ggf. weitere Hinweise
für den Compiler enthält wie z.B. Taktfrequenz:
#define F_CPU 16000000UL
Das Makefile enthält Anweisungen
+ welche Dateien zum Projekt gehören
+ welche CPU verwendet wird - hier Atmega4809
+ welche Taktfrequenz verwendet wird
+ wie AVRDUDE das Programm in den Speicher laden soll
Im Makefile stehen Zeilen wie:
MCU = atmega4809 (verwendete CPU)
F_CPU = 16000000 (Taktfrequenz für delay)
TARGET = main (main.c als Hauptdatei)
avrdude -v -v -p atmega4809 -c arduino -P COM11 -U flash:w:main.hex (Programmierung
per Bootloader ins Flash)
Um das Makefile zu starten wird eine Eingabeaufforderung geöffnet.
Mit cd-Befehlen wird das Verzeichnis gewechselt zum Ort des Beispielcodes.
Im Ordner des Beispielcodes müssen alle Projektdateien und das Makefile
liegen.
Zum Starten gibt man auf der Kommandozeile ein:
make all ENTER -> damit startet die Übersetzung des Programms und
der Linker.
Wenn alles gut geht steht am Ende: Errors: none = keine Fehler.
Ansonsten muss man suchen was man falsch gemacht hat.
Eine Hilfe ist die Fehlermeldung und die Zeile wo der Fehler bemerkt wurde.
make clean ENTER löscht die ganzen erzeugten Dateien wieder.
make program ENTER erstellt das hex-file und versucht es über AVRDUDE
zu programmieren.
Dazu muss die USB-Verbindung zum 4809 hergestellt sein.
Der im Gerätemanager angezeigte COM-Port darf kein gelbes Rufzeichen
zeigen (Treiber fehlt).
Und die angezeigte Nummer des COM-Ports muss zum Eintrag im Makefile bei
AVRDUDE passen.
Wenn alles stimmt erscheint keine Fehlermeldung von AVRDUDE.
Stattdessen meldet AVRDUDE 2xxx bytes of flash written, 2xxx bytes of flash
verified.
avrdude done. Thank you.
Die LED fängt wie erwartet an zu blinken.
Es ist leicht das Programm zu verändern wie z.B. mehr oder weniger
Delay einzufügen.
make program ENTER übersetzt jedes mal rasch, linkt und lädt.
Wenn man einen alten Stand nicht verlieren möchte kann man eine Kopie
des Datei-Ordners anlegen.
Ein neuer Stand kann so ausgiebig getestet werden ohne zu verlieren was
man zuvor hatte.
Damit ist dieser Ausflug in die Welt der Mikrocontroller beendet und ich
hoffe daß Sie Erfolgserlebnisse hatten
oder noch haben werden wenn etwas klemmen sollte. Viel Erfolg !