Lötkurs der VDE-Hochschulgruppe

Transcrição

Lötkurs der VDE-Hochschulgruppe
Do IT yourself – Bau Deine eigene Hardware
Handbuch zum Lötkurs
IT Summerschool 2008
http://www.ziti.uni-heidelberg.de/
Hardware Revision 1.2
Christian Kreidl
Christophe Thil
History: 12. Mai 2006 Hardware Revision 1.0
01. Juni 2007 Hardware Revision 1.1
01. Juli 2008 Hardware Revision 1.2
Inhaltsverzeichnis
Inhaltsverzeichnis
i
1 Mikrocontroller-Platine
1.1 Technische Daten . . . . . . .
1.1.1 Port B . . . . . . . . .
1.1.2 Port C . . . . . . . . .
1.1.3 Port D . . . . . . . . .
1.2 Schaltplan und Platinenlayout .
1.3 Jumper und Pinbelegungen . .
1.4 Spannungsversorgung . . . . .
1.5 Changelog . . . . . . . . . . .
2 Software
2.1 Allgemein . . .
2.2 Portzugriff . . .
2.3 vde-hsg-lib . .
2.4 Beispielsoftware
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Programmieradapter
3.1 Schaltplan und Platinenlayout . . . . .
3.2 Funktionsweise . . . . . . . . . . . .
3.3 Changelog . . . . . . . . . . . . . . .
3.4 AVRDUDE . . . . . . . . . . . . . .
3.4.1 Setzen der Fusebits . . . . . .
3.4.2 Schreiben des Flash-Speichers
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
. . . 12
. . . 13
. . . 14
. . . 14
.
.
.
.
.
.
17
17
17
20
20
21
22
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
3
3
3
4
9
9
11
.
.
.
.
.
.
Abbildungsverzeichnis
23
Tabellenverzeichnis
23
Listings
23
Literatur
24
i
1
Spannungsversorgung
9 − 16V
Stromverbrauch
typ. 40mA
Größe
100mm x 60mm
Tabelle 1: Technische Daten der µC-Platine
1
Mikrocontroller-Platine
Bei dem für das Projekt eingesetzten Mikrocontroller handelt sich um einen 8-Bit
AVR-Mikrocontroller der Firma Atmel. Dabei wurde nicht die „low power“ Ausführung mit einer Versorgungsspannung von 3,3 Volt gewählt, sondern die 5 Volt
Variante. Somit wird eine 5 Volt Spannungsversorgung für die Platine benötigt.
Ein Linearregler erzeugt diese Spannung von einer extern angelegten Stromversorgung. Die angelegte Spannung kann in einem Bereich von 9 bis 16 Volt liegen.
Es muss nicht auf die Polarität des Hohlsteckers des externen Transformators geachtet werden, da eine Brückenschaltung dies korrigiert und die Platine damit vor
Verpolung geschützt ist. Gegen Überspannung wurde keine Sicherheitsvorkehrung getroffen.
Ein Standardmaß für die Platinenfertigung ist eine Europakarte (100mm x 160mm).
Günstige Anbieter für die Erstellung von eigenen Platinen sind PCBPOOL oder
MULTPCB. Dabei ist eine doppelseitige, durchkontaktierte und mit Lötstoplack
versehene Platine der Standard und kann je nach Bedarf gegen Aufpreis erweitert
werden. Eine Europakarte mit Standardleistungen kostet bei PCBPOOL 49 EUR
und bei MULTIPCB 41 EUR. Es werden Gerber Dateien von diversen Layoutprogrammen angenommen - man ist also nicht an ein spezielles Entwicklungswerkzeug gebunden.
1.1
Technische Daten
In Tabelle 1 sind die technischen Daten der Mikrocontroller-Platine aufgeführt.
Da kein Überspannungsschutz auf der Platine enthalten ist, ist die maximale Versorgungsspannung von 16 Volt unbedingt einzuhalten. Mit dem im Kursmaterial
enthaltenen Netzteil ist die Platine diesbezüglich nicht zu beschädigen, da hier die
maximale Ausgangsspannung bei 12 Volt liegt.
Der Mikrocontroller hat 28-Pins die neben der Spannungsversorgung drei Ports
zugeordnet sind (PB0-PB7, PC0-PC6,PD0-PD7). Diesen Pins können aufgrund
1.1
Technische Daten
2
der internen Struktur des Mikrocontrollers spezielle Schnittstellen zugeordnet werden. Eine genaue Darstellung kann dem Blockschaltbild des Datenblattes [ATm8]
entnommen werden.
Pin Bezeichnung
Funktion
Bauteil
1
PC6
Reset
PB und ISP
2
PD0
RXD
RS232
3
PD1
TXD
RS232
4
PD2
LED
LED1
5
PD3
LED
LED2
6
PD4
LED
LED3
7
VCC
Core Spannung
5V
8
GND
Core Masse
GND
9
PB6
LED
LED4
10
PB7
Taster
PB1
11
PD5
Taster
PB2
12
PD6
NC
13
PD7
NC
14
PB0
NC
15
PB1
NC
16
PB2
SPI (SS)
ISP
17
PB3
SPI (MOSI)
ISP
18
PB4
SPI (MISO)
ISP
19
PB5
SPI (SCK)
ISP
20
AVCC
ADC Spannung
5V
21
AREF
ADC
GND
22
AGND
ADC
GND
23
PC0
ADC
Poti1
24
PC1
ADC
Poti2
25
PC2
ADC
Temp. Sensor
26
PC3
NC
27
PC4
NC
28
PC5
NC
Tabelle 2: Pinlayout des Mikrocontrollers
1.1
1.1.1
Technische Daten
3
Port B
An diesem Port stellt die Mikrocontroller-Architektur eine SPI Schnittstelle zur
Verfügung. Dabei handelt es sich um serielle Übertragung die für Sende- und
Empfangsrichtung (PB3 und PB4) getrennte Leitungen vorsieht. Es ist eine synchrone Datenübertragung, weshalb eine CLK Leitung (PB5) existiert. Bei dem
von Motorola eingeführten Protokoll existiert ein quasi Standard, der die Datenleitungen als Bus vorsieht. Aus diesem Grund existiert auch ein Chip Select das
mit Pin PB2 verbunden wird um den Baustein zu aktivieren. Über diese Schnittstelle erfolgt das Programmieren des Mikrocontrollers.
1.1.2
Port C
Pin 7 von Port C (PC7) ist der Reset Pin und deshalb reserviert. An diesen Port
können auch analoge Quellen angeschlossen werden. Bei der Platine sind zwei
analoge Eingangspins für Potentiometer und ein analoger Eingangspin für den
Temperatursensor verwendet. Für die analoge Schnittstelle gibt es extra Stromversorgungspins. Durch die Schaltvorgänge bei digitalen Signalen werden Störungen
auf analoge Signale übertragen, weshalb man für den Analogteil in der Regel eine
eigene Massefläche vorsieht, die wenige definierte Übergänge zur digitalen Masse
hat. Aufgrund der nicht erforderlichen Genauigkeit und des einfacheren Layouts
ist dies bei dieser Platine nicht erforderlich.
1.1.3
Port D
Diesem Port ist den Pins PD0 und PD1 eine serielle Schnittstelle zugeordnet (USART). Mit dieser Schnittstelle lassen sich synchrone und asynchrone Verbindungen realisieren. Die serielle Schnittstelle der Platine ist an diese Pins angeschlossen und kann über ein Nullmodem Kabel an den COM-Port eines PCs angeschlossen werden.
Zusätzlich sind drei der vier LEDs an PD2, PD3 und PD4 angeschlossen. An PD5
ist der Pushbutton 2 angeschlossen und bei geschlossenem Schalter wird der Pin
nach Masse gezogen (active low).
Die Tabelle 3 zeigt die Bestückungsliste mit Bauteiltyp, Bauform und Anzahl.
1.2
Schaltplan und Platinenlayout
4
Bauteil
Typ
Bauform
Anzahl
Linearregler
78L05
SMD SO-8
1
Mikrocontroller
Atmel ATmega 8
DIP-28
1
RS232 Transciever
MAX232ECWE
SMD SO-16 wide
1
Dioden
1N4148
DO-35
4
Leuchtdioden
2mA
5mm
4
Widerstand
1, 5kΩ
SMD 1206 oder 1210
6
Widerstand
100kΩ
SMD 1206 oder 1210
2
Trimmer
10kΩ
6mm, 2,5mm Raster
2
Temperatursensor
NTC 10kΩ 5%
2,5mm Raster
1
Kondensator (Keramik)
100nF
SMD 1206 oder 1210
6
Kondensator (Tantal)
1µF
SMD 1206 oder 1210
4
Kondensator (Elektrolyt)
10µF
2,5mm Raster
2
Wannenstecker
10-polig
Wannenstecker gerade
1
Stiftleiste
32 Stifte
einreihig gerade
1
Taster
5mm
liegend
3
Hohlstecker
2,1mm
Lötfahnen
1
Jumper
2,5mm
9
Tabelle 3: Bestückungsliste der µC-Platine
1.2
Schaltplan und Platinenlayout
Das Platinenlayout wurde mit dem CAD Programm EAGLE angefertigt. Die
Software gibt es in einer kostenlosen Version, die bei CADSOFT [Eagle] herunter geladen werden kann. Mit dieser Version können zweilagige Layouts bis
zu einer Größe einer halben Europakarte (80mm x 100mm) angefertigt werden.
Diese können dann in ein GERBER Dateiformat exportiert werden, um es an die
Leiterplattenfertigung zu übergeben. In diesem Dateiformat sind alle geometrischen Daten für das Layout enthalten. Wenn größere Projekte mit ganzer Europakarte oder mehreren Layern realisiert werden soll, kann man als Student eine
Vollversion zum Vozugspreis von ca. 150 Euro erwerben. Dabei kann man eine
Linuxlizenz neben der für Windows beantragen, was keine zusätzliche Vollversion darstellt. Es gibt neben EAGLE noch andere Programme mit denen Layouts
erstellt werden können z.B. TARGET, PROTEL oder MENTOR GRAPHICS.
Abbildung 1 zeigt den Schaltplan der Mikrocontroller-Platine. Abbildungen 2
bzw. 3 zeigen das Platinen-Layout für die Unter- bzw. Oberseite, Abbildungen
4 und 5 den Bestückungsdruck und Abbildungen 6 und 7 die dazugehörige Anordnung der Bauteile.
1.2
Schaltplan und Platinenlayout
Abbildung 1: Schaltplan der µC-Platine
5
1.2
Schaltplan und Platinenlayout
Abbildung 2: Bottom-Layout
der µC-Platine
6
Abbildung 3: Top-Layout der
µC-Platine
1.2
Schaltplan und Platinenlayout
Abbildung
4:
Bestückungsdruck
Platine
Bottomder µC-
7
Abbildung
5:
Bestückungsdruck der
Platine
TopµC-
1.2
Schaltplan und Platinenlayout
Abbildung
6:
BottomDokumentation der µC-Platine
8
Abbildung
7:
TopDokumentation der µC-Platine
1.3
Jumper und Pinbelegungen
9
Pin Name
Beschreibung
Richtung
1 MOSI
Master out, Slave in
PC->µC
2
Vcc
5V
Platine->ISP
3
N/C
not connected
4
GND
Masse
5 /Reset Reset Signal, activ low
PC->µC
6
GND
Masse
7
SCK
Clock
PC->µC
8
GND
Masse
9 MISO
Master in, Slave out
PC<-µC
10 GND
Masse
Tabelle 4: ISP-Stecker der µC-Platine
1.3
Jumper und Pinbelegungen
In Abbildungen 8 und 9 sind die Belegungen der Anschluss- und Jumperleisten
zu sehen. Sie dienen dazu, die Taster, LEDs, Potis und den NTC mit dem Mikrocontroller zu verbinden. Durch die Jumper können nicht benutzte Features der
Platine vom Mikrocontroller getrennt und die Pins anderweitig eingesetzt werden.
Die Pinbelegung des ISP1 -Programmiersteckers CON3 ist in Abbildung 10 zu sehen. Tabelle 4 erklärt die Pins.
1.4
Spannungsversorgung
Um eine 5 Volt Spannungsversorgung für den Mikrocontroller zu erzeugen, kommt
ein SMD Linearregler von Texas Instruments zu Einsatz. Es gibt baugleiche und
pinkompatible Typen von National Semiconductors oder anderen Herstellern, die
ohne eine Änderung am Layout ebenfalls verwendet werden können. Der maximale Ausgangsstrom ist bei den diversen Herstellern des Typs 78L05 gleich und
liegt bei 100mA.
Die Stromversorgung mit Hilfe eines externen Transformators erfolgt über eine Hohlsteckerbuchse. Bei Hohlsteckern gibt ein Zeichen mit einem geöffnetem
Kreis und einem Punkt in der Mitte die Polarität des Steckers an. Da nicht bei
allen Netzteilen die Hohlstecker ausgetauscht werden können, wurde eine GraetzGleichrichterschaltung auf der Platine vorgesehen. Es muss nun nicht mehr auf
1 In
System Programming
POTI2
POTI1
PC1(ADC1)
PC0(ADC0)
GND
NTC
PC2(ADC2)
PC3(ADC3)
PC4(ADC4/SDA)
PC5(ADC5/SCL)
Vcc
PD4
LED3
PB2
PB1
Abbildung 8: Pinleiste 1 und 2 der µC-Platine
Abbildung 9: Pinleiste 3 und 4 der µC-Platine
Vcc
PB1
PB2
PB0
PD7
PD6
PD5
PB7
PB6
PD3(INT1)
LED2
LED4
PD2(INT0)
LED1
GND
1.4
Spannungsversorgung
10
GND
GND
GND
GND
N/C
/Reset
SCK
MISO
11
Vcc
Changelog
MOSI
1.5
2
1
Abbildung 10: ISP-Stecker der µC-Platine
die Polarität geachtet werden. Hierbei kommen vier Dioden zum Einsatz, wodurch ein zusätzlicher Spannungsabfall entsteht. Je nach Polarität unterscheiden
sich die zwei Dioden, durch die der Strom zum Linearregler geleitet wird.
Der Linearregler hat einen Eingangsspannungsbereich von 7 bis 20 Volt. Um
den durch die Dioden verursachten Spannungsabfall (2 x Schwellenspannung) zu
kompensieren, sollte an der Hohlsteckerbuchse mindestens 9 Volt angelegt werden. Um den Linearregler nicht im Grenzbereich zu betreiben sollte keine höhere
Spannung als 16 Volt angelegt werden. Da bei der Spannungswandlung bei höherer Eingangsspannung mehr Wärme erzeugt und er auf der Unterseite der Leiterplatte angebracht ist, kann unter Umständen die Wärme nicht gut genug abgeführt
werden.
1.5
Changelog
Version
Datum
Änderung
1.0
1.1
12.05.2006
01.06.2007
1.2
01.07.2008
Erste Version
industrielle Platinenherstellung: Bestückungsdruck
und Vias optimiert; Pins Vin1 und Vin2 hinzugefügt; Platinenfläche vergrößert um Klebefüße zu montieren.
Bestückungsdruck geändert; Vias ohne Thermals und
mit Stopplack abgedeckt.
12
2
Software
Der Mikrocontroller wird in ANSI C programmiert. Als Compiler wird gcc eingesetzt, der auf die avrlib zurückgreift. Beide sind für Windows und Linux verfügbar. Unter Windows steht mit WinAVR[WinAVR] ein komplettes Programmpaket
zur Verfügung, das Editor, Kompiler und Bibliotheken enthält. Für Linux müssen
die Programme und Bibliotheken einzeln installiert werden (für ein HowTo siehe
[RobNetz]).
2.1
Allgemein
Sämtliche Definitionen sind in den Headerdateien nachzulesen. So werden z.B. in
iom8.h die Variablen für den Portzugriff definiert (siehe Listing 1). Ebenso sind
für die Bits der verschiedensten Registern Namen definiert, um ein einfacheres
Programmieren zu ermöglichen (siehe Listing 2).
1
3
/* Port
#define
#define
#define
D */
PIND
DDRD
PORTD
_SFR_IO8(0x10)
_SFR_IO8(0x11)
_SFR_IO8(0x12)
/* Port
#define
#define
#define
C */
PINC
DDRC
PORTC
_SFR_IO8(0x13)
_SFR_IO8(0x14)
_SFR_IO8(0x15)
/* Port
#define
#define
#define
B */
PINB
DDRB
PORTB
_SFR_IO8(0x16)
_SFR_IO8(0x17)
_SFR_IO8(0x18)
5
7
9
11
13
Listing 1: Portdefinitionen
2
4
6
8
/* PORTB */
#define PB7
#define PB6
#define PB5
#define PB4
#define PB3
#define PB2
#define PB1
#define PB0
7
6
5
4
3
2
1
0
Listing 2: Bitdefinitionen
2.2
Portzugriff
13
Zum Setzen und Löschen von Bits in einem Byte sollten mit den neuen Versionen der AVR-Bibliothek die logischen Verknüpfungen UND, ODER und NICHT
zusammen mit dem Makro _BV(bit) verwendet werden. _BV(bit) setzt an
der angegebenen Stelle ein Bit durch die shift-Operation 1 « bit. Um in einem
gegebenen Byte ein Bit zu setzen und alle anderen unangetastet zu lassen, wird
die Operation byte&= ˜_BV(bit) verwendet und um es zu löschen byte|=
_BV(bit).
In sfr_defs.h sind weitere Makros definiert, die von iom8.h verwendet werden. Dort sind auch Makros enthalten, um auf gesetzte Bits zu prüfen (bit_is_clear(sfr, bit), bit_is_set(sfr, bit)) oder um zu warten, bis
ein Bit gesetzt wurde (loop_until_bit_is_clear(sfr, bit), loop_until_bit_is_set(sfr, bit)).
2.2
Portzugriff
Die I/O-Pins sind zu Ports mit je 8 Bit zusammengefasst. Für jeden Port existiert eine Variable zum Schreiben und eine zum Lesen des Ports. Für Port D wäre
dies PORTD. Die Input- / Output-Einstellungen der Bits eines Ports werden durch
das Data Direction Register, z.B. DDRD, vorgenommen. Ein gesetztes Bit bedeutet, dass der Pin als Output arbeitet. Ist ein Pin als Input definiert, kann durch
das Schreiben einer 1 in das entsprechende Bit des PORT-Register der interne
Pullup-Widerstand aktiviert werden. Ein Eingang kann durch das Input-Register
abgefragt werden, z.B. PIND. Beispiele sind in Listing 3 zu sehen.
1
//Pin für Pushbutton als Input setzen
DDRD&= ~_BV(PD5); //PB2
3
5
7
//Pin für LED als Output setzen
DDRD|= _BV(PD2); //LED1
//PullUp Widerstand für PB2 aktivieren
PORTD|= _BV(PD5);
9
11
13
//PB2-Eingang abfragen
if ((PIND & _BV(PD5)) == 0) { printf("Button 2 pressed."); }
//LED1 einschalten
PORTD|= _BV(PD2);
Listing 3: Beispiele zu Registern
2.3
2.3
vde-hsg-lib
14
vde-hsg-lib
Listing 4 zeigt die, in der von uns bereitgestellten Bibliothek, verfügbaren Methoden.
27
/*
* Universität Heidelberg
* Institut für Technische Informatik
* http://www.ziti.uni-heidelberg.de
* Beispielprogramm
* Atmel ATmega 8 mit 8MHz
*/
#include <avr/io.h>
29
typedef enum {FALSE = 0, TRUE = 1} BOOL;
31
// Vref=5V setzen, ansonsten 2.56V
//#define ADC_REF 5V
21
23
25
33
35
37
39
41
43
45
47
49
//offset um den Fehler des ADC zu korrigieren.
#define ADCoffset 8
#define ADC_INPUT_NTC 2
#define ADC_INPUT_POTI1 0
#define ADC_INPUT_POTI2 1
void setupPorts(void);
BOOL isPressedPB1(void);
BOOL isPressedPB2(void);
void led1(BOOL on);
void led2(BOOL on);
void led3(BOOL on);
void led4(BOOL on);
uint16_t readADCChannel(uint8_t mux);
float getTemp(void);
Listing 4: vde-hsg-lib.h
2.4
Beispielsoftware
Ein Beispielprogramm, das die oben erwähnte Bibliotheken verwendet, ist in Listing 5 zu sehen. Es misst die Temperatur und gibt sie auf der seriellen Schnittstelle
aus.
2.4
22
24
26
Beispielsoftware
15
/*
* Universität Heidelberg
* Institut für Technische Informatik
* http://www.ziti.uni-heidelberg.de
* Beispielprogramm
* Atmel ATmega 8 mit 8MHz
*/
28
30
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
32
34
#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
36
38
#include "uart.h"
#include "vde-hsg-lib.h"
40
#include <util/delay.h>
42
void delay_ms(uint16_t ms) {
while (ms) {
_delay_ms(1);
ms--;
}
}
44
46
48
50
52
54
56
int main(void)
{
// Initialisieren
setupPorts();
// Serielle Schnittstelle initialisieren
uartInit();
static FILE stdout_uart = FDEV_SETUP_STREAM(uartSendByte,
NULL, _FDEV_SETUP_WRITE);
stdout = &stdout_uart;
58
60
62
// Variablen fuer Knightrider Effekte :-)
uint8_t knightrider = 1;
int8_t direction
= 1;
uint16_t ADCresult;
float V,R,T;
64
while (1) { // Endlosschleife
66
if ( !isPressedPB1() & isPressedPB2() ) {
←-
2.4
Beispielsoftware
led1(FALSE);
68
16
led2(FALSE); led3(FALSE); led4(FALSE);
}
70
72
74
76
78
80
82
84
// Knight Rider Lauflicht :-)
if ( isPressedPB1() & !isPressedPB2() ) {
switch (knightrider) {
case 1: { led1(TRUE); led2(FALSE); led3(FALSE);
led4(FALSE); direction = 1; break;}
case 2: { led1(FALSE); led2(TRUE); led3(FALSE);
led4(FALSE); break;}
case 3: { led1(FALSE); led2(FALSE); led3(TRUE);
led4(FALSE); break;}
case 4: { led1(FALSE); led2(FALSE); led3(FALSE);
led4(TRUE); direction = -1; break;}
}
knightrider+=direction;
printf("Knight Rider!\n\r");
delay_ms(150);
} else {
knightrider = 1;
direction = 1;
}
←←←←-
86
88
// Temperatur anzeigen
if ( !isPressedPB1() & !isPressedPB2() ) {
92
// LEDs blinken lassen
led1(TRUE); led2(FALSE); led3(TRUE); led4(FALSE);
delay_ms(250);
94
led1(FALSE); led2(TRUE); led3(FALSE); led4(TRUE);
96
//Temperatur messen
T = getTemp();
90
98
100
102
104
106
108
110
112
// zusaetzliche Infos ausgeben
ADCresult = readADCChannel(ADC_INPUT_NTC);
#ifdef ADC_REF5V
// folgende Berechnungen mit Vref=5
V = ADCresult*0.0048828125; //(5/1024);
R = ADCresult*122.0703125; //(2.56/1024/4e-5)
#else
// folgende Berechnungen mit Vref=2.56
V = ADCresult*0.0025;
//(2.56/1024);
R = ADCresult*62.5;
//(2.56/1024/4e-5)
#endif
printf("ADC=%d U=%4.3fV R=%6.3f Ohm T=%3.1f C\n\r",
←-
17
ADCresult, (double) V, (double) R, (double) T);
114
116
delay_ms(250);
}
} // while
} // main
Listing 5: beispiel.c
3
Programmieradapter
Der Programmieradapter wird benötigt, um AVR-Mikrocontroller zu programmieren. Dieser braucht zum Programmieren nicht ausgebaut werden, weshalb man
auch von einem In-System-Programming (ISP) spricht. Dieser Adapter benutzt
die USB-Schnittstelle; im Internet sind weitere Adapter zu finden, die die serielle
Schnittstelle oder der Parallelport verwenden.
3.1
Schaltplan und Platinenlayout
Abbildung 11 zeigt den Schaltplan des Programmieradapters. Abbildungen 12
bzw. 13 zeigen das Platinen-Layout für die Unter- bzw. Oberseite, Abbildungen
14 und 15 die dazugehörige Anordnung der Bauteile. In Tabelle 6 sind die verwendeten Bauteile aufgeführt.
3.2
Funktionsweise
Der Adapter wird an der USB-Schnittstelle betrieben und bezieht daraus auch
seine Versorgungsspannung von 5 Volt. Durch Setzen des Jumpers Dev Power
kann über das ISP-Kabel ein weiterer Mikrocontroller mit Strom versorgt werden.
Es ist jedoch darauf zu achten dass diese Quelle nicht gegen einen Kurzschluss geschützt ist, sowie dass der USB-Port in der verwendeten Konfiguration maximal
100mA bereit stellt. Über den Jumper Slow SCK kann die Programmierfrequenz
verändert werden. Ein gesetzter Jumper bewirkt die Reduktion von 375kHz auf
8kHz. Dies ist notwendig um neue Mikrocontroller, deren interne Taktgenerierung noch nicht auf 8MHz erhöht ist, zu beschreiben. Der dritte Jumper Update
ist zum Aktualisieren der Firmware des Programmieradapters zu setzen.
3.2
Funktionsweise
Bauteil
Typ
Zenerdioden
3,6V
Leuchtdioden
2mA
Quarz
12 MHz Grundton
Widerstand
68Ω
Widerstand
1, 5kΩ
Widerstand
200Ω
Widerstand
100kΩ
Spule
10µH
Kondensator (Elektrolyt)
10µF
Kondensator (Keramik)
100nF
Kondensator (Keramik)
22pF
Mikrocontroller
Atmel ATmega 8
Pfostenbuchse
10polig (2x5)
Buchse
USB-Typ B
18
Bauform
Anzahl
SOT-23
2
5mm
2
HC49/S
1
SMD 1206 oder 1210
2
SMD 1206 oder 1210
3
SMD 1206 oder 1210
1
SMD 1206 oder 1210
1
Axial SMCC 12
1
2,5mm Raster
1
SMD 1206 oder 1210
1
SMD 1206 oder 1210
2
DIP-28
1
für Flachbandkabel
1
gewinkelt, print
1
Tabelle 6: Bestückungsliste der ISP-Platine
Abbildung 11: Schaltplan der ISP-Platine
3.2
Funktionsweise
19
Abbildung 12: Bottom-Layout
der ISP-Platine
Abbildung 13: Top-Layout der
ISP-Platine
Abbildung 14: Bottom-Overlay
der ISP-Platine
Abbildung 15: Top-Overlay der
ISP-Platine
3.4
AVRDUDE
20
Auf der USBasp-Homepage [USBasp] sind weitere Varianten des Programmieradapters, Dokumentationsmaterial sowie die Quellen der verwendeten Firmware
zu finden.
Um den AVR-Mikrocontroller in den Programmiermodus zu schalten, wird das
Resetsignal ausgelöst. Dadurch werden bestimmte Pins des Mikrocontrollers in
den zur Programmierung nötigen Modus geschaltet. Über diese Pins wird das Programm seriell in den Chip geschrieben. Ist der Vorgang abgeschlossen, dann wird
das Resetsignal aufgehoben und die Programmierpins werden in ihren normalen
Modus zurückgeschaltet, in dem sie dem Programm als I/O-Pins zur Verfügung
stehen.
Beim erstmaligen Einstecken des Programmieradapters ist unter Windows die Installation eines Gerätetreibers erforderlich. Dieser befindet sich im USBasp-Paket
im Unterverzeichnis „bin/win-driver“. Unter Linux und Mac OS X ist dies nicht
erforderlich.
3.3
Changelog
Version
Datum
Änderung
1.0
1.1
12.05.2006
01.07.2008
Erste Version
Bestückungsdruck geändert; Vias ohne Thermals und
mit Stopplack abgedeckt.
3.4
AVRDUDE
Die Programmiersoftware AVRDUDE [AVRDUDE] ist u. A. für Windows, Linux
und Mac OS X erhältlich und ermöglicht die Programmierung verschiedenster Mikrocontroller.
AVRDUDE kann entweder als vorkompiliertes Paket für Windows [AVRDBIN]
herunter geladen und installiert oder selbst aus dem Quelltext übersetzt werden.
Die Software unterstützt den verwendeten USBasp-Programmieradapter seit Version 5.2.
Gestartet wird das Programm über den Aufruf von avrdude in der Kommandozeile. Da die Software rein konsolenbasierend ist muss beim Aufruf eine Mindestanzahl von Parametern übergeben werden:
3.4
AVRDUDE
21
CKSEL3..0
Frequenz
0001
1 MHz
0010
2 MHz
0011
4 MHz
0100
8 MHz
CKOPT
1 (unprogrammed)
Tabelle 8: Einstellungen für internen Oszillator
• -p: Der zu programmierende Controllertyp, für die Platine dementsprechend m8 (ATmega 8)
• -c: Der Typ der verwendeten Programmierhardware, hier usbasp
• -U: Speicheroperation. Das Ziel wird durch das zweite Schlüsselwort hfuse,
lfuse, flash oder eeprom definiert. Als drittes kann, durch ein Doppelpunkt getrennt, mit w geschrieben oder r gelesen werden.
3.4.1
Setzen der Fusebits
Über die Fusebits können bestimmte Parameter des Mikrocontrollers dauerhaft
eingestellt werden, sodass diese auch nach einem Reset und dem Entfernen der
Betriebsspannung konfiguriert sind.
Zur Berechnung des hexadezimalen Äquivalents der Fusebits ist der AVR Fuse
Calculator[AVRFC] sehr hilfreich.
Die Einstellung der Fusebits wird als programmed und unprogrammed bezeichnet. Programmed bedeutet, dass das Häkchen gesetzt sein muss, das entsprechende Bit ist allerdings 0! Unprogrammed bedeutet analog Häkchen nicht gesetzt und
Bit=1!
Abbildung 16 zeigt die Einstellungen wie wir sie verwenden. Bis auf die Einstellungen der CKSEL- (siehe Tabelle 8) und WTDON-Bits sind alles Standardwerte,
wie sie im Datenblatt [ATm8] des ATmega8 aufgeführt sind. Der Takt sollte auf
8MHz eingestellt werden, da die Beispielprogramme dies vorraussetzen.
Das Setzen der Fusebits erfogt durch den Aufruf von AVRDUDE mit dem Parameter -U hfuse:w und -U lfuse:w, um die oberen und unteren Fusebits zu
setzen. Das gesamte Kommando lautet dementsprechend avrdude -p m8 -c
usbasp -U hfuse:w:0xD9:m -U lfuse:w:0xE4:m.
3.4
AVRDUDE
22
Abbildung 16: Einstellung der Fusebits für ATmega8 bei 8MHz
3.4.2
Schreiben des Flash-Speichers
Der Programmcode des Mikrocontrollers kann mittels AVRDUDE in den internen Flash-Speicher übertragen werden. Sofern das dem Sourcecode beiliegende
Makefile benutzt wird kann dies über den Aufruf des Befehls make program
erfolgen, oder auch durch manuelles Starten von AVRDUDE.
Analog zum Setzen der Fusebits ist das Schreiben des Flash-Speichers auch eine Speicheroperation, sodass AVRDUDE mit dem Parameter -U flash:w aufgerufen wird. Jedoch muss nun zusätzlich der Dateiname der zu übermittelnden
Hex-Datei angegeben werden. So lautet das gesamte Kommando für das Beispielprogramm
avrdude -p m8 -c usbasp -U flash:w:vde-bsp.hex.
Abbildungsverzeichnis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Schaltplan der µC-Platine . . . . . . . . . . . .
Bottom-Layout der µC-Platine . . . . . . . . .
Top-Layout der µC-Platine . . . . . . . . . . .
Bottom-Bestückungsdruck der µC-Platine . . .
Top-Bestückungsdruck der µC-Platine . . . . .
Bottom-Dokumentation der µC-Platine . . . .
Top-Dokumentation der µC-Platine . . . . . .
Pinleiste 1 und 2 der µC-Platine . . . . . . . .
Pinleiste 3 und 4 der µC-Platine . . . . . . . .
ISP-Stecker der µC-Platine . . . . . . . . . . .
Schaltplan der ISP-Platine . . . . . . . . . . .
Bottom-Layout der ISP-Platine . . . . . . . . .
Top-Layout der ISP-Platine . . . . . . . . . . .
Bottom-Overlay der ISP-Platine . . . . . . . .
Top-Overlay der ISP-Platine . . . . . . . . . .
Einstellung der Fusebits für ATmega8 bei 8MHz
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
6
6
7
7
8
8
10
10
11
18
19
19
19
19
22
Tabellenverzeichnis
1
2
3
4
6
8
Technische Daten der µC-Platine . .
Pinlayout des Mikrocontrollers . . .
Bestückungsliste der µC-Platine . .
ISP-Stecker der µC-Platine . . . . .
Bestückungsliste der ISP-Platine . .
Einstellungen für internen Oszillator
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 1
. 2
. 4
. 9
. 18
. 21
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Listings
1
2
3
4
5
Portdefinitionen . . . .
Bitdefinitionen . . . .
Beispiele zu Registern
vde-hsg-lib.h . . . . .
beispiel.c . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
13
14
15
LITERATUR
24
Literatur
[USBasp] USBasp-Homepage: Programmierhardware,
URL: http://www.fischl.de/usbasp/
[AVRDUDE] AVRDUDE-Homepage: Programmiersoftware,
URL: http://savannah.nongnu.org/projects/avrdude/
[AVRDBIN] Kompilierte Windows-Version von AVRDUDE 5.3.1: Programmiersoftware,
URL: http://www.ensigma.com.au/avrdude-5.3.1-win32-usb.
zip
[AVRFC] AVR Fuse Calculator Berechnung der Fusebits,
URL: http://palmavr.sourceforge.net/cgi-bin/fc.cgi
[ATm8] Atmel Corporation: ATmega8(L) Complete Datasheet,
URL: http://www.atmel.com/dyn/resources/prod_documents/
doc2486.pdf
[WinAVR] WinAVR-Homepage: AVR-GCC for Windows,
URL: http://winavr.sourceforge.net/
[RobNetz] Roboternetz.de: Avr-gcc und avrdude installieren,
URL: http://www.roboternetz.de/wissen/index.php/Avr-gcc_
und_avrdude_installieren
[Eagle] CadSoft-Homepage: EAGLE Layout Editor,
URL: http://www.cadsoft.de/