1
Beschaltung und Programmierung von Atmel Microprozessoren
Danksagung:
Ich danke Herrn Stoljarski, der als studentischer Assistent wesentlich zur Vorbereitung der Lehrveranstaltung, insbesondere der Versuche beigetragen hat.
2
ATmega Prozessorfamilie
● Familie von Microprozessoren mit unterschiedlichem Speicherausbau
– ATmega8,16,32,128
● Alle haben
– den selbenAufbau
– annähernd die selbe Ausstattung mit Peripherie
– unterschiedlichen Speicherausbau
– Neuere Generation
– Atmega48,88,168,328,1288
● Familie von Microprozessoren mit unterschiedlichem Speicherausbau
– ATmega8,16,32,128
● Alle haben
– den selbenAufbau
– annähernd die selbe Ausstattung mit Peripherie
– unterschiedlichen Speicherausbau
– Neuere Generation
– Atmega48,88,168,328,1288
3 3
01 02 03 04 05 06 07 08 0 09 10 11 12 13 14
28 27 26 25 24 23 22 21 20 19 18 17 16 15
A T M E G A -8
GND Vcc ca. 5V GND (/Reset) PC6 Reset, mit 10k..100k
an VCC beschalten, Verbindung mit GND
bewirkt Reset
(RxD) PD0 (TxD) PD1 USART für serielle
Kommunikation XCK für ext. Takt (eher
selten benötigt)
(Int 0) PD2 (Int 1) PD3 Externe Interrupts,
Flanke programmierbar
XCK T0 PD4
(XTAL1/TOSC1) PB6 (XTAL2/TOSC2) PB7
(ICP1) PB0 Externer Takt
Quarzoszillator in Verbindung mit
Fusebits
Eingang Capture- Funktion des Timers/Counters
(T1) PD5 (AIN0) PD6 (AIN1) PD7 Eingänge Analog-
komparator Eingang Timer/
Counter 1
PB1 (OC1A) GND
Ausgang A der Comparefkt. Timer 1
für PWM PB2 (/SS/ OC1B)
PB3 (MOSI/ OC2A) PB4 (MISO)
PB5 (SCK)
MISO, MOSI, SCK bilden die Grund- lage für Insystem- programming (ISP) und
serial Peipheral Interface (SPI) AVCC
AREF
Betriebs-/Vergleichs- spannung
für Analog/Digital Konverter PC0 (ADC0)
PC1 (ADC1) PC2 (ADC2) PC3 (ADC3) PC4 (ADC4) PC5 (ADC5)
Eingänge für Analog/
Digital Konverter
http://www.roboternetz.de/wissen/index.php/Avr#Hardware So viele Anschlüsse, im Laufe des
Semsters werden wir sie
kennenlernen
4
Allgemeine Merkmale:
Gehäuse: DIL-28
Takt: bis 16 MHz (ext.) Flash: 8KB
EEProm: 512 Byte RAM: 1K
I/ O: 23
Betriebsspannung: 2.7 - 5.5V
Allgemeine Merkmale:
Gehäuse: DIL-28
Takt: bis 16 MHz (ext.) Flash: 8KB
EEProm: 512 Byte RAM: 1K
I/ O: 23
Betriebsspannung: 2.7 - 5.5V
Ziemlich brutal wegen der verbogenen Pins und der LEDs ohne Vorwiderstand, aber eindrucksvoll einfache Beschaltung.
4
Die Prozesoren der Familie Atmega lassen sich mit sehr gerininger Außenbeschaltung betreiben und sind daher be- sonders für Einsteiger gut geeignet.
Die Prozesoren der Familie Atmega lassen sich mit sehr
gerininger Außenbeschaltung betreiben und sind daher be-
sonders für Einsteiger gut geeignet.
5
Werkzeuge zur Programmierung:
Programmer Linux:
avr-gcc Der Compiler/Linker/Assembler avrdude
editor make Windows:
AVR Studio
Im Praktikum immer makefile verwenden!
Keine Änderungen in den speziell markierten Bereichen vornehmen, da die
Programmierbarkeit des Prozessors dauerhaft gesperrt werden kann, und er so für weitere Versuche unbrauchbar wird!
Werkzeuge zur Programmierung:
Programmer Linux:
avr-gcc Der Compiler/Linker/Assembler avrdude
editor make Windows:
AVR Studio
Im Praktikum immer makefile verwenden!
Keine Änderungen in den speziell markierten Bereichen vornehmen, da die
Programmierbarkeit des Prozessors dauerhaft gesperrt werden kann, und er so für weitere Versuche unbrauchbar wird!
Das Laden der Programme auf den Microconroller erfolgt über USB- Programmer. Sie sind über ebay bereits für wenoger als 5,00€ zu haben
Das Laden der Programme auf den
Microconroller erfolgt über USB-
Programmer. Sie sind über ebay
bereits für wenoger als 5,00€ zu
haben
6
Zubehör
● Stromversorgung (3,3..5V)Steckernetzteil
– über den Programmer
– Batterie/Akku/Solar….
– Steckernetzteil
● Programmer
– Fast nur noch USB (USBasp, STK500v.2)
● Externe Beschaltung je nach Anwendung mit
– Sensoren,
– Relais,
– Busadapter
● Stromversorgung (3,3..5V)Steckernetzteil
– über den Programmer
– Batterie/Akku/Solar….
– Steckernetzteil
● Programmer
– Fast nur noch USB (USBasp, STK500v.2)
● Externe Beschaltung je nach Anwendung mit
– Sensoren,
– Relais,
– Busadapter
7
Stromversorgung in Verbindung mit Steckernetzteil - der Klassiker
Bei ebay findet man preiswerte DC-DC Spannungswandler <5 €.
Zum Thema Spannungsversorgung gibt es einen extra Foliensatz
Stromversorgung in Verbindung mit Steckernetzteil - der Klassiker
Bei ebay findet man preiswerte DC-DC Spannungswandler <5 €.
Zum Thema Spannungsversorgung gibt es einen extra Foliensatz
7
1000uF 100nF 100nF
GND
7805
GN+5V
1k
B1 C1 C2 C3
IC1
GND IN OUTLED1
R1 X1-1
X1-2
+
~9-12V
Drahtbrücken
Stückliste
Farbe (Zoll) Stück (13) Rot klein (0.2“) 2
Orange (0,3“) 2
Gelb (0,4“) 2
Grün (0,5“) 1
Violett (0,7“) 2
Grau (0,8“) 2
Rot groß (2,0“) 2
Bez. Wert Stück
B1 B80C1500-WW+ Brückengleichrichter 1
C1 1000 µF Elektrolytkondensator, 105°C, RM 5,0mm
1
C2, C3 100 nF Vielschichtkondensator 2
IC1 7805S Spannungsregler 1A positiv, TO- 220
1 R1 1,0 k Kohleschichtwiderstand 1/4W, 5% 1
LED1 Grün LED 5mm, grün 1
X1 Anreihklemme 2-polig, RM5,0 1
2-Draht Kabel ~25 cm. 1
Der Klassiker mit Linear- regler, muss nicht mit aufgebaut werden. Heu- te finden eher Step- Down-wandler Anwen- dung, da sie viel effizien- ter arbeiten.
Der Klassiker mit Linear-
regler, muss nicht mit
aufgebaut werden. Heu-
te finden eher Step-
Down-wandler Anwen-
dung, da sie viel effizien-
ter arbeiten.
8
Versuch Nr 1: Grundschaltung Einsetzen/Beschalten des Prozessors Beschaltung von Ausgängen mit LEDs Programmübertragung vom PC auf den Controller.
→
http://www.informatik.htw-dresden.de/~beck/Atmel/Versuche_527819/V1/V1.html100n
GND
GND GND
GND GND
MEGA8-P
RD RD RD
RD
+5V
+5V
+5V +5V 10k
1k 1k 1k
1k C4
22 AGND 21 AREF 20 AVCC
8 GND
PB0(ICP) 14 PB1(OC1A) 15 PB2(SS/OC1B) 16 PB3(MOSI/OC2) 17 PB4(MISO) 18 PB5(SCK) 19 PB6(XTAL1/TOSC1)
9
PB7(XTAL2/TOSC2) 10
PC0(ADC0) 23 PC1(ADC1) 24 PC2(ADC2) 25 PC3(ADC3) 26 PC4(ADC4/SDA) 27 PC5(ADC5/SCL) 28 PC6(/RESET)
1
PD0(RXD) 2 PD1(TXD) 3 PD2(INT0) 4 PD3(INT1) 5 PD4(XCK/T0) 6 PD5(T1) 11 PD6(AIN0) 12 PD7(AIN1) 13 7 VCC
IC1
LED2 LED3 LED4
LED5
R2
R3 R4 R5
R6
3 4
1 2
S1
1 2 3 4 5 6
SV1
VCC SCKRESET MOSIMISO
GND
8
Stromversorgung
9 9
#define F_CPU 1000000UL // Clock speed
#include <avr/io.h> /* defines für IO-Register/-pins */
#include <avr/pgmspace.h>
#include <util/delay.h>
/*
* Delay in ms */
void delay_ms(unsigned short ms){
for(ms /= 10; ms > 0; ms--) _delay_ms(10);
}
int main(){
DDRB = 1 << PIN0 | 1 << PIN1 | 1 << PIN2 | 1 << PIN3; // 1:out 0:in
for(;;){
PORTB = 1 << PIN0;
delay_ms(1000);
PORTB &= ~(1 << PIN0);
PORTB = 1 << PIN1;
delay_ms(1000);
PORTB &= ~(1 << PIN1);
PORTB = 1 << PIN2;
delay_ms(1000);
PORTB &= ~(1 << PIN2);
PORTB = 1 << PIN3;
delay_ms(1000);
PORTB &= ~(1 << PIN3);
}
return 0;
}
Ein erstes Programm lässt die Leds blinken
Ein erstes Programm lässt
die Leds blinken
10 //#ifndef __IAR_SYSTEMS_ASM__
/* configs for io.h */
#define __SFR_OFFSET 0
#define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */
#include <avr/io.h> /* for CPU I/O register definitions and vectors */
//#endif /* __IAR_SYSTEMS_ASM__ */
#define mp 16 // oder r16
#define outerwait 17 // r17
#define innerwait 18 // r18 .global main
// rjmp main // .org 0x2a main:
ldi r16,0xff
out DDRB,mp ;//DDRB 0x17 ldi mp,0xf
out PORTB,mp rcall waitabit rcall waitabit
ldi r19,0 loop:
ldi mp,(1<<PORTB0) out PORTB,mp
rcall waitabit rcall waitabit
out PORTB,r19 rcall waitabit
lsl mp
out PORTB,mp
rcall waitabit rcall waitabit
out PORTB,r19 rcall waitabit
lsl mp
out PORTB,mp rcall waitabit rcall waitabit
out PORTB,r19 rcall waitabit
lsl mp
out PORTB,mp rcall waitabit rcall waitabit
out PORTB,r19 rcall waitabit
rjmp loop /* loop forever */
/* waitabit function, busy wait called to
** leave portB state stable for a few clock
** cycles.
*/
waitabit:
ldi outerwait,0xff waitouterloop:
ldi innerwait,0xFF waitinnerloop:
Subi innerwait,0x01 Brne waitinnerloop subi outerwait,0x01 brne waitouterloop
ret 10
Ein ähnliches Programm in
Assembler, können wir machen –
müssen wir aber nicht.
Ein ähnliches Programm in
Assembler, können wir machen –
müssen wir aber
nicht.
11 11
Ablauf, wenn auf dem Breadboard (Steckbrett) alles zusammengebaut ist
Arbeitsverzeichnis einrichten (für jeden Versuch ein Verzeichnis)
Quelltext/Makefile kopieren, im Makefile keine Änderungen vornehmen! Zu make gibt es einen gesonderten Foloiensatz.
make
Abnahme!!
Schaltung über USB-Programmer mit PC verbinden.
make flash
Das Programm startet nach erfolgreichem Laden Was machen die Leds jetzt??
Ablauf, wenn auf dem Breadboard (Steckbrett) alles zusammengebaut ist
Arbeitsverzeichnis einrichten (für jeden Versuch ein Verzeichnis)
Quelltext/Makefile kopieren, im Makefile keine Änderungen vornehmen! Zu make gibt es einen gesonderten Foloiensatz.
make
Abnahme!!
Schaltung über USB-Programmer mit PC verbinden.
make flash
Das Programm startet nach erfolgreichem Laden
Was machen die Leds jetzt??
12
Polling Interrupt
int main() {
/* Initialisierung */
. . .
//main-loop while (1) {
/* hier passiert jetzt alles */
} }
#include <avr/interrupt.h>
int main (void)
{ // Set Pin 6 (PD2) as the pin to use for this example PCMSK |= (1<<PIND2);
// interrupt on INT0 pin falling edge (sensor triggered) MCUCR = (1<<ISC01) | (1<<ISC00);
// turn on interrupts!
GIMSK |= (1<<INT0);
While (1) { hier passiert was } }
ISR(INT0_vect) {
// Hier passiert was, wenn ein Interrupt kommt
} 12
Programmieren ohne Betriebssystem?
Zur Verfügung steht:
ISP Lademechanismus zum Laden des Programms in den Flash Spezielle libc
Spezieller gcc
Interruptvectortabelle 64 I/O-Controllregister
2 Betriebsarten sind möglich:
InSystemProgramming Der Prozessor muss zur
Programmübertragung
nicht ausgebaut werden
13
Programmaufbau
● Ein AVR-Programm besteht aus den zwei grundlegenden Teilen
– Initialisierung (setup)
●
Konfiguration der Peripheriekomponenten (Timer, Interrupts, Bussysteme)
– Main-loop
●
Abfrage von Systemzuständen, IO-Operationen, Berechnungen
● Aus beiden Teilen können Funktionen gerufen werden
● Ein AVR-Programm besteht aus den zwei grundlegenden Teilen
– Initialisierung (setup)
●
Konfiguration der Peripheriekomponenten (Timer, Interrupts, Bussysteme)
– Main-loop
●
Abfrage von Systemzuständen, IO-Operationen, Berechnungen
● Aus beiden Teilen können Funktionen gerufen
werden
14 14
Aufbau des RAM. Im Adressraum des RAM befinden sich auch die Universalregister (R0..R31) Gerätesteuerregister (SFR-Register)
Adresse
Register
SFR
SRAM
$0000-$001F (32 Byte)
$0020-$005F (64 Byte)
$0060-$045F (1024 Byte)
$0000-$045F (1120 Byte)
RAM Speicher / Registerfile
15
Register Summary
Address Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Page
0x3F (0x5F) SREG I T H S V N Z C 11
0x3E (0x5E) SPH – – – – – SP10 SP9 SP8 13
0x3D(0x5D) SPL SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 13
0x3C(0x5C) Reserved
0x3B(0x5B) GICR INT1 – – – – – IVSEL IVCE 49,67
0x3A(0x5A) GIFR INTF1 INTF0 INTF0 – – – – – 68
0x39(0x59) TIMSK OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 – TOIE0 72,102,122
0x38(0x58) TIFR OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 – TOV0 73,103,123
0x37(0x57) SPMCR SPMIE RWWSB – RWWSRE BLBSET PGWRT PGERS SPMEN 213
0x36(0x56) TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN – TWIE 171
0x35(0x55) MCUCR SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00 33,66
0x34(0x54) MCUCSR – – – – WDRF BORF EXTRF PORF 41
0x33(0x53) TCCR0 – – – – – CS02 CS01 CS00 72
0x32(0x52) TCNT0 Timer/Counter0 (8 Bits) 72
0x31(0x51) OSCCAL Oscillator Calibration Register 31
0x30(0x50) SFIOR – – – – ACME PUD PSR2 PSR10 58, 75, 123,193
0x2F(0x4F) TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 97
0x2E(0x4E) TCCR1B ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10 100
0x2D(0x4D) TCNT1H Timer/Counter1 – Counter Register High byte 101
0x2C(0x4C) TCNT1L Timer/Counter1 – Counter Register Low byte 101
0x2B(0x4B) OCR1AH Timer/Counter1 – Output Compare Register A High byte 101 0x2A(0x4A) OCR1AL Timer/Counter1 – Output Compare Register A Low byte 101 0x29(0x49) OCR1BH Timer/Counter1 – Output Compare Register B High byte 101 0x28(0x48) OCR1BL Timer/Counter1 – Output Compare Register B Low byte 101
0x27(0x47) ICR1H Timer/Counter1 – Input Capture Register High byte 102
0x26(0x46) ICR1L Timer/Counter1 – Input Capture Register Low byte 102
0x25(0x45) TCCR2 FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 117
0x24(0x44) TCNT2 Timer/Counter2 (8 Bits) 119
0x23(0x43) OCR2 Timer/Counter2 Output Compare Register 119
0x22(0x42) ASSR – – – – AS2 TCN2UB OCR2UB TCR2UB 119
0x21(0x41) WDTCR – – – WDCE WDE WDP2 WDP1 WDP0 43
15 Ram-Adresse
I/O-Controll- Register (von in/out verwendet)
Special function register (sfr)
Steuerrister für die verschiedenen Baugruppen innerhalb des Prozessors, lernen wir nach und nach kennen.
Special function register (sfr)
Steuerrister für die verschiedenen Baugruppen
innerhalb des Prozessors, lernen wir nach und
nach kennen.
16
0x20(0x40) UBRRH URSEL – – – UBRR[11:8] 156
UCSRC URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL 153
0x1F(0x3F) EEARH – – – – – – – EEAR8 20
0x1E(0x3E) EEARL EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 20
0x1D(0x3D) EEDR EEPROM Data Register 20
0x1C(0x3C) EECR – – – – EERIE EEMWE EEWE EERE 20
0x1B(0x3B) Reserved 0x1A(0x3A) Reserved 0x19(0x39) Reserved
0x18(0x38) PORTB PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 65
0x17(0x37) DDRB DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 65
0x16(0x36) PINB PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 65
0x15(0x35) PORTC – PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 65
0x14(0x34) DDRC – DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 65
0x13(0x33) PINC – PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 65
0x12(0x32) PORTD PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 65
0x11(0x31) DDRD DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 65
0x10(0x30) PIND PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 65
0x0F(0x2F) SPDR SPI Data Register 131
0x0E(0x2E) SPSR SPIF WCOL – – – – – SPI2X 131
0x0D(0x2D) SPCR SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 129
0x0C(0x2C) UDR USART I/O Data Register 153
0x0B(0x2B) UCSRA RXC TXC UDRE FE DOR PE U2X MPCM 154
0x0A(0x2A) UCSRB RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 155
0x09(0x29) UBRRL USART Baud Rate Register Low byte 158
0x08(0x28) ACSR ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 194
0x07(0x27) ADMUX REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0 205