In System Programming
- Controller wird zum Programmieren im System belassen
- Softwaretool (uisp, ponyprog, avrdude, Avrstudio)
- Bootloader on chip
- meist einfache Zusatzhardware
- Controllerseitig wird UART, SPI oder JTAG zur Programmübertrageung genutzt.
http://www.ethernut.de/en/tools/in-system-programming.html,
- Controller wird zum Programmieren im System belassen
- Softwaretool (uisp, ponyprog, avrdude, Avrstudio)
- Bootloader on chip
- meist einfache Zusatzhardware
- Controllerseitig wird UART, SPI oder JTAG zur Programmübertrageung genutzt.
http://www.ethernut.de/en/tools/in-system-programming.html,
Prgrammersoftware
Quelle:http://www.ethernut.de/en/tools/in-system-programming.html
Product Open Src Oses CLI GUI
Targets AVRDUDE Yes Linux
Windows OS X
Yes Yes AVR
AVR
Studio 4 - Windows Yes Yes AVR
JTAG-O-
MAT Yes Linux
Windows Yes - ARM
OpenOCD Yes Linux Windows OS X
Yes - ARM
SAM-
PROG - Windows ? Yes ARM
UISP Yes Linux
Windows Yes - AVR
Product Open Src Oses CLI GUI
Targets AVRDUDE Yes Linux
Windows OS X
Yes Yes AVR
AVR
Studio 4 - Windows Yes Yes AVR
JTAG-O- MAT
Yes Linux
Windows
Yes - ARM
OpenOCD Yes Linux Windows OS X
Yes - ARM
SAM-
PROG - Windows ? Yes ARM
UISP Yes Linux
Windows
Yes - AVR
avrdude
●
Programmersoftware für AVR-Prozessoren
●
Konfigurationsfile erforderlich
– /etc/avrdude.conf
– /opt/cross/etc/avrdude.conf
●
bedient eine Vielzahl von Programmern,
Beschreibung und jeweilige Pinbelegung im Configfile
●
Aufrufbeispiel aus Makefile:
● /usr/bin/avrdude -c USBasp -p m8 -P usb -p m8 -e -B8 -U flash:w:main.hex
●
Programmersoftware für AVR-Prozessoren
●
Konfigurationsfile erforderlich
– /etc/avrdude.conf
– /opt/cross/etc/avrdude.conf
●
bedient eine Vielzahl von Programmern,
Beschreibung und jeweilige Pinbelegung im Configfile
●
Aufrufbeispiel aus Makefile:
● /usr/bin/avrdude -c USBasp -p m8 -P usb -p m8 -e -B8 -U flash:w:main.hex
flash:
avrdude -c stk500v2 -p m8 -P /dev/ttyACM0 -e -B8 -U flash:w:main.hex
Übertraguns- protokoll
Target-
device device
Erase all to 0xff
Taktrate (redundant?)
memoryoperation memtype:op:filename
!! -e löscht flash und eeprom !!
flash lfuse hfuse eeprom
avrdude -p partno [-b baudrate] [-c programmer-id] [-P port] [-U memtype:op:filename:filefmt] [-v]
Kommandos f. Avrdude mit ttyAMC0
AVRDUDE = /usr/bin/avrdude -c USBasp -p m8 -P usb -p m8 flash:
$(AVRDUDE) -e -B8 -U flash:w:main.hex
#CKSEL3..0 0001; CKOPT 1 (unprogrammed) 1mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0010; CKOPT 1 (unprogrammed) 2mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0011; CKOPT 1 (unprogrammed) 4mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe3:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0100; CKOPT 1 (unprogrammed) 8mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 1111; CKOPT 0 (programmed)
AVRDUDE = /usr/bin/avrdude -c USBasp -p m8 -P usb -p m8 flash:
$(AVRDUDE) -e -B8 -U flash:w:main.hex
#CKSEL3..0 0001; CKOPT 1 (unprogrammed) 1mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0010; CKOPT 1 (unprogrammed) 2mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0011; CKOPT 1 (unprogrammed) 4mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe3:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 0100; CKOPT 1 (unprogrammed) 8mhz:
$(AVRDUDE) -B8 -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m -V
#CKSEL3..0 1111; CKOPT 0 (programmed)
/etc/avrdude.conf
programmer id = "stk200";
desc = "STK200";
type = par;
buff = 4, 5;
sck = 6;
mosi = 7;
reset = 9;
miso = 10;
;
programmer id = "dapa";
desc = "Direct AVR Parallel Access";
type = par;
vcc = 3;
reset = 16;
sck = 1;
mosi = 2;
miso = 11;
programmer id = "stk200";
desc = "STK200";
type = par;
buff = 4, 5;
sck = 6;
mosi = 7;
reset = 9;
miso = 10;
;
programmer id = "dapa";
desc = "Direct AVR Parallel Access";
type = par;
vcc = 3;
reset = 16;
sck = 1;
mosi = 2;
miso = 11;
# serial ponyprog design (dasa2 in uisp)
# reset=!txd sck=rts mosi=dtr miso=cts programmer
id = "ponyser";
desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts";
type = serbb;
reset = ~3;
sck = 7;
mosi = 4;
miso = 8;
;
programmer
id = "stk500v2";
desc = "Atmel STK500 Version 2.x firmware";
type = stk500v2;
;
programmer
id = "usbasp";
desc = "USBasp, http://www.fischl.de/usbasp/";
type = usbasp;
# serial ponyprog design (dasa2 in uisp)
# reset=!txd sck=rts mosi=dtr miso=cts programmer
id = "ponyser";
desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts";
type = serbb;
reset = ~3;
sck = 7;
mosi = 4;
miso = 8;
;
programmer
id = "stk500v2";
desc = "Atmel STK500 Version 2.x firmware";
type = stk500v2;
;
programmer
id = "usbasp";
desc = "USBasp, http://www.fischl.de/usbasp/";
type = usbasp;
Direct Programmer (dapa)
reset = 16;
sck = 1;
mosi = 2;
miso = 11;
Pinbelegung / Widerstände DAPA
Stk200 kompatible (selbstbau)
http://www.kreatives-chaos.com/artikel/stk200-programmieradapter
Serielle Programmierung
http://www.mikrocontroller.net/topic/57953
1 DCD 2 RxD
3 TxD !Reset 4 DTR MOSI 5 GND GND 6 DSR SCK 7 RTS SCK 8 CTS MISO 9 RI9 GND
uisp -dprog=dasa2 -dserial=/dev/ttyUSB0 -v=2
Variante, gefunden auf Pollin
Evaluation board
Serieller Programmer Dasa2
Auch in Verbindung mit USB-Serial-Adapter
verwendbar, allerdings langsam, Nicht immer fehlerfrei
USB Programmer
http://www.informatik.htw-dresden.de/~beck/Atmel/Ernst/usbprogrammer.html
● Typ unbekannt (ebay.de, preiswert)
● Protkoll: stk500v2
● Device: /dev/ttyACM0
● Nutzung von avrdude
flash:
avrdude -c stk500v2 -p m8 -P /dev/ttyACM0 -e -B8 -U flash:w:main.hex
Übertraguns- protokoll
Target-
device device
Erase all to 0xff
Taktrate (redundant?)
memoryoperation memtype:op:filename
/etc/udev/rules.d/85-avr.rules:
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="2a9b", MODE="0666"
USBasp
flash:
avrdude -c USBasp -p m8 -P usb -e -B8 -U flash:w:main.hex eeprom:
avrdude -c USBasp -p m8 -P usb -B8 -U eeprom:w:main_eeprom.hex . . .
/etc/udev/rules.d/15-usbprog.rules:
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="users", MODE="0660"
Derzeit genutzt, <4€ im Versandhandel
kavr – ein alternativer bootloader
●
Ein bootloader wird in den oberen
Adressbereich des Programmspeichers des Microcontrollers geladen und verbleibt dort. Er erlaubt über eine geeignete Schnittstelle, zum Beispiel UART, die Übernahme des
Programmcodes.
●
Er wird über Reset gestartet. Nacjh Reset muss in einem programmierbaren zeitfenster der
Programmcode über die Schnittstelle
übertragen werden. Dafür wird dann kein Programmer mehr benötigt.
●
Ein bootloader wird in den oberen
Adressbereich des Programmspeichers des Microcontrollers geladen und verbleibt dort. Er erlaubt über eine geeignete Schnittstelle, zum Beispiel UART, die Übernahme des
Programmcodes.
●
Er wird über Reset gestartet. Nacjh Reset muss in einem programmierbaren zeitfenster der
Programmcode über die Schnittstelle
übertragen werden. Dafür wird dann kein
Programmer mehr benötigt.
kavr – ein alternativer bootloader
● Quelle: http://sourceforge.net/projects/kavr/files/
● Bootloader, der hex-files über UART übernimmt, es ist keine extra ISP-Schnittstelle und kein Programmer
mehr nötig.
● ISP Programmer wird nur für die Installation des Boot- loaders benötigt.
● Uart über max232 mit seriellem Port am PC oder Ad- apter verbinden.
● Für die Übertragung vom PC kann ein geeignetes Mo- demprogramm (minicom, gtkterm) genutzt werden.
● Quelle: http://sourceforge.net/projects/kavr/files/
● Bootloader, der hex-files über UART übernimmt, es ist keine extra ISP-Schnittstelle und kein Programmer
mehr nötig.
● ISP Programmer wird nur für die Installation des Boot- loaders benötigt.
● Uart über max232 mit seriellem Port am PC oder Ad- apter verbinden.
● Für die Übertragung vom PC kann ein geeignetes Mo- demprogramm (minicom, gtkterm) genutzt werden.
● Der Bootloader wird an das obere Ende des Flash ge- schrieben und bei reset aktiviert, dazu bedarf es der korrekten Einstellung der Fuses dazu.
● Liegt nach reset ein hexfile an der seriellen Schnittstel- le an, so wird es empfangen und in den flash ge-
schrieben.
● Wird kein hexfile registriert, so wird nach dem einge- stellten timeout ein gewöhnlicher reset ausgeführt.
● Der Bootloader belegt >512!!! Byte am oberen Ende des Flash, dieser darf vom Programm nicht über-
schrieben werden.
● Der Bootloader wird an das obere Ende des Flash ge- schrieben und bei reset aktiviert, dazu bedarf es der korrekten Einstellung der Fuses dazu.
● Liegt nach reset ein hexfile an der seriellen Schnittstel- le an, so wird es empfangen und in den flash ge-
schrieben.
● Wird kein hexfile registriert, so wird nach dem einge- stellten timeout ein gewöhnlicher reset ausgeführt.
● Der Bootloader belegt >512!!! Byte am oberen Ende des Flash, dieser darf vom Programm nicht über-
schrieben werden.
● Nach einschalten oder reset meldet sich kavr mit „KA- VR“ beim Terminalprogramm (minicom, GtkTerm), ist das nicht der Fall, stimmt etwas mit der Taktung/Baud- rate nicht.
● Es sind nur eingeschränkte Kombinationen von Baud- rate/Taktung möglich, hierfür gibt es Formeln oder Ta- bellen, zB. bei Versuch 6 oder im Manual des atmega.
● Bei der Installation des Bootloaders wird das aktuelle Programm (oft auch firmware genannt) auf dem Con- troller gelöscht.
● Die Taktung des Controllers wird über fuses einge- stellt, ein Wechsel der Taktung setzt den Bootloader außer Betrieb.
● Nach einschalten oder reset meldet sich kavr mit „KA- VR“ beim Terminalprogramm (minicom, GtkTerm), ist das nicht der Fall, stimmt etwas mit der Taktung/Baud- rate nicht.
● Es sind nur eingeschränkte Kombinationen von Baud- rate/Taktung möglich, hierfür gibt es Formeln oder Ta- bellen, zB. bei Versuch 6 oder im Manual des atmega.
● Bei der Installation des Bootloaders wird das aktuelle Programm (oft auch firmware genannt) auf dem Con- troller gelöscht.
● Die Taktung des Controllers wird über fuses einge- stellt, ein Wechsel der Taktung setzt den Bootloader außer Betrieb.
Übertragung des hexfiles
● Nutzung von Minicom
● Konfiguration der seriellen Schnittstelle ohne minicom:
– Zur Konfiguration kann stty genutzt werden.
stty -F /dev/ttyUSB0 ospeed 9600 ixon
– Angabe eines Flags schaltet die Eigenschaft an, ein vorgestelltes Minus schaltet die
Eigenschaft aus.
– Ist der serielle Port ordnungsgemäß konfiguriert, kann man mit dem Kommando
cat main.hex >/dev/ttyUSB0 übertragen.
● Nutzung von Minicom
● Konfiguration der seriellen Schnittstelle ohne minicom:
– Zur Konfiguration kann stty genutzt werden.
stty -F /dev/ttyUSB0 ospeed 9600 ixon
– Angabe eines Flags schaltet die Eigenschaft an, ein vorgestelltes Minus schaltet die
Eigenschaft aus.
– Ist der serielle Port ordnungsgemäß konfiguriert, kann man mit dem Kommando
cat main.hex >/dev/ttyUSB0 übertragen.
Die Konfiguration des serial Ports
●
Geschwindigkeit 9600 Baud (8MHz)
oder 9600 Baud für alle „gängigen“ Taktungen, außer 1MHz!
●
Übertragungsprotokoll 8N1
●
XON/XOFF flowcontrol
●
Der Einsatz des Quarzes empfiehlt sich für eine zuverlässige Übertragung (11059200Hz), es
handelt sich um einen „Baudratenquarz“. Dies muss in den Makefiles entsprechend
konfiguriert werden!
●
Geschwindigkeit 9600 Baud (8MHz)
oder 9600 Baud für alle „gängigen“ Taktungen, außer 1MHz!
●
Übertragungsprotokoll 8N1
●
XON/XOFF flowcontrol
●
Der Einsatz des Quarzes empfiehlt sich für eine zuverlässige Übertragung (11059200Hz), es
handelt sich um einen „Baudratenquarz“. Dies muss in den Makefiles entsprechend
konfiguriert werden!
kvar: Tipps zum Makefile
●
Makefile benutzt avrdude, passenden Programmer einstellen
– DUDEPORT = -c USBasp oder
– DUDEPORT = -c stk200 -P /dev/parport0
●
Fuses im Makefile gehen von verwendetem
Quarz aus! Ist kein Quarz installiert, geht nach
„make fuses“ nichts mehr. Ausweg:
– Installation eines Quarzes (bei Nutzung des UART ohnehin empfohlen) oder
– Ändern von FUSE_L in 0xe1(1MHz),
●
Makefile benutzt avrdude, passenden Programmer einstellen
– DUDEPORT = -c USBasp oder
– DUDEPORT = -c stk200 -P /dev/parport0
●
Fuses im Makefile gehen von verwendetem
Quarz aus! Ist kein Quarz installiert, geht nach
„make fuses“ nichts mehr. Ausweg:
– Installation eines Quarzes (bei Nutzung des UART ohnehin empfohlen) oder
– Ändern von FUSE_L in 0xe1(1MHz),
0xe2(2MHz), 0xe3(4MHz) oder 0xe4(8MHz)
Build mit kavr Makefile
MCU = atmega8 F_CPU = 11059200 BAUD = 9600
TIMEOUT = 3000
# 512-byte bootloader (see comments above)
#BOOTADDR = 0x1e00 BOOTADDR = 0x1C00 FUSE_L = 0xff
#FUSE_H = 0xcc FUSE_H = 0xca
# Your programmer, your serial port, your main app...
MCU = atmega8 F_CPU = 11059200 BAUD = 9600
TIMEOUT = 3000
# 512-byte bootloader (see comments above)
#BOOTADDR = 0x1e00 BOOTADDR = 0x1C00 FUSE_L = 0xff
#FUSE_H = 0xcc FUSE_H = 0xca
# Your programmer, your serial port, your main app...
Bootloader ist (Leider!) größer Als 512 byte. Deshalb nachfolgende
Änderungen vornehmen!
Adresse, an der der Bootloader beginnt
Über die Fuseseinstellung wird gesteuert, dass der Bootloader an seiner Adresse bei Reset
aufgerufen wird.
Ein wenig Rechnerei
avr-size --common -d kavr.elf
text data bss dec hex filename 558 0 389 947 3b3 kavr.elf 558 > 512!!
Flash-speicher 8kB (4kWorte)
Einstellbar sind Bootloader der Größe:
128 Words ( 256 Byte) 256 Words ( 512 Byte) 512 Words (1024 Byte) * 1024 Words (2048 Byte)
8 KByte Flashhpeicher: 8192 Byte 0x2000 1024 Byte f. Bootloader - 0x0400 avr-size --common -d kavr.elf
text data bss dec hex filename 558 0 389 947 3b3 kavr.elf 558 > 512!!
Flash-speicher 8kB (4kWorte)
Einstellbar sind Bootloader der Größe:
128 Words ( 256 Byte) 256 Words ( 512 Byte) 512 Words (1024 Byte) * 1024 Words (2048 Byte)
8 KByte Flashhpeicher: 8192 Byte 0x2000 1024 Byte f. Bootloader - 0x0400
Step by step
●
Änderungen in Makefile eintragen
●
make
●
make flash
●
make fuse
●
Der Bootloader sollte nun einsatzbereit sein
●
Änderungen in Makefile eintragen
●
make
●
make flash
●
make fuse
●
Der Bootloader sollte nun einsatzbereit sein
Step by Step – Folge 2
●
cd Anwendung
●
make
– Anwendung muss nun für 11059200 Mhz gebaut werden!
●
stty ispeed 9600 ospeed 9600 -F /dev/ttyUSB0
●
cat main.hex> /dev/ttyUSB0
●
Eine Udev-Regel richtet /dev/ttyUSB0 mit den Rechten 0666 ein.
●
cd Anwendung
●
make
– Anwendung muss nun für 11059200 Mhz gebaut werden!
●
stty ispeed 9600 ospeed 9600 -F /dev/ttyUSB0
●
cat main.hex> /dev/ttyUSB0
●
Eine Udev-Regel richtet /dev/ttyUSB0 mit den Rechten 0666 ein.
SUBSYSTEM=="tty", DRIVERS=="pl2303", MODE="0666", KERNELS=="ttyUSB*"
Die Angaben hier beziehen sich Auf die Einstellungen von
s. 26
GtkTerm
●
Recht brauchbares Terminalprogramm für serielle Schnittstellen
●
Configuration – Port
– Baud Rate: 9600
– Port: /dev/ttyUSB0
– Flow Controll: Xon/Xoff
●
File – Send raw file
●
Recht brauchbares Terminalprogramm für serielle Schnittstellen
●
Configuration – Port
– Baud Rate: 9600
– Port: /dev/ttyUSB0
– Flow Controll: Xon/Xoff
●