Forum: Projekte & Code Micronucleus - USB-Bootloader für ATtiny


von Tim  . (cpldcpu)


Lesenswert?

Ich wollte gerne auf Micronucleus hinweisen. Hierbei handelt es sich um 
einen USB-Bootloader für den ATtiny85:

https://github.com/micronucleus

Die Bootloader wurde ursprünglich für den Digispark entwickelt 
(www.digistump.com), ist aber ein unabhängiges Open Source Projekt, 
welches von unterschiedlichen Leuten weiterentwickelt wird. Ich habe den 
Release der letzten Version getrieben.

Der Hauptvorteil gegenüber ähnlichen Bootloadern, wie z.B. dem vom 
Adafruit trinket, ist eine deutlich geringere Speichernutzung. Die 
aktuelle Version belegt weniger als 1900 bytes.

Es ist geplant, noch andere ATtinies zu unterstützen, die Codegröße 
weiter zu reduzieren und die USB-Kompatibilität zu verbessern.

:
von Cool aber (Gast)


Lesenswert?

und wo is die Doku?

von Davis (Gast)


Lesenswert?

Warum sollte man überhaupt einen USB-Bootloader nehmen? Warum nicht 
einen RS232-Bootloader? Dieser ist wesentlich freundlicher zu den 
Ressourcen.

Noch etwas: auf "github" sieht das ganze Projekt ziemlich unaufgeräumt 
aus.

von Tim  . (cpldcpu)


Lesenswert?

Davis schrieb:
> Warum sollte man überhaupt einen USB-Bootloader nehmen?

z.B. wenn man sowieso V-USB verwendet.

Die zweite Anwendungsmöglichkeit ist in einem "mini-Arduino". 
Plattformen wie der Digispark und Trinket sind inzwischen ziemlich 
erfolgreich und weit verbreitet.

von Tim  . (cpldcpu)


Lesenswert?

Davis schrieb:
> Noch etwas: auf "github" sieht das ganze Projekt ziemlich unaufgeräumt
> aus.

Ja, das Projekt ist durch viele Hände gegangen. Allerdings bin ich mir 
nicht ganz sicher, ob Du das Repository oder Github selbst meinst?

von A Hempel (Gast)


Lesenswert?

Tim    schrieb:
> wenn man sowieso V-USB verwendet

Kann ich gut gebrauchen, mit 4 IO/ADC Pins für ein Touchpanel via USB. 
Aber wie funktioniert das?

von Tim  . (cpldcpu)


Lesenswert?

Ich denke, es ist wirklich eine Schnellstart-Anleitung erforderlich. 
Prinzipiell ist es recht einfach:

1) Installieren des Bootloaders auf dem ATTiny85

Voraussetzung:
- Aktuelle GCC-AVR Toolchain
- AVRdude

Wechseln in das Verzeichnis /firmware.
Wenn kein USBASP verwendet wird, muss das makefile angepasst werden 
(PROGRAMMER=)
Wenn USB nicht an PB3 und PB4 angeschlossen ist, muss 
"bootloaderconfig.h" angepasst werden

"make" - compiliert die firmware
"make flash" - programmiert den ATtiny85
"make fuses" - Setzt die fuses (clock multiplier, self programming)

2) Installieren der Devicetreiber aus dem Archiv im Hauptverzeichnis

3) Uploaden eines Programms auf ein Device mit installiertem Bootloader

Entsprechendes Tool aus /commandline/builds heraussuchen (windows/mac 
vorhanden, Linux muss selbst compiliert werden)

micronucleus --help gibt eine Befehlsübersicht aus.

micronucleus <programmname.hex> lädt ein hexfile hoch.

Der Bootloader ist in der Standardkonfiguration so ausgelegt, dass er 
einen Timeout von 6 Sekunden hat. Das heisst, nach dem Reset ist für 
sechs Sekunden der Bootloader am USB-Port zu sehen. Danach wird das 
Userprogramm gestartet.

: Bearbeitet durch User
von A Hempel (Gast)


Lesenswert?

Und wie kann man dann auf die V-USB Funktionen zugreifen?

von Tim  . (cpldcpu)


Lesenswert?

A Hempel schrieb:
> Und wie kann man dann auf die V-USB Funktionen zugreifen?

Wie Du es sonst auch machen würdest. Der Bootloader verbiegt den PCINT0, 
verzweigt aber in Dein User-Programm wenn der Bootloader nicht aktiv 
ist. Mit den par Taktzyklen Verzögerung kommt V-USB noch zurecht.

: Bearbeitet durch User
von A Hempel (Gast)


Lesenswert?

Ach so, ich dachte, du meinst, dass die V-USB-Funktionen des Bootloaders 
von der Anwendung auch genutzt werden können (ginge das nicht, wenn man 
Anwendung und Bootloader zusammen erstellt oder linkt?)..

von Tim  . (cpldcpu)


Lesenswert?

A Hempel schrieb:
> (ginge das nicht, wenn man
> Anwendung und Bootloader zusammen erstellt oder linkt?)..

Theoretisch ja, praktisch wird es daran scheitern, dass man sehr viel 
Flexibilität aufgibt. In V-USB werden alle Features durch Compilerflags 
definiert. Wenn V-USB Teil des Bootloaders ist, dann kann man diesen 
Teil nicht mehr updaten, oohne dass man den Bootloader neu hochlädt. 
Damit ist der Sinn der Bootloaders fraglich.

Besser ist es also, getrennte Konfigurationen für  Bootloader und 
User-Program zu verwenden und mit den zusätzlichen 1000 bytes zu leben.

: Bearbeitet durch User
von gugl (Gast)


Lesenswert?

Tim    schrieb:
> Es ist geplant, noch andere ATtinies zu unterstützen

ATtiny45 oder welche?

von Davis (Gast)


Lesenswert?

gugl schrieb:

> Tim    schrieb:
>> Es ist geplant, noch andere ATtinies zu unterstützen
>
> ATtiny45 oder welche?

ATTiny10.

von Tim  . (cpldcpu)


Lesenswert?

gugl schrieb:
> ATtiny45 oder welche?

841/84/167. 45 ist aber auch kein Problem.

Davis schrieb:
> ATTiny10.

Du kannst Dich ja mal 'dran versuchen :)

von da (Gast)


Lesenswert?

Ohgott ist das ein Chaos:

 - Win32 Binarys im Root-Verzeichnis
 - Irgendeine .bin Datei im Root-Verzeichnis (nyan-cat.bin)
 - Dokumentationen irgendwie wild überall verstreut

Zum Code:

 - Zeileneinrückungen völlig chaotisch
 - "//" Kommentare und /**/ gemischt
 - Vernestelte Kommentare

Raeum das Teil erstmal auf, das sieht massiv nach Frickelei aus ...

von gugl (Gast)


Lesenswert?

Tim    schrieb:
> wenn man sowieso V-USB verwendet.

Nach dem der Bootloader läuft habe ich "Reset disabled" und stelle nun 
fest, dass vusb-20121206 offenbar nicht mit deinen Standard-Pins 
kompatibel ist:

Micronucleus bootloaderconfig.h:
1
#if (defined __AVR_ATtiny85__) && (HARDWARE_CONFIG == TINY85_HARDWARE_CONFIG_2)
2
# define USB_CFG_DMINUS_BIT      3
3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
4
 * This may be any bit in the port.
5
 */
6
# define USB_CFG_DPLUS_BIT       4
7
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
8
 * This may be any bit in the port, but must be configured as a pin change interrupt.
9
 */
10
 #endif

vusb-20121206 usbconfig-prototype.h:
1
#define USB_CFG_DMINUS_BIT      4
2
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
3
 * This may be any bit in the port.
4
 */
5
#define USB_CFG_DPLUS_BIT       2
6
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
7
 * This may be any bit in the port. Please note that D+ must also be connected
8
 * to interrupt pin INT0! [You can also use other interrupts, see section
9
 * "Optional MCU Description" below, or you can connect D- to the interrupt, as
10
 * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
11
 * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
12
 * markers every millisecond.]
13
 */

Was nu?

von Tim (Gast)


Lesenswert?

Sowohl der Bootloader, als auch die Userapp sollten auf die gleichen 
USB-Pins konfiguriert sein. Am besten natürlich auf welche, an die der 
USB-Bus auch angeschlossen ist. Wird der Bootloader denn von Windows 
erkannt?

von Tim (Gast)


Lesenswert?

da schrieb:
> Raeum das Teil erstmal auf, das sieht massiv nach Frickelei aus ...

Ich muss Dir da zustimmen. Nur kann ich als ein bestehendes OS-Projekt 
von Anderen nicht einfach komplett umräumen, weil mir der Stil gerade 
nicht passt. Es hat sich aber schon einiges verbessert.

Dir muss ich als Vorschlag mitgeben, zu lernen, wie man konstruktiv 
kritisiert.

von gugl (Gast)


Lesenswert?

Tim schrieb:
> Wird der Bootloader denn von Windows erkannt?
Ja - wie ich gerade schrieb.

Tim schrieb:
> Sowohl der Bootloader, als auch die Userapp sollten auf die gleichen
> USB-Pins konfiguriert sein. Am besten natürlich auf welche, an die der
> USB-Bus auch angeschlossen ist.

Das ist schon klar. Aber du/ihr/micronucleus nutzt Pins, die von v-usb 
so gar nicht unmittelbar vorgesehen sind, und benutzt einen anderen 
Interrupt, wie ich gerade gesehen habe.

https://github.com/obdev/v-usb/tree/master/circuits
1
...
2
GENERAL DESIGN NOTES
3
====================
4
All examples have D+ on hardware interrupt INT0 because this is the highest
5
priority interrupt on AVRs. You may use other hardware interrupts (and
6
configure the options at the end of usbconfig.h accordingly) if you make sure
7
that no higher priority interrupt is used.
8
...


Das sieht in usbconfig.h so aus
1
/* ----------------------- Optional MCU Description ------------------------ */
2
3
/* The following configurations have working defaults in usbdrv.h. You
4
 * usually don't need to set them explicitly. Only if you want to run
5
 * the driver on a device which is not yet supported or with a compiler
6
 * which is not fully supported (such as IAR C) or if you use a differnt
7
 * interrupt than INT0, you may have to define some of these.
8
 */
9
/* #define USB_INTR_CFG            MCUCR */
10
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
11
/* #define USB_INTR_CFG_CLR        0 */
12
/* #define USB_INTR_ENABLE         GIMSK */
13
/* #define USB_INTR_ENABLE_BIT     INT0 */
14
/* #define USB_INTR_PENDING        GIFR */
15
/* #define USB_INTR_PENDING_BIT    INTF0 */
16
/* #define USB_INTR_VECTOR         INT0_vect */

Den Teil vom Code habt ihr gar nicht angefasst (bootloaderconfig.h:244), 
sondern weiter vorher dupliziert (Z. 194):
1
// setup interrupt for Pin Change for D+
2
#define USB_INTR_CFG            PCMSK
3
#define USB_INTR_CFG_SET        (1 << USB_CFG_DPLUS_BIT)
4
#define USB_INTR_CFG_CLR        0
5
#define USB_INTR_ENABLE         GIMSK
6
#define USB_INTR_ENABLE_BIT     PCIE
7
#define USB_INTR_PENDING        GIFR
8
#define USB_INTR_PENDING_BIT    PCIF
9
#define USB_INTR_VECTOR         PCINT0_vect


Daher halte ich dein Statement für ausgesprochen unglücklich:

Tim    schrieb:
> z.B. wenn man sowieso V-USB verwendet.

Es gibt also zwei Möglichkeiten: andere Pins nutzen, wie von obdev 
vorgesehen, und den entspr. geänderten Bootloader über ein "Upgrade" 
flashen, oder V-USB anpassen, so dass INT0 genutzt wird.

Letzteres ist etwas bequemer - reicht es, die USB_INTR_* Definitionen 
aus eurer config zu nutzen, oder muss an anderen Stellen auch etwas 
angefasst werden?

von gugl (Gast)


Lesenswert?

gugl schrieb:
> V-USB anpassen, so dass INT0 genutzt wird.

Quatsch, ich meine PCINT

von Tim  . (cpldcpu)


Lesenswert?

Sorry für die Verwirrung. Die Standardkonfiguration von Micronucleus hat 
den Vorteil, dass sich das USI noch verwenden lässt. Für V-USB selbst 
ist es egal, ob INT0 oder PCINT0 verwendet werden. Du kannst die 
Interrupt-Konfiguration aus dem Bootloader problemlos in Deinen V-USB 
Code übernehmen.

von gugl (Gast)


Lesenswert?

Ok danke, mehr ist offenbar wirklich nicht zu machen - es funktioniert.

von gugl (Gast)


Lesenswert?

http://www.embedded-creations.com/projects/attiny85-usb-bootloader-overview
"
Update September 2013 - Adafruit released the Trinket and Gemma dev 
boards which use the ATtiny85 and the same boot loader mechanisms as I 
did.  Their boot loader is not as space efficient as micronucleus, as 
their goal was to work with an unmodified AVRDUDE executable.
"

https://github.com/adafruit/Adafruit-Trinket-Gemma-Bootloader

von Ingo S. (ingo-s)


Angehängte Dateien:

Lesenswert?

Wieso entwickelt man so einen riesigen ATtiny Bootloader, wo es doch 
wesentlich kleinere gibt?

2006 habe ich den nur 96 Byte TinyLoader von Pedersen  enddeckt, durch 
einen Fehler in der PC App benötigt er zwar eine Page mehr, ist aber 
wohl immer noch ungeschlagen in der Größe.
Ich setze ihn seitdem in allen meinen Tiny Projekten ein. Es gibt von 
ihm auch eine Consolen App, die die eigene App mit dem Bootloader auf 
Hex-File Basis vereint.

Die Webseite zum downloaden gibt es leider nicht mehr, habe aber noch 
alle Files falls Bedarf besteht.

Gruß Ingo

von gugl (Gast)


Lesenswert?

Mhh. Der Bootloader funktioniert gut bislang, nun habe ich aber Pech 
gehabt, denn ich muss die USB-Pins ändern, da #RESET zu schwach ist, um 
ein Touchpanel zu "treiben".
Das ergibt 2 Möglichkeiten:
 - #RESET wird für USB benutzt, aber das macht -bestimmt- definitiv 
(s.u.) Probleme
 - #RESET bekommt einen Transistor und schaltet das Panel an GND, ein 
anderer Pin wird als ADC genutzt

Gibt es einen Pin-Belegungs-Standard?

https://s3.amazonaws.com/digistump-resources/files/97a1bb28_DigisparkSchematic.pdf
PB3, PB4

https://www.sparkfun.com/datasheets/Widgets/AVR-Stick-v12.pdf
PB0, PB2

http://codeandlife.com/2012/02/22/v-usb-with-attiny45-attiny85-without-a-crystal/
PB1, PB2

Eher nicht, also egal.

Ich will's doch mal mit USB am RESET-Pin probieren, d.h. nur zwei 
Leitungen tauschen.

Also den Bootloader an die neuen Pins angepasst und dann das 
bootloader-upgrade erzeugt ..

https://github.com/micronucleus/micronucleus/tree/master/upgrade

http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-1.9.3-p484.exe?direct

.. aber da hakt's noch:
1
F:\micronucleus-master\upgrade>ruby generate-data.rb micronucleus_ATtiny85_PB3-5.hex
2
I:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- libusb (LoadError)
3
        from I:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
4
        from F:/micronucleus-master/ruby/micronucleus.rb:1:in `<top (required)>'
5
        from generate-data.rb:1:in `require_relative'
6
        from generate-data.rb:1:in `<main>'

Macht doch keinen Sinn, zum Erzeugen der Daten wird libusb sicher nicht 
gebraucht. Also die erste Zeile in "micronucleus.rb" mit '#' 
auskommentiert und nochmal probiert .. spuckt einen Haufen Bytes aus und 
schreibt "bootloader_data.c".

WinAVR2010.. erzeugt dann das upgrade.hex

Mit bootloader flashen.. wenn jetzt was schiefgeht, bin ich draußen :-)

Pins umlöten..
Anwendung anpassen..
Mit bootloader ... "Unknown Device" !!

Es wäre wohl besser gewesen, das mit V-USB erstmal auszuprobieren, 
anstelle gleich den Bootloader zu tauschen..

Also, der AVR #RESET Pin ist mehr oder weniger unbrauchbar..

Und der t85 auch, da hilft nur:
https://www.mikrocontroller.net/articles/AVR_HV-Programmer
http://www.simpleavr.com/avr/hvsp-fuse-resetter

von o_O (Gast)


Lesenswert?

gugl schrieb:
> Also, der AVR #RESET Pin ist mehr oder weniger unbrauchbar..

Du spielst aber auch mit dem Feuer :)

Der Reset Pin kann ja weniger treiben, als die normalen I/O Pins. V-USB 
benötigt wegen der Zenerdioden einen einigermassen hohen Ausgangsstrom 
wenn der Pin auf Hi ist. Vielleicht klappt es ja ohne die Zener-Diode? 
Dann müsstest Du allerdings die Betriebsspannung des Controllers 
absenken, damit der USB-Port nicht geschädigt wird, was evtl. wieder 
Probleme mit der hohen Taktfrequenz mit sich bringt.

Ingo Stahl schrieb:
> 2006 habe ich den nur 96 Byte TinyLoader von Pedersen  enddeckt, durch

Ein netter Bootloader, aber er kann kein USB! Darum geht es hier gerade.

von Tim  . (cpldcpu)


Lesenswert?

Seit ein paar Tagen ist V1.11 draussen:

https://github.com/micronucleus/micronucleus

1
Changes compared to v1.10:
2
 • The size was reduced further to 1816 bytes, allowing 6380 bytes user space. 
3
   (320 bytes more than in v1.06)
4
 • The bootloader will always start and never quit if no user program was loaded. 
5
   This allows for much easier driver installation. Use the new "--erase-only" 
6
   function of the command line tool to create a clean device.
7
 • New entrymodes have been added. See firmware release notes and source code 
8
   comments for details.
9
 • All incoming data is now CRC checked to improve robustness.

: Bearbeitet durch User
von Fuchu R. (fuchur)


Lesenswert?

Hallo,

ich habe mir die aktuelle Version aus github gezogen, da ich derzeit mit 
einem attiny167 spiele und entdeckt habe, dass Du den auch gerade 
unterstützen möchtest.

Ich kann nach erster Analyse den Vorrednern nur zustimmen, dass ein 
Aufräumen des Codes an einigen Ecken mehr als angebracht erscheint.

So halte ich es für sinnvoll, unterschiedliche Controller bzw. 
Konfigurationen in eigene Dateien auszugliedern, die dann jeweils 
inkludiert werden, anstatt per bedingter Compilierung alles in eine 
Datei zu packen.

Nun aber zu meinen konkreten Fragen:
BOOTLOADER_ADDRESS wird im Makefile als HEX-Value ohne führendes "0x" 
definiert:
1
BOOTLOADER_ADDRESS = 3A80

Dies wird dann in einem weiteren Schritt für einige DEFINES nachgeholt:
1
DEFINES = -DBOOTLOADER_ADDRESS=0x$(BOOTLOADER_ADDRESS) #-DDEBUG_LEVEL=2
In den LDFLAGS wird dann aber der Wert ohne "0x" übergeben:??
1
LDFLAGS = -Wl,--relax,--section-start=.text=$(BOOTLOADER_ADDRESS),-Map=main.map

Warum das?

Weiterhin zur Berechnungsformel der BOOTLOADER_ADDRESS im Kommentar:
Die Adresse soll auf einer Seitengrenze liegen, soweit klar.
Warum wird allerdings auf eine Seite abgerundet und nicht aufgerundet?
Die aktuelle Adresse passt so gar nicht zum attiny167, der ja 128 Byte 
Seiten hat (64 Words anstelle 32 Words des attiny85).

Weiter zu den verwendeten USB-Pins: Hier werden PB0 und PB2 verwendet.

Im Kommentar steht:
1
Please note that D+ must also be connected to interrupt pin INT0!

Diese Anforderung wird jedoch nur von PB6 erfüllt.

Ich habe sowohl mit Deinen Einstellungen, als auch mit PB6 (D+) und PB3 
(D-) versucht, bekomme den Loader jedoch nicht zum Laufen.

PB3/PB6 halte ich für die idealeren Pins, da somit das USI Interface 
PB0-PB2 frei bleibt. Das kann jedoch je nach Anwendung unterschiedlich 
aussehen.

Zunächst wäre es mal gut, den Loader überhaupt funktionstüchtig zu 
bekommen.

Läuft der Loader bei Dir auf den attiny167 schon, oder gibt es jemanden, 
der den Loader auf einem attiny167 installiert hat?

: Bearbeitet durch User
von Fuchu R. (fuchur)


Lesenswert?

Ich antworte mir hier mal selbst zur Frage der Bootlader-Adresse.

Die Berechnung stimmt wohl, da der Bootloader soweit oben im Adressraum 
abgelegt werden soll, als möglich.

Hier der Kommentar aus dem Makefile:
1
# hexadecimal address for bootloader section to begin. To calculate the best value:
2
# - make clean; make main.hex; ### output will list data: 2124 (or something like that)
3
# - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068
4
# - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125
5
# - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780

Zu genau diesen Zahlen habe ich eine Beschreibung erstellt:
1
 page     Usage:  B = Bootloader   u = unused   f = free for programming
2
address
3
4
0x1FC0    BBBBBBBBBBBBBBuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
5
0x1F80    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
6
0x1F40    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
7
  ..                          
8
  ..                           
9
0x17C0    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 
10
0x1780    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 
11
0x1740    ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
12
  ..
13
0x0040    ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
14
0x0000    ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Der Bootloader benötigt als Speicher immer Vielfache der 
Speicherseitengröße des jeweiligen Prozessors.  Beim Attiny167 also 128 
Byte.  Da die Startadresse errechnet wird, wird der freie Speicher 
abgerundet, was erst nach einigem Nachdenken aus der Dokumentation 
hervorging.

Es muss allerdings, meinem Kenntnisstand nach, die Summe von .text und 
.data aus der Compilerangabe herangezogen werden.

Optimierungen des Bootloaders machen -insbesondere für den attiny167- 
wohl nur dann Sinn, wenn eine weitere Speicherseite für Programme 
verfügbar wird.

Aussagen wie:
> The size was reduced further to 1816 bytes, allowing 6380 bytes user space.
> (320 bytes more than in v1.06)
passen dann nicht, da dies keine Vielfachen von Seitenangaben sind. Oder 
habe ich irgendetwas übersehen?

Im Code werden ja dann die Seiten für die Applikation gelöscht, was zu 
meiner obigen Grafik passt:
1
static inline void eraseApplication(void) {
2
3
  uint16_t ptr = BOOTLOADER_ADDRESS;
4
5
  while (ptr) {
6
    ptr -= SPM_PAGESIZE;
7
    boot_page_erase(ptr);
8
  }
9
  ...

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Hi Fuchur,

vielen Dank für Deine Kommentare. Als erstes muss ich darauf hinweisen, 
dass Du herzlich eingeladen bist, Änderungsvorschläge direkt als 
Pull-Request zu submitten :)

https://github.com/micronucleus/micronucleus/pulls

Fuchu R. schrieb:
> Nun aber zu meinen konkreten Fragen:
> BOOTLOADER_ADDRESS wird im Makefile als HEX-Value ohne führendes "0x"
> definiert:

Guter Punkt. Das scheint bereits vom USBasploader zu kommen. Warum es so 
ist, weiss ich auch nicht. Am Makefile habe ich bisher nichts geändert, 
da soweit alles funktioniert.

Fuchu R. schrieb:
> ich habe mir die aktuelle Version aus github gezogen, da ich derzeit mit
> einem attiny167 spiele und entdeckt habe, dass Du den auch gerade
> unterstützen möchtest.

Die Attiny167-Unterstützung ist bisher nur Trockenschwimmen. Ich habe 
keinen 167er und konnte sie bisher nicht testen. Erik von Digistump wird 
die Version testen, da die nächste Version des Digisparks auf dem 
ATtiny167 basieren soll.

Bisher ist noch kein Support für einen far jmp implementiert. Daher muss 
der Bootloader innerhalb der ersten 8kb liegen. Ist das vielleicht das 
Problem? Funktioniert V-USB generell auf Deinem ATtiny167?

Fuchu R. schrieb:
> Im Kommentar steht:Please note that D+ must also be connected to
> interrupt pin INT0!
> Diese Anforderung wird jedoch nur von PB6 erfüllt.

Das stammt aus der V-USB Dokumentation und gilt nur, wenn INT0 verwendet 
wird. Auf den neueren ATtinies mit pin change interrupt ist die 
Pinzuordnung egal.

Die anderen Fragen hast Du Dir ja schon selbst beantwortet :)


Fuchu R. schrieb:
> Es muss allerdings, meinem Kenntnisstand nach, die Summe von .text und
> .data aus der Compilerangabe herangezogen werden.

Nach avr-objcopy gibt es nur eine .text section.

Fuchu R. schrieb:
> Optimierungen des Bootloaders machen -insbesondere für den attiny167-
> wohl nur dann Sinn, wenn eine weitere Speicherseite für Programme
> verfügbar wird.

Korrekt.

> Aussagen wie:
>> The size was reduced further to 1816 bytes, allowing 6380 bytes user space.
>> (320 bytes more than in v1.06)
> passen dann nicht, da dies keine Vielfachen von Seitenangaben sind. Oder
> habe ich irgendetwas übersehen?

Der Userspace ist natürlich in Vielfaches der Seitengröße. Die Codegroße 
ist unabhängig von der Seitengroße.

: Bearbeitet durch User
von Fuchu R. (fuchur)


Lesenswert?

> Als erstes muss ich darauf hinweisen, dass Du herzlich eingeladen bist,
> Änderungsvorschläge direkt als Pull-Request zu submitten :)
Dazu muss ich mich wohl erstmal in Git einarbeiten. Das ist doch 
deutlich komplexer als SVN.

Ich bin gerne bereit die Doku zumindest in den Dingen glattzuziehen, 
über die ich stolpere. Ich habe die Erfahrung gemacht, dass keine Doku 
mitunter weniger schlimm, als veraltete oder widersprüchliche Doku ist.

> Nach avr-objcopy gibt es nur eine .text section.
Hmm, dann wäre der Kommentar ja ganz daneben, der nur .data in die 
Berechnung einbeziehen will.
Im attiny167-Zweig gibt es jedoch tatsächlich nur eine .text-Ausgabe, 
während es im Master-Zweig nur eine .data Ausgabe gibt.

Nach diff auf das Makefile wird im tiny167-Zweig avr-size auf das 
bin-file ausgeführt
1
main.hex:  main.bin
2
  @rm -f main.hex main.eep.hex
3
  @avr-objcopy -j .text -j .data -O ihex main.bin main.hex
4
  @avr-size main.bin
Im Master-Zweig jedoch auf das hex-file
1
main.hex:  main.bin
2
  rm -f main.hex main.eep.hex
3
  avr-objcopy -j .text -j .zerotable -j .data -O ihex main.bin main.hex
4
  avr-size main.hex
Demnach gibt es nach avr-objcopy wohl nur noch .data, was insofern auch 
logisch ist. Hier würde ich in die Doku den Hinweis auf die Addition von 
.data und .text aufnehmen, dann spielt es z.B. keine Rolle, ob *.hex 
oder *.bin ausgewertet werden.

> Bisher ist noch kein Support für einen far jmp implementiert.
> Daher muss der Bootloader innerhalb der ersten 8kb liegen.
> Ist das vielleicht das Problem?
Das werde ich gleich nachher mal ausprobieren. Ich habe bisher natürlich 
versucht, den Loader ans obere Ende der 16k zu bekommen.  Mit dem Loader 
in der Mitte ist der attiny167 auch relativ witzlos.
Stellt sich mir nur die Frage: Warum schreit der Compiler hier nicht? 
Ich bekam sonst auf die Finger, wenn ich zu weit springen wollte.

> Funktioniert V-USB generell auf Deinem ATtiny167?
Eine kleine per ISP hochgeladene Testanwendung (wackelt alle 30 Sekunden 
mit dem Mauszeiger), funktioniert an einem Rechner ohne Probleme zu 
100%, wird an zwei anderen jedoch nur als fehlerhaftes USB-Gerät 
erkannt.
Ich verwende die V-USB Kleinteile aus dem Guloshop 
(https://guloshop.de/shop/Zubehoer-und-Kleinteile/V-USB-Kleinteileortiment::76.html) 
und ein USB-Kabel einer alten Maus.
Ich habe hier nun vor, das USB-Kabel noch zu kürzen, weiterhin will ich 
den Quarz noch tauschen, da dieser aus meiner Bastelkiste stammt.


Ich halte Dich auf dem Laufenden, kann sich aber verzögen, da der 
Brotjob in den nächsten Tagen mir wenig Luft lassen wird.

von Tim  . (cpldcpu)


Lesenswert?

Fuchu R. schrieb:
>> Als erstes muss ich darauf hinweisen, dass Du herzlich eingeladen bist,
>> Änderungsvorschläge direkt als Pull-Request zu submitten :)
> Dazu muss ich mich wohl erstmal in Git einarbeiten. Das ist doch
> deutlich komplexer als SVN.

Es gibt einen Windows-Client der ziemlich straightforward ist. 
Komplizierter als SVN ist es eigentlich nicht, wenn man das Fork&Merge 
Prinzip verstanden hat. Github bietet auch einige 
Projektverwaltungsfunktionen an, um Bugs zu dokumentieren.

Ich habe inzwischen den far jmp Support ergänzt, mangels 16kb ATtiny 
aber noch nicht getestet. Die aktuelle Version liegt hier:
https://github.com/micronucleus/micronucleus/tree/testing-V2-T187

Es sollte zumindest soweit funktioniert, dass der Bootloader per USB vom 
Computer erkannt wird. Das konnte die alte Version auch schon. Ich habe 
die Ausgabe von AVR-Objcopy noch einmal klargestellt.

Änderungen sind übrigens hier dokumentiert:
https://github.com/micronucleus/micronucleus/pull/43

Fuchu R. schrieb:
>> Funktioniert V-USB generell auf Deinem ATtiny167?
> Eine kleine per ISP hochgeladene Testanwendung (wackelt alle 30 Sekunden
> mit dem Mauszeiger), funktioniert an einem Rechner ohne Probleme zu
> 100%, wird an zwei anderen jedoch nur als fehlerhaftes USB-Gerät
> erkannt.
> Ich verwende die V-USB Kleinteile aus dem Guloshop
> 
(https://guloshop.de/shop/Zubehoer-und-Kleinteile/V-USB-Kleinteileortiment::76.html)
> und ein USB-Kabel einer alten Maus.

Ein Aufbau auf einem Breadboard ist natürlich immer etwas kritisch. Die 
Kabellänge sollte keinen so großen Einfluss haben, da das Signal durch 
die Serienwiderstände terminiert wird.

von Tim  . (cpldcpu)


Lesenswert?

Die ATtiny167 Version ist inzwischen erfolgreich getestet worden.

https://github.com/micronucleus/micronucleus/tree/testing-V2-T187

: Bearbeitet durch User
von Fuchu R. (fuchur)


Lesenswert?

Hallo zusammen,

ich kann bestätigen, dass die aktuelle Version nun auch bei mir läuft.
Abweichende Konfiguration:
D- auf PB3, D+ auf PB6,
da ich das I2C auf PB0/PB2 nutzen möchte.

Mein Aufbau wird nun auch an allen getesteten Rechnern erkannt, nachdem 
ich den Quarz getauscht habe.

Kommt die weitere Code-Reduktion überwiegend aus dem Weglassen der 
PLL-Taktsynchronisation für den tiny85?

von Tim  . (cpldcpu)


Lesenswert?

Fuchu R. schrieb:
> Mein Aufbau wird nun auch an allen getesteten Rechnern erkannt, nachdem
> ich den Quarz getauscht habe.

Prima!

> Kommt die weitere Code-Reduktion überwiegend aus dem Weglassen der
> PLL-Taktsynchronisation für den tiny85?

Ja, das OSCCAL Handling belegt ca 100 Bytes. Allerdings ist auch die 16 
MHz Version von V-USB deutlich kleiner als die 16.5 MHz Version.

von Tim  . (cpldcpu)


Lesenswert?

Hier ist ein Artikel über die USB-Implementierung für Micronucleus V2:

http://cpldcpu.wordpress.com/2014/03/02/interrupt-free-v-usb/

MN V2 nutzt eine V-USB Modifikation, die ohne Interrupts auskommt. Das 
hat erhebliche Vorteile für den Bootloader, da dann der Interrupt-Vektor 
im Nutzerprogramm nicht mehr gepatched werden muss. Interessanterweise 
wird die USB Übertragung auch deutlich schneller.

: Bearbeitet durch User
von Fuchu R. (fuchur)


Lesenswert?

> Die Attiny167-Unterstützung ist bisher nur Trockenschwimmen. Ich habe
> keinen 167er und konnte sie bisher nicht testen. Erik von Digistump wird
> die Version testen, da die nächste Version des Digisparks auf dem
> ATtiny167 basieren soll.


Ist das der attiny mit micronucleus?

https://www.kickstarter.com/projects/digistump/digispark-pro-tiny-arduino-ready-mobile-and-usb-de

: Bearbeitet durch User
von Tim  . (cpldcpu)


Lesenswert?

Fuchu R. schrieb:
> Ist das der attiny mit micronucleus?

Ja, das Board nutzt auch Micronucleus.

von Tim  . (cpldcpu)


Lesenswert?


: Bearbeitet durch User
von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Dies ist mein eigenes Board. Es nutzt den gleichen Footprint wie ein DIP 
ATtiny85:

http://cpldcpu.wordpress.com/2014/04/25/the-nanite-85/

: Bearbeitet durch User
von gogo (Gast)


Lesenswert?

Hallo Tim,
Ich habe vor kurzem angefangen, mit V-USB auf dem tiny85 zu spielen.
Über kurz oder lang bin auch ich über micronucleus gestolpert.
Bevor ich mir einen tiny85 bricke folgende prinzipielle Fragen bzw. 
Annahmen zur Bestätigung/Korrektur:

-- micronucleus wird als USB Gerät mit eigener VID/PID erkannt?
-- Welche Device Klasse implementiert micronucleus?
-- Wenn nun mein Userprogramm auch ein USB Gerät implementiert, muss ich 
dann
---- entweder einen Pin für das Device (dis)connect (schaltbarer Pullaup 
auf D-) einplanen
---- oder das Starten des Bootloaders an einen Hardwarezustand knüpfen?

Mir gefällt für die zweite Variante die Beschaltung des RST Pins in 
deinem Nanite Projekt sehr gut, da ich in meinem Projekt nur 
Ausgangspins mit LEDs für die Bootloaderlogik hernehmen kann.

Rund um diese RST Beschaltung im Nanite ist mir noch aufgefallen:
---- Was passiert, wenn der Nanite am USB Port angeschlossen bleibt, 
nachdem ein Userprogramm startet - i.e. usb_poll() wird ja dann in der 
Regel nimmer aufgerufen? Verliert der Nanite hier über kurz oder lang 
die Verbindung?
---- Falls das Userprogramm auch ein USB Gerät implementiert und deinen 
Vorschlag mit dem WDT inkludiert: Kann ich da dann überhaupt eine 
Reenumeration und damit ein erneutes korrektes Erkennen des Bootloaders 
am USB Bus erreichen?


Danke für deine Arbeit am micronucleus ...... Ich kann nur noch soviel 
sagen (da ich selber als Softwareentwickler arbeite): Wenn am Ende des 
Tages die einzigen Probleme gemischte ANSI-C und C++ Kommentare, oder 
unerklärliche historisch gewachsene preproc defines in prähistorischen 
Makefiles sind, dann gehe ich getrost in den Feierabend.

LG
Gogo

von Tim (Gast)


Lesenswert?

Hallo Gogo,

vielen Dank für Dein Feedback.

Der zentrale Punkt Deiner Fragen scheint sich darum zu drehen, was 
passiert wenn der Bootloader fertig ist und das Userprogram gestartet 
wird. Es ist ganz einfach: Die USB-Verbindung wird durch einen Bus Reset 
getrennt und der Computer sieht das Device nicht mehr. Wenn Dein 
Userprogramm auch V-USB Einsetzt, wird es als neues Device auftauchen.

Übrigens musst Du die Reset-Fuse nicht setzen, damit MN funktioniert. Du 
kannst es auch risikofrei ohne ausprobieren.

Grüße,
Tim

von gogo (Gast)


Lesenswert?

Hallo Tim,
Danke für die Antwort - Micronucleus verabschiedet sich tatsächlich vom 
USB Bus und mein Userprogramm taucht auf - Ich habe mit offenem Mund das 
syslog verfolgt.
Ich verstehe aber noch immer nicht wie diese Magie fnktionieren kann ;)

-- In leaveBootloader wird zwar usbDeviceDisconnect gerufen - Ich habe 
den Pullup an D- aber weder an einen PortPin gelegt, und schon gar nicht 
micronucleus davon erzählt (in bootloaderconfig.h)
-- Ist es also das cli() direkt davor, das die USB Kommunikation brutal 
abwürgt?

Ich hatte nämlich folgendes vor:
-- ein einzelner Taster schickt (bei longpress) die UserApp in den 
Watchdog Tod, nachdem sie das USB-Device über ein, tatsächlich auch mit 
Hardware, hinterlegtes, usbDeviceDisconnect vom OS abmeldet (für den Pin 
hätte ich den RESET eingeplant gehabt)
-- micronucleus nutzt nun entweder den WD reset, oder den Tasterzustand 
als StartIndikator

Den RST will ich ohnehin deaktivieren (und mir damit den Pullup sparen) 
- Ist es für micronucleus vorteilhaft (stabilität, kompatibilität) wenn 
ich in meiner Schaltung USB_CFG_PULLUP_* vorsehe, und damit einen 
Hardware Disconnect ermögliche, oder würde das deiner Ansicht nach 
keinen Unterschied machen?

LG
Gogo

von Tim  . (cpldcpu)


Lesenswert?

Das USB-Device wird "abgemeldet" in dem von Micronucleus ein Bus-Reset 
erzwungen wird. Dazu werden beide Leitungen auf Low gezogen. Besser wäre 
es natürlich, wenn man den Pull-Up widerstand dazu auch abklemmen würde, 
aber es ist auch so noch alles innerhalb der Spezifikationen. Über den 
Pull-Up fließen gerade mal 5/1.5=3.3mA. Das ist für den AVR kein 
Problem.

Der Reset über den Watchdog ist beim Nanite genau so implementiert, wie 
Du es beschreibst. Schaue Dir einmal nanite.h an:

https://github.com/cpldcpu/Nanite/blob/master/Software/Nanite.h

In Micronucleus kannst Du als Bootloaderconfig entweder "ENTRY_WATCHDOG" 
nutzen, oder direkt den Taster abfragen, der den Watchdog-Reset auslöst. 
z.B. "ENTRY_JUMPER" und "JUMPER_PIN PB5". Letzeres ist etwas robuster, 
da es nicht auf das User-Program angewiesen ist.

von Tim  . (cpldcpu)


Lesenswert?

Micronucleus V2.0b ist fertig:

https://github.com/micronucleus/micronucleus

Micronucleus is a bootloader designed for AVR ATtiny microcontrollers 
with a minimal usb interface, cross platform libusb-based program upload 
tool, and a strong emphasis on bootloader compactness. To the authors 
knowledge this is, by far, the smallest USB bootloader for AVR ATtiny

The V2.0 release is a complete rewrite of the firmware and offers 
significant improvements over V1.x:

 • Support for the entire ATtiny family instead of only ATtiny85.
 • Much smaller size. All configurations are below 2kb.
 • Interrupt free V-USB: no patching of the user program INT-vector 
anymore.
 • Faster uploads due to new protocol.
 • Far jmp also allows using ATtinies with more than 8kb flash.
 • Many robustness improvements, such as compatibility to USB hubs and
   less erratic time out behavior.

Due to the many changes, also the upload tool had to be updated. The 
V2.0 upload tool is backwards compatible to the V1.X tool, though.

von Matthias D. (matthias42)


Lesenswert?

Großes Kompliment an Tim und alle anderen Beteiligten.
Die ganze V-USB Geschichte ist ja schon spannend und der Bootloader eine 
tolle Anwendung. Daumen hoch!

Weiterhin kann ich die Kritik bezüglich Chaos zumindest in der aktuellen 
Version nicht mehr nachvollziehen. Sieht alles sehr ordentlich aus und 
gut dokumentiert bzw. beschrieben.

von Matthias D. (matthias42)


Lesenswert?

Ach ja, kurze Frage noch.
Es gibt ja die Möglichkeit 16 und 16.5 Mhz (und noch weitere) zu 
konfigurieren. Welcher Wert verwendet werden soll durch F_CPU 
festgelegt, korrekt?

Konkrete Frage zu F_CPU = 16500000. So wie ich es verstanden habe, wird 
dann der interne RC Osizilators durch die Fuses auf 16 Mhz eingestellt 
und dann durch die OSCR auf 16.5 Mhz "getrimmt". Ist das korrekt?

von Tim  . (cpldcpu)


Lesenswert?

Danke für das Feedback!

Matthias Denzel schrieb:
> Konkrete Frage zu F_CPU = 16500000. So wie ich es verstanden habe, wird
> dann der interne RC Osizilators durch die Fuses auf 16 Mhz eingestellt
> und dann durch die OSCR auf 16.5 Mhz "getrimmt". Ist das korrekt?

Ja, genau. Bei den Anderen muss teilweise noch stärker "Verstimmt" 
werden.

von Matthias D. (matthias42)


Lesenswert?

Super. Danke für die Info. Wirklich, wirklich pfiffiges Projekt. Habe 
mir den Kram mit den Interrupt umbiegen (in der aktuellen Version wohl 
nicht mehr nötig) durchgelesen. Sehr spannende Problemlösung.

Eine Sache verwirrt mich noch etwas.

Tim    schrieb:
> Ja, genau. Bei den Anderen muss teilweise noch stärker "Verstimmt"
> werden.

Ich habe es so verstanden, dass "OSCCAL_RESTORE_DEFAULT 0" dafür sorgt, 
dass der Wert von OSCCAL nach dem Ende des Bootloader auf diesem 
Kalibrierten Wert bleibt. Weiterhin sorgt "OSCCAL_SAVE_CALIB 1", dass 
der Kalibrierte Wert von OSCCAL in die Factory-Konfiguration des uC 
geschrieben wird, und damit in Zukunft automatisch geladen wird. Ist das 
beides korrekt?

Denn in der "t85_default/bootloaderconfig.h" steht oben:
1
 * Controller type: ATtiny 85 - 16.5 MHz
2
 ...
3
 *       OSCCAL :   Stays at 16 MHz

Müsste dort dann nicht "Stays at 16.5 Mhz" stehen? Oder habe ich da 
etwas noch nicht ganz verstanden?

Viele Grüße

von Tim  . (cpldcpu)


Lesenswert?

V2.01 ist fertig:

https://github.com/micronucleus/micronucleus


 • v2.01 July 26th, 2015

- Fixes "unknown USB device" issue when devices with <16MHz CPU clock 
were connected to a USB3.0 port.
- Fixes one bug that could lead to a deadlock if no USB was connected 
while the bootloader was active and noise was injected into the floating 
D+ input.
- D- line is released before the user program is started, instead of 
pulling it down. This solves various issues where Micronucleus was not 
recognized after a reset depending on the duration of the reset button 
activation. Att: This may lead to a "Unknown device" pop-up in Windows, 
if the user program does not have USB functionality itself.

von Tim  . (cpldcpu)


Lesenswert?

Matthias D. schrieb:
>
> Müsste dort dann nicht "Stays at 16.5 Mhz" stehen? Oder habe ich da
> etwas noch nicht ganz verstanden?

Stimmt. Das muss ich in der Zwischenzeit allerdings schon geändert 
haben?!?

von Martin H. (horo)


Lesenswert?

FYI:
https://github.com/micronucleus/micronucleus

• v2.03 February 13th, 2016

- Added page buffer clearing if a new block transfer is initiated. This 
fixes a critical, but extremely rare bug that could lead to bricking of 
the device if micronucleus is restarted after an USB error.

- #74 Fixed LED_INIT macro so it only modifies the DDR register bit of 
the LED. (Thanks @russdill)

Ciao, Martin

von Martin H. (horo)


Lesenswert?

Die Bootloader-Update-Funktion ist jetzt auch in Version 2.03 verfügbar. 
Ich habe die Ruby-Abhängigkeiten zu libusb entfernt, damit reicht eine 
minimale Ruby-Installation (nur getestet unter Linux - Debian Stable).
https://github.com/micronucleus/micronucleus

In meinem Fork https://github.com/Ho-Ro/micronucleus sind auch 
vorkonfigurierte Files update-*.hex in update/releases verfügbar, die 
ich aus den Dateien in firmware/releases gebaut habe - speziell für die 
"ruby-losen" Anwender. Die Version für t85_default.hex konnte ich 
problemlos mit dem alten Bootloader (Ver. 1.6) meiner China-Clones des 
Digispark ATtiny85 flashen.

Theoretisch ist es auch möglich, per avr-objcopy den Bootloader so 
umzuwandeln, dass er mit "upgrade.o" gelinkt werden kann, ein Fragment 
ist seit einigen Jahren im Makefile vorhanden. Jetzt fehlt "nur noch" 
der Linker-Aufruf und die Anpassung in "upgrade.c". Das ist aber eine 
Aufgabe für lange Winterabende...

Makefile
1
...
2
upgrade: main.bin
3
  avr-objcopy -O binary main.bin main.raw
4
  avr-objcopy -I binary -O elf32-avr \
5
        --rename-section .data=.text \
6
        --redefine-sym _binary_main_raw_start=loader \
7
        --redefine-sym _binary_main_raw_end=loader_end \
8
    main.raw bootloader_linkable.o  
9
...

Ciao, Martin

: Bearbeitet durch User
von Martin H. (horo)


Lesenswert?

Hi,

manchmal geht es schneller als man denkt...
Ich habe das Linken wie oben beschrieben hinbekommen, der Code sah gut 
aus - Listing und disassemblerten Code angeschaut, sah immer noch gut 
aus - dann Luft angehalten und mutig per Bootloader übergeflasht - 
gewartet - tada!, das Board bootet - und sogar mit dem neuen Bootloader, 
zum Test hatte ich die Wartezeit von sechs auf drei Sekunden verkürzt :)
(Wenn's schiefgegangen wäre, hätte ich meinen STK500 nach Jahren wieder 
mal aktivieren dürfen.)
-> https://github.com/Ho-Ro/micronucleus

Ciao, Martin

P.S.: Hat Spass gemacht, war so ähnlich wie ein altes Textadventure - 
allerdings mit nur einem Leben ;)

von gugle (Gast)


Lesenswert?

Martin H. schrieb:
> Die Version für t85_default.hex konnte ich
> problemlos mit dem alten Bootloader (Ver. 1.6) meiner China-Clones des
> Digispark ATtiny85 flashen.

Ich nicht :-(
So einen habe ich offenbar gerade zerflasht, deine Änderungen sind ja 
schon "upstream":

micronucleus.exe 2.0a4 crasht, wenn bereits ein Gerät steckt (enthalten 
im digistump AVR board in Arduino IDE)
commandline/builds/Windows/micronucleus.exe 2.0a5 braucht eine 
"libusb-0-1-4.dll" (in Wahrheit libusb-win32 1.2.6.0, die man sich aus 
windows_driver umbenennen kann), crasht dann zwar nicht, findet aber 
auch kein Gerät (von github).

Also mal upgrade/releases/upgrade-t85_default.hex mit 2.0a4 geflasht, 
dann aber

>USB Device not recognized
>Unknown USB Device (Device Descriptor Request Failed)

>Windows has stopped this device because it has reported problems. (Code 43)
>A request for the USB device descriptor failed.

Ohne HV-Programmer ist jetzt wohl Schluss!

von Martin H. (horo)


Lesenswert?

Ich hab auf meinen Rechnern nur Linux zu laufen, kann daher die 
Windows-Probleme leider nicht checken. Einen HV-Programmer brauchst Du 
sicher nicht, denn es sind ja keine Fuses verstellt. Ein einfacher 
ISP-Adapter (z.B. 
http://thomaspfeifer.net/einfaches_atmel_programmierkabel.htm) reicht. 
Oder was mit USB für wenige € beim Chinesen bestellt.

Ciao, Martin

von gugle (Gast)


Lesenswert?

Martin H. schrieb:
> Einen HV-Programmer brauchst Du
> sicher nicht, denn es sind ja keine Fuses verstellt.

Wie das, wenn der Digispark doch 6 IO-Pins, d.h. 0-5 und damit auch 
#RESET nutzt?

Jedenfalls habe ich mit einigem Aufwand den HVSP von
http://www.rickety.us/2010/03/arduino-avr-high-voltage-serial-programmer/

offenbar zum Laufen gebracht und konnte mit USBASP das aktuelle 
t85_default.hex (V 2.3) flashen.
Mit 2.0a4 gibt es damit zumindest keinen Absturz mehr, wenn bereits 
eingesteckt.

von gugle (Gast)


Lesenswert?

gugle schrieb:
> Wie das, wenn der Digispark doch 6 IO-Pins, d.h. 0-5 und damit auch
> #RESET nutzt?

Oh je. Ich hätte mir den Aufwand wohl tatsächlich sparen können.
Meine Klone hatten wohl (E:FE, H:DD, L:E1)
http://www.engbedded.com/fusecalc/

PLL 1K / 14 + 64 ms
BOD 2.7 V
SPI enabled
Self programming enabled

Aber die Original-Fuses "disablen" Reset: 
http://digistump.com/board/index.php/topic,2257.msg10551.html#msg10551
>Low fuse: 0xe1
>High fuse: 0x5d
>Extended fuse: 0xfe

Dann müsste es ja viele Post zum "defekten" Pin geben...

http://thetoivonen.blogspot.de/2015/12/fixing-pin-p5-or-6-on-digispark-clones.html

Egal. Danke jedenfalls an die Macher.

von gugle (Gast)


Lesenswert?

Nachdem ich nun wieder mal einen "digispark" wiederbelebt habe (fuse 
reset mit HV-programmer und flashen von micronucleus) habe ich mich eine 
zeitlang über das "USB Gerät nicht erkannt" gewundert, bis ich endlich 
auf die zurückgesetzten fuses gekommen bin... Daher hier nochmal zum 
kopieren:
1
>avrdude -p t85 -c usbasp -B 10
2
3
avrdude: set SCK frequency to 93750 Hz
4
avrdude: AVR device initialized and ready to accept instructions
5
6
Reading | ################################################## | 100% 0.01s
7
8
avrdude: Device signature = 0x1e930b (probably t85)
9
10
avrdude: safemode: Fuses OK (E:FE, H:DF, L:62)
11
12
avrdude done.  Thank you.
13
14
15
>avrdude -p t85 -c usbasp -B 10 -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m

Reset und SPI sind aktiv.


Wem die 6s Wartezeit des Bootloaders zu lang sind, wird hier fündig:
Beitrag "Re: Digispark Attiny85 schneller booten lassen."

von gugle (Gast)


Angehängte Dateien:

Lesenswert?

Anbei eine aktuelle micronucleus.exe mit MinGW gebaut (103 KB, 2018-05, 
Download/Nutzung auf eigene Gefahr). Mit online verfügbaren 
Releaseversion habe ich Probleme (228 KB, 2017-08, wartet endlos auf 
Gerät) und hatte bislang eine ältere aus den Arduino-Tools für Digispark 
genommen (82KB, 2016-04?).
Läuft bei mir ohne Beifahrer-DLL, YMMV.

https://github.com/micronucleus/micronucleus/tree/master/commandline

Stand 
https://github.com/micronucleus/micronucleus/commit/2118a88880fe9bd2f6aad9135f87d2e9abb473f2

Aus
https://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download

libusb-win32-bin-1.2.6.0.zip\libusb-win32-bin-1.2.6.0\lib\gcc\libusb.a
libusb-win32-bin-1.2.6.0.zip\libusb-win32-bin-1.2.6.0\include\lusb0_usb. 
h

kopieren (headerdatei in usb.h umbenennen) und den Pfad ggf. ins 
Makefile eintragen (sonst "...ld.exe: cannot find -lusb"):

++ USBFLAGS = -L...\\micronucleus\\commandline\\library

Infos dazu: 
http://www.mingw.org/wiki/specify_the_libraries_for_the_linker_to_use

Treiber: http://zadig.akeo.ie/  libusb 1.2.6.0 auswählen

Beitrag #5884228 wurde von einem Moderator gelöscht.
Beitrag #5885848 wurde von einem Moderator gelöscht.
Beitrag #5890198 wurde von einem Moderator gelöscht.
Beitrag #5890214 wurde von einem Moderator gelöscht.
Beitrag #5890414 wurde von einem Moderator gelöscht.
Beitrag #5890515 wurde von einem Moderator gelöscht.
Beitrag #5890535 wurde von einem Moderator gelöscht.
Beitrag #5890562 wurde von einem Moderator gelöscht.
Beitrag #5890576 wurde von einem Moderator gelöscht.
Beitrag #5891056 wurde von einem Moderator gelöscht.
Beitrag #5891999 wurde von einem Moderator gelöscht.
Beitrag #5892059 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.