Sainsmart Leonardo gebrickt!? (Er tuts wieder!)

Hallo Forum

Ich brauche eure Hilfe, da der Leonardo nicht mehr mit mir sprechen will. Folgendes ist passiert:

Ich habe an den Leonardo ein CCD Sensor angeschlossen und ein Test Script zum auslesen der Werte ausgeführt. Das hat funktioniert. Der Sensor hat 2048 Elemente. Im TestScript wurden aus vier Elementen ein Durchschnittswert gebildet und in einen Array abgelegt.

Da ich aber jeden Wert brauche habe ich also das Array auf 2048 Element erweitert. dann habe ich das geänderte Script hochgeladen. Das hat Win7 mit der Meldung quittiert das ein "unbekantes USB Gerät" gefunden worden ist für das es keinen Treiber gibt.

Wenn der Leonardo, während er am USB angeschlossen ist, resetet wird erscheint im Gerätemänager für kurze Zeit "SainSmart Bootloader", bevor wieder an gleicher Stelle "unbekanntes USB Gerät" erscheint.

Ich habe dann noch versucht mit einen UNO einen neuen Bootloader aufzuspielen. Dieser Versuch wird aber mit der Fehlermeldung "unbekannte Device ID 0x000000" zurückgewiesen.

Jetzt habe ich keine Idee mehr und wende mich voller Hoffnung an dieses Forum. Ist der Leonardo noch zu retten?

Mit Grüssen WG

Wie hast du genau den Sketch abgeändert? Sketch mit Kommentaren. Welche IDE? Welche Treiber? Welches BS?

Wenn der Leonardo, während er am USB angeschlossen ist, resetet wird erscheint im Gerätemänager für kurze Zeit “SainSmart Bootloader”, bevor wieder an gleicher Stelle “unbekanntes USB Gerät” erscheint.

So wie das tönt, hast Du einen Sketch hochgeladen, der den Leonardo in einen Freeze-Zustand bringt (wahrscheinlich Speicherüberlauf, nach Deiner Beschreibung). Du kannst ihn retten, wenn Du es schaffst, während der kurzen Zeit, in welcher “Sainsmart Bootloader” aktiv ist, einen Sketch hochzuladen. Also kurzen Blink-Sketch in die IDE laden, Leonardo resetten und gleichzeitig den Upload-Knopf drücken. Es kann sein, dass Du’s nicht beim ersten Mal triffst, aber mit etwas Übung kriegst Du das Timing raus.

Hi Es ist ein längeres Script. Komentare??? Wie hab ich es geändert? Na, ich habe das Array erweitert und dafür gesorgt das die Werte in die entsprechenden Felder gespeichert werde. (ich bin Programmierer). Aber offentsichtlich habe ich dabei einen Fehler gemacht!

IDE: die Standard IDE 1.0.5 (Hat die einen Namen?) BS: Win7 Treiber: Standard halt, der der bei der IDE dabei ist!

Warum sollen die Infos hilfreich sein? Grüsse WG

Die Arduino IDE Beta 1.5 hat neuere Treiber für die Boards dabei (betrifft hauptsächlich Windows8/8.1). Halte dich aber an pylons Anleitung.

Hi Pylon

Das habe ich schon versucht. Aber die IDE will ja zwingend einen COM-Port und der ist nicht vorhanden wenn "Bootloader" erscheint!

Grüsse WG

Geh mal auf C:\Users.“Dein Account”\AppData\Roaming\Arduino

In der prefernces.txt folgendes suchen “serial.port=COM7” und anpassen.
IDE sollte dafür aussein.

Der Leonardo hat nur 2.5kB RAM. Ein Array mit 2048 Elementen ist daher sehr grenzwertig. Wenn es ein int Array ist geht es sowieso nicht.

Diese Funktion zeigt dir den freien Speicher an:

int getFreeRAM() 
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Wahrscheinlich hast du den voll belegt

Diese Funktion zeigt dir den freien Speicher an

... wenn noch welcher frei ist. Ansonsten weiss man nicht, was passiert. ( Du kannst jedenfalls nicht erwarten eine 0 zu sehen, wenn für die Variable int v eigentlich gar kein RAM frei ist. )

Man kann ein Array aus 1024 Elementen anlegen. Oder das Array ganz weglassen. Dann sieht man was sonst noch hinzukommt.

Und wie gesagt, ginge das wenn überhaupt nur mit einem Array aus Bytes. Wenn man die USB-Host Funktion nicht braucht also besser auf einen Atmega1284 oder einen Arduino Mega umsteigen.

Oder ein externes RAM verwenden. Es gibt auch I2C RAMs die einfach anzusprechen sind. Den Speicher kann man halt nicht direkt wie internen Speicher verwenden und es ist langsamer. z.B.: http://www.elv.de/ic-fm-24c16.html 2kByte nicht-volatiles(!) FRAM. Das ist in 8 Pages zu 256 Bytes unterteilt. Man könnte also immer 256 Bytes im internen RAM speichern und die dann auf einmal schreiben.

Hallo Leute Vielen Dank das ihr mir helfen wollt. Ich bin gerade im Ski-Urlaub und hatte mir vorgenommen das Problem anzugehen wenn schlechtes Wetter ist. Heute Vormittag war schlechtes Wetter, daher der Post hier.

Leider habe ich beim einpacken der Sachen ein nicht vollgeschaltetes Micro-Usb-Kabel eingepackt. Mist. Aber ein USB to TTL Adapter. (und noch einen UNO).

Jetzt habe ich den Adapter an den UNO angeschlossen und das Blink Script hochgeladen. Geht! Das gleiche beim Leonardo, leider nicht. Aber er reagiert. Wenn ich hochlade fängt die "L" Diode an zu blinken. Nach einigen Sekunden hört das blinken wieder auf. Und der folgender Fehler wird gemeldet.

avrdude: error: buffered memory access not supported. Maybe it isn't
a butterfly/AVR109 but a AVR910 device?

Auch ein manueller Reset beim Hochladen(mehrmalig) hat keinen Erfolg gebracht.

Was mir dabei noch aufgefallen ist: Beim Leonardo leuchtet neben der ON-LED auch dauerhaft die TX-LED. Im Seriellen Monitor kommt aber nichts an.

Grüsse WG.

PS: Und ja, es ist ein INT-Array gewesen das ich auf 2048 elemente erweitert habe. Die Speicherbegrenzung ist mir leider nicht in den Sinn gekommen.(Hochsprachen-Programmierer halt ;-()

Serenifly:
Man kann ein Array aus 1024 Elementen anlegen. Oder das Array ganz weglassen. Dann sieht man was sonst noch hinzukommt.

Und wie gesagt, ginge das wenn überhaupt nur mit einem Array aus Bytes. Wenn man die USB-Host Funktion nicht braucht also besser auf einen Atmega1284 oder einen Arduino Mega umsteigen.

Oder ein externes RAM verwenden. Es gibt auch I2C RAMs die einfach anzusprechen sind. Den Speicher kann man halt nicht direkt wie internen Speicher verwenden und es ist langsamer. z.B.:
http://www.elv.de/ic-fm-24c16.html
2kByte nicht-volatiles(!) FRAM. Das ist in 8 Pages zu 256 Bytes unterteilt. Man könnte also immer 256 Bytes im internen RAM speichern und die dann auf einmal schreiben.

FRAM kannst Du in einem Taktzyklus schreiben. Darum hat ein Page-Write keinen Sinn. Andrs ist es bei EEproms da dort eine Schreibzyklus ca 5mS lang ist.

Grüße Uwe

Ja, man könnte auch Byte für Byte schreiben. Der Adress-Zähler inkrementiert intern bis 2047.

Du bist aber immer noch auf die 400kHz des I2C Busses limitiert. Es gibt lediglich kein zusätzliches Delay durch die Speicher-Architektur.

Hey

Ist euch mein Problem zu trival?

Grüsse

Es ist schwierig Dir etwas zu raten wenn man weder einen Sainsmart Leonardo hat noch das Problem. Instinktiv würde ich sagen Du solltest zuerst versuchen das Blink- Sketch mit einem ISP-Programmierer oder UNO mit ISP-Sketch draufzuschreiben; dann wenn das nicht hilft den den Bootloader nochmal draufschreiben; und falls das auch nicht funktioniert HV programming den ATmega in den Auslieferungszustand zu versetzen und den Bootloader draufzuschreiben.

Du hast geschrieben:

Ich habe dann noch versucht mit einen UNO einen neuen Bootloader aufzuspielen.

Welchen Bootloader hast Du genommen? Grüße Uwe

OK, es hat funktioniert. Ich bin nun wieder zu hause. Ich habe den Leonardo angestöpselt und entgegend meiner Aussage von oben, hat er doch einen Com-Port wenn der Bootloader im Gerätemanager erscheint. Im meinen Fall der Comport 10. Ich habe den, wie von sschultewolter vorgeschlagen in die Preferences Datei eingetragen. Dann unter Datei->Voreinstellungen: Ausführliche Ausgaben die Häckchen bei Übersetzung und Hochladen machen. und wenn die IDE dann anfängt folgende Meldungen auszuwerfen

PORTS {COM1, } / {COM1, } => {} PORTS {COM1, } / {COM1, } => {} PORTS {COM1, } / {COM1, } => {}

Den Leonardo reseten.

Das hat auf Anhieb funktioniert.

Vielen Dank für eure Hilfe Grüsse WG