Upload
lediep
View
216
Download
0
Embed Size (px)
Citation preview
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 1
Programmieren in CTeil 3: Mikrocontrollerprogrammierung
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 2
Tag 1Hello World
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 3
Mikrocontroller
Im Gegensatz zum Mikroprozessor Peripherie integriert Speicher Takterzeugung Interrupt-Controller Timer-Baustein Schnittstellen Single-Chip-Betrieb möglich
Angepasster Befehlssatz für Steueraufgaben (in, out)
Wenig Speicher
Geringer Stromverbrauch
Versteckt in Alltagsgeräten (Kaffeemaschine, Handy, Smartcard,...)
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 4
ATmega640
Features max. 16 MHz Taktfrequenz (aber fast 16 MIPS!) Hardwaremultiplizierer 64 kB Flash-Speicher (Programmspeicher) 8 kB SRAM 4 kB EEPROM 16-Kanal 10-Bit-ADC 6 Counter 4 Hardware-PWM-Ausgänge 4 USARTs ...
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 5
ATmega640
Programm ist im Flash-Speicher abgelegt
Program Counter zeigt auf aktuellen Befehl im Speicher
Recheneinheit(“Arithmetic Logic Unit”, ALU) Führt alle Rechenoperationen
aus (Addieren, Subtrahieren,Shiften,...)
Liest Operanden aus Register und schreibt Ergebnis in Register
Operation wird durch Inhalt des Instruction Registers vorgegeben
Abbildung: Datenblatt ATmega640
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 6
myAVR-Board
“Stamp” mit Mikrocontroller
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 7
myAVR-Board
Programmieradapter
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 8
myAVR-Board
LEDsLEDs
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 9
myAVR-Board
Sieben-Segment-Anzeige
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 10
myAVR-Board
DIP-Schalter
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 11
myAVR-Board
Taster
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 12
myAVR-Board
Joystick
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 13
myAVR-Board
Lautsprecher
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 14
myAVR-Board
Potentiometer
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 15
myAVR-Board
Fotosensor
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 16
myAVR-Board
Graphikdisplay
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 17
Hello World
Ein einfaches Programm Programmierung in Assembler Einbinden von Header-Dateien: .include “<Dateiname>”
Befehle: ldi <reg>, <val> (load immediate) Lädt Wert <val> in Register <reg> out <port>, <reg> (output) Schreibt Inhalt eines Registers in Port rjmp <label> (relative jump) Springt zum Label
Kommentare beginnen mit “;” Labels definieren Abschnitte im Code ende: (Markiert das Ende)
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 18
Hello World
Das Programm
.include "m640def.inc"
.org 0x000
; Data Direction Register setzenldi r16, 0xFF ; In Register 16 Wert 0xFF ladenout DDRD, r16 ; Inhalt von r16 in DDRD schreiben
; LED einschaltenldi r16, 0x01 ; In Register 16 Wert 1 ladenout PORTD, r16 ; Inhalt von r16 in PORT D schreiben
ende: rjmp ende ; Endlosschleife
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 19
AVR Studio
AVR Studio (IDE) starten Neues Projekt erstellen Atmel AVR Assembler Name des Projekts eintragen AVR Simulator auswählen Atmega640 als Device wählen
Programm schreiben oder .c-Datei laden Assemblieren (F7)
:020000020000FC:0A0000000FEF0AB901E00BB9FFCFC2:00000001FF
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 20
Simulation
Simulation (Debugging) starten (Strg-Shift-Alt-F5) Schrittweise den Code ausführen (F11) I/O-View (rechts) zeigt die Änderungen im Controller an
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 21
Programm auf myAVR Board MK3 brennen
Alle blauen Jumper öffnen
Programm assemblieren (F7) Hexfile→ Tools Program AVR Connect...→ → STK500 und COM-Port wählen Unter 'Flash' das Input Hexfile auswählen 'Program' wählen, um Hexfile zu brennen
Programm wird sofort ausgeführt Resetknopf startet Programm neu
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 22
Hello World in AVR-GCC
Gleiche Funktionalität in C programmieren: Neues Projekt erstellen, wie zuvor Aber 'AVR GCC' auswählen
Programmcode:#include <avr/io.h> // Enthält alle Definitionen
int main(void){ // LED einschalten
DDRD = 0xff; // Setze Port D auf AusgangPORTD = 0x1; // Schreibe 1 an Port D
while(1) ; // Endlosschleife
return 0; // Wird nie erreicht}
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 23
Kompilieren und brennen
Kompiliervorgang starten (F7) Hex-File brennen wie zuvor Wichtig: Hex-File muss für jedes Projekt neu ausgewählt werden! STK500 Fenster nicht schließen, sondern minimieren,
dann kann wieder mit programmiert werden Simulation ist auch wie zuvor möglich
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 24
Port I/O
Ermöglicht Digitale Ein-/Ausgabe über einzelne Anschlüsse (“Pins”) des Controllers
Pins sind zu Gruppen (“Ports”) zusammengefasst (meist 8er-Gruppen)
Zuschaltbare interne Pull-up-Widerstände Schaltungsprinzip (für Anschluss eines Tasters):
Abbildung: http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 25
Port I/O
Gesteuert über drei Register: Data Direction Register (DDxn) “0” bedeutet Eingang “1” bedeutet Ausgang
Port Input Pins (PINxn) Im Prinzip nur lesbar Schreiben ändert Zustand von DDxn
Data Register (PORTxn) Wert der ausgegeben wird
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 26
Port I/O
Globale “Pull-up disable”-Funktion (PUD) im MCUCR-Register
Ausgänge zeigen im Detail folgendes Verhalten:
Tabelle: Datenblatt ATmega640
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 27
Port I/O
Bildquelle: Datenblatt ATmega640
Pull-up-Widerstand
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 28
Port I/O
Bildquelle: Datenblatt ATmega640
Data Register
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 29
Port I/O
Bildquelle: Datenblatt ATmega640
Port Input Register
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 30
Port I/O
Bildquelle: Datenblatt ATmega640
Data Direction Register
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 31
Bitmanipulationen
8-Bit Register Darstellung im Binär-
system Nach Reset genullt
Setzen des Wertes entweder dezimal oder hexadezimal Bsp: PORTA = 11; oder PORTA = 0xB;
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0
0 0 0 0 1 0 1 1
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 32
Bit-Tabelle
Eine Stelle hexadezimalentspricht vier Bits Deshalb Umrechnung
recht einfach Selten Benutzung von
Dezimalwerten fürBitmanipulationen
Intuitive Variante:Bitverschiebungen
Dez Hex Binär
0 0x0 0000
1 0x1 0001
2 0x2 0010
3 0x3 0011
4 0x4 0100
5 0x5 0101
6 0x6 0110
7 0x7 0111
8 0x8 1000
9 0x9 1001
10 0xA 1010
11 0xB 1011
12 0xC 1100
13 0xD 1101
14 0xE 1110
15 0xF 1111
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 33
Bit-Shifts (<<, >>)
Shift nach links Entspricht Multiplikation
mit 2 Bsp: a = 0x2; a << 1; Von rechts mit 0 gefüllt
Shift nach rechts Entspricht Division
durch 2 Bsp: a = 0x10; (16)
a >> 2; (4) Von links mit 0 gefüllt
7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 0
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 0
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 0
7 6 5 4 3 2 1 0
0 0 0 1 0 0 0 0
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 34
Bits einzeln setzen
Einfache Zuweisungüberschreibt Zustanddes Registers Bsp: a = 0x4;
a = 0x2;
Kombinierte Operationaus Shift und ODER Setzt ein bestimmtes
Bit und lässt andereunberührt
Bsp: a |= (1 << 4); Setzt Bit Nr. 4
zusätzlich wegen ODER-Verknüpfung
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 0
7 6 5 4 3 2 1 0
0 0 0 1 0 0 1 0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 0
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 35
Bits einzeln löschen
Einfache Zuweisungüberschreibt Zustanddes Registers Bsp: a = 0x7;
a = 0x0;
Kombinierte Operationaus Shift, NOT und UND Löscht ein bestimmtes
Bit und lässt andereunberührt
Bsp: a = 0x7;a &= ~(1 << 2);
Löscht Bit Nr. 2
7 6 5 4 3 2 1 0
0 0 0 0 0 1 1 1
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1
7 6 5 4 3 2 1 0
0 0 0 0 0 1 1 1
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 36
Links (Hardwaredokumentation)
Datenblatt ATmega640
Datenblatt Stamp Technische Beschreibung myAVR-Board mk3 Datenblatt LCD-Display Datenblatt LCD-Controller
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 37
Links (Entwicklungstools)
Für Windows:
WinAVR
AVR Studio
Für Linux:
AVR GCC
avrdude
KontrollerLab (IDE für Linux/KDE)
Sonstiges:
AVR libc Dokumentation
08/30/10 | Fachbereich Physik | Institut für Kernphysik | Bastian Löher, Martin Konrad | 38
Aufgaben
Zweite und dritte LED an Port D leuchten lassen Mehrere LEDs leuchten lassen LEDs an Port L gezielt leuchten lassen (nur die 4. oder 5., …) Bit setzen: PORTx |= (1 << bit) Bit löschen: PORTx &= ~(1 << bit)
LEDs an Port L hochzählen lassen (binär oder Lauflicht) Variablen werden wie in C definiert, allerdings Typen mit definierter
Größe: uint8_t (8 bit unsigned), uint16_t (16 bit unsigned)
LEDs an Port L mit Delay hochzählen lassen Delay: _delay_ms(millisekunden)
_delay_us(mikrosekunden)
Was passiert wenn man die Endlosschleife am Ende weglässt?