N=8 am Ende von Read_header vorgeladen. Nun kann ich 19x "l" und Return auf der Tastatur eingeben, danach bleibt das Program STEHEN (kein Reset diesesmal). Es nimmt auch keine anderen Eingaben mehr über die Tastatur an. Hilft nur noch Resetknopf auf dem Nano drücken. Fehler ist reproduzierbar, mehrfach versucht.
Bitmap Daten von SD Card auslesen
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
-
-
Jetzt lass mal die config rainbow weg, oder setze der Einfachheit auf led_num=1 und dime ein Array of byte. Wie groß kannst du das array anlegen, bis ein out of space kommt?Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Das Teil stürzt ab.
Mache bitte mal den SWStack etwas höher z.B. 40.
Kann es sein, dass hier dein n größer wird als du LED's hast?
Spoiler anzeigen
Rb_setcolor N , Farbe()
Incr N
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()
-
Ohne Config rainbow, geht ein Array mit 650 noch drauf, bei 660 bin ich out of SRAM.
mitch schrieb:
Kann es sein, dass hier dein n größer wird als du LED's hast?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von R2D2 Bastler ()
-
Ok. Jetzt nimm wieder das aktuelle Programm, n=0 und setze die $include-Anweisungen unterhalb der config rainbowRaum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ändert sich nichts. Beim 11. Versuch resettet sich das Programm und beginnt von vorne.
-
Du hast doch überall Debug-Ausgaben.
Das kannst du mal loggen und dann hier einstellen.
Welches sind die letzten Reaktionen, die noch gehen, bevor ein Reset stattfindet?
Hast du mal den SWStack auf 40 erhöht? -
Noch eine Idee, um einen Überlauf auszuschließen, bevor du was auf Tastendruck ausliest, fülle den stripe mit einer Farbe rb_fill. Wenn das Programm nicht gleich abkackt und du immer noch 10 Farben per Taste füllen kannst, dann muss man den Fehler woanders suchen.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ich hab' mal rot, gruen und blau auf 1, 2 und 3 gesetzt und anschließend rb_fill farbe(1) eingetragen. Der fill-Befehl zerstört schon alles im sram. Ich bekomme im Simulator sogar auf der uart infos über Anzahl der files und Größe angezeigt. Es scheint das Programm im Delirium zu sein.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ja, hab den SWStack auf 40 gestellt und wollte gerade anfangen, die Log Files zu ertellen. Dann noch schnell rb_fill testen und dann
Ich bin so ein
Kommt bei mir vorbei, die nächsten gehen auf mich!
Ich trau mich kaum zu sagen, was ICH falsch gemacht habe.
Ich war so euphorisch, weil das Einlesen zu Beginn so gut geklappt hat, dass ich nach dem Zufügen von der Rainbow-Geschichte die Auswahl des aktiven Channels vergessen hab (und das nachdem ich schon so viele Programme für die Strips bearbeitet habe). So ein verd...... M..t
Ich hoffe, dass das der einzige Grund war...
Vielen, vielen Dank für Eure Vorschläge, wahrscheinlich wäre ich ohne sie nie auf meinen eigenen Fehler aufmerksam geworden
Nette Grüße
Robert -
R2D2 Bastler schrieb:
die Auswahl des aktiven Channels vergessen hab
Malst du dann mit deinem Fliegerchen Bilder in den Himmel?Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ich hab' mich ja mal an einem 'Schwenktexter' versucht. Ähnliches könntest du mit deinem Fliegerchen machen und zB. Liebesgrüße am Nachthimmel schreiben.
Hier mein Versuch im Film
Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
tschoeatsch schrieb:
Malst du dann mit deinem Fliegerchen Bilder in den Himmel?
Morgen gehts weiter, für heute habe ich mich genug blamiert
Nette Grüße
Robert -
Schweren Herzens muss ich mein Pixelstick Projekt für Modellflugzeuge zu Grabe tragen.
Das Programm selbst funktioniert, ist allerdings viiiieeeel zu langsam. Ich hätte nicht gedacht, dass das Auslesen der SD-Karte mit AVR-DOS so lange dauert. Wenn jemand noch einen Tipp hat, wie man die Daten schneller (sehr viel schneller!) von der SD-Karte bekommt, dann lasst es mich bitte wissen.
Ein Testbild mit 200x200 Pixel dauert ca 14 Sekunden bis es durch ist. Bei einer angenommenen Pixelsticklänge von ca 2 Metern entspricht das einer Bewegungsgeschwindigkeit von gerade mal 14-15cm/sec (so langsam kann ich nicht mal gehen, geschweigeden fliegen).
Ich habe das Programm von allem Überflüssigem befreit und stell es hier nochmal als "Pixelstick für Langsame" rein.
Das gewählte Bild läuft hierbei nach einer kurzen Pause immer wieder durch. Eine Helligkeitsregelung habe ich nicht mehr eingebaut. Bilder müssen vor dem Speichern um 90° gedreht, evt gespiegelt und dunkler gespeichert werden, damit diese vom Pixelstick richtig dargestellt werden.
Wie die C/C++ Programmierer es schafften, nebenbei auch noch LCD Displays und ähnliches zu betreiben, ist mir ein Rätsel. Wer damit fit ist, findet hier sogar eines der fertigen Programme: mrossphoto.com/digital-light-wand/ (für mich nur römische Dörfer).
BASCOM-Quellcode
- 'Pixelstick V1
- '-------------------------------------------------------------------------------
- '
- 'Pinbelegung
- 'Belegung der Anschlusspins am Atmega: Siehe auch Config_MMCSD_HC_Arduino_nano.BAS
- 'Eckige Klammern [] sind Anschlussbezeichnungen eines Arduino nano
- 'Mmc_cs (CS) --> PortB.1 [D9]
- 'MISO --> PortB.4 [D12] (Portb.4 = 1 --> pull up on miso)
- 'MOSI --> PortB.3 [D11]
- 'SCK --> PortB.5 [D13]
- 'GND --> GND [GND]
- '+5V --> +5V [5V]
- '
- 'SS --> PortB.2 --> Set SPI-SS to Output and High for Proper work of!
- '
- '-------------------------------------------------------------------------------
- '
- '###############################################################################
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 60
- $swstack = 20
- $framesize = 100
- $baud = 38400
- $include "Config_MMCSD_HC_Arduino_nano.bas"
- $include "Config_AVR-DOS.BAS"
- '###############################################################################
- Const Num_leds = 200 'Anzahl LEDs pro Strip
- Config Rainbow = 1 , Rb0_len = Num_leds , Rb0_port = Portd , Rb0_pin = 7 ' , Rb1_len = Num_leds , Rb1_port = Portb , Rb1_pin = 1
- ' ^ connected to pin x
- ' ^------------ connected to portx
- ' ^-------------------------- x leds on stripe
- ' ^------------------------------------- x channel
- Rb_selectchannel 0
- Const Num_leds_1 = Num_leds - 1
- Dim Farbe(3) As Byte
- Rot Alias Farbe(_base)
- Gruen Alias Farbe(_base + 1)
- Blau Alias Farbe(_base + 2)
- Dim M As Byte
- Dim N As Byte
- Dim Pos As Long 'Pointer
- Dim Pic_offset As Word 'Beginn der Bilddaten/RGB-Werte
- Dim Pic_hight As Byte 'muss Num_leds entsprechen
- Dim Pic_width As Word 'bei Word --> maximale Bildlänge 65535 Pixel
- Dim Rgb_value As Byte
- Dim Reading_done As Bit
- Dim Choose_picture As Byte
- Dim Selected_picture As String * 13 'nur max 8.3 Dateinamen z.B. "12345678.bmp"
- Dim Column_start As Long 'bei Long --> theoretisch maximale Bildlänge ~ 3,5 Mio Pixel (bei Num_leds=200)
- Dim Column_end As Long 'bei Long --> theoretisch maximale Bildlänge ~ 3,5 Mio Pixel (bei Num_leds=200)
- Dim Column_width As Word
- Dim Column_counter As Word 'bei Word --> maximale Bildlänge 65535 Pixel
- ' für SDHC-Card
- ' SD-Declarations:
- '*******************************************************************************
- Dim Btemp1 As Byte
- Dim Sd_card_ok As Bit
- Dim Files As String * 12
- Dim Buffer_address As Dword
- Declare Sub Sdcard_initialize()
- Declare Sub Sdcard_init_filesystem()
- Declare Sub Activate_sdcard()
- Declare Sub Deactivate_sdcard()
- Declare Sub Read_header()
- Declare Sub Datei_lesen()
- '*******************************************************************************
- Enable Interrupts
- '-------------------------------------------------------------------------------
- ' Init SD-Card
- Call Sdcard_initialize()
- '-------------------------------------------------------------------------------
- Reading_done = 0
- Column_counter = 0
- Pic_width = 1
- 'Main:
- '*******************************************************************************
- Do
- 'Reading_done = 0 'später setzen bei erneutem Bildwechsel
- Choose_picture = 2 'Bild auswählen
- Select Case Choose_picture
- Case 1 : Selected_picture = "bild_01.bmp"
- Case 2 : Selected_picture = "bild_02.bmp"
- Case 3 : Selected_picture = "bild_03.bmp"
- End Select
- If Column_counter < Pic_width Then
- Call Datei_lesen
- Else
- Rb_clearcolors 'am Bildende alle LEDs ausschalten
- Rb_send
- Wait 2 'und kurz warten und Bild erneut ausgeben
- Reading_done = 0
- Column_counter = 0
- Pic_width = 1
- End If
- Rb_send
- Loop
- End
- '###############################################################################
- 'SD-Card-Routines
- 'für SDHC-Card
- Sub Activate_sdcard
- Call Deactivate_sdcard
- Reset Mmc_cs
- End Sub
- Sub Deactivate_sdcard
- Set Mmc_cs
- End Sub
- Sub Sdcard_initialize
- Call Sdcard_init_filesystem
- If Btemp1 <> 0 Or Gbdriveerror <> 0 Then
- Wait 1
- Goto 0
- End If
- End Sub
- Sub Sdcard_init_filesystem
- Call Activate_sdcard
- If Gbdriveerror = 0 Then
- Btemp1 = Initfilesystem(1)
- If Btemp1 = 0 Then Sd_card_ok = 1
- End If
- End Sub
- '-------------------------------------------------------------------------------
- 'Datei auslesen:
- '
- '
- Sub Datei_lesen()
- M = 1
- Open Selected_picture For Binary As #20 'hier wird gewähltes Bild geöffnet
- If Reading_done = 0 Then Call Read_header() 'beim erstmaligem Aufrufen Header auslesen
- Column_end = Column_start + Column_width
- For Pos = Column_start To Column_end
- Get #20 , Rgb_value , Pos
- Select Case M
- Case 1 : Blau = Rgb_value
- Case 2 : Gruen = Rgb_value
- Case 3 : Rot = Rgb_value
- Rb_setcolor N , Farbe()
- Incr N
- End Select
- Incr M
- If M > 3 Then M = 1
- Next Pos
- Close #20
- N = 0
- Column_start = Column_end + 1 'beim nächsten Call wird die nächste Spalte begonnen
- Incr Column_counter
- End Sub
- '-------------------------------------------------------------------------------
- 'Bild-Offset, Bildbreite und Bildhöhe auslesen und erste Spaltenparameter berechnen:
- 'Höhe und Breite werden hier vertauscht, da sich diese Angaben nicht auf das gespeicherte
- 'Bitmap beziehen, sondern auf den Pixelstick (Höhe = Länge des Pixelsticks bzw Anzahl der LEDs)
- Sub Read_header()
- Pos = 11 '10 bei Arrays und Config Base=0
- Get #20 , Pic_offset , Pos
- Pic_offset = Pic_offset + 1 'nicht nötig bei Arrays und Config Base=0
- Pos = 19 '18 bei Arrays und Config Base=0
- Get #20 , Pic_hight , Pos
- Pos = 23 '22 bei Arrays und Config Base=0
- Get #20 , Pic_width , Pos
- Column_start = Pic_offset
- Column_width = Pic_hight * 3 '3 Bytes pro LED
- Column_width = Column_width - 1
- N = 0
- Column_counter = 1 'nachdem Lesen des Headers wird mit Spalte 1 begonnen
- Reading_done = 1
- End Sub
-
Hi Robert.
So schnell sollte man die Flinte nicht ins Korn werfen.
Prüfe doch mal was die lange Zeit verursacht.
- Ist es das Initialisieren der SD-Card?
- das Öffnen der Datei
- das Lesen von Datei
- das Schließen der Datei
- Der Header einlesen
Kannst ja die Zeiten der einzelnen Schritte messen und seriell ausgeben lassen.
Loggen nicht vergessen und hier einstellen. - Ist es das Initialisieren der SD-Card?
-
Hi Mitch,
schnell aufgegeben hab ich nicht (saß die halbe Nacht und heute den ganzen Tag dran). Das Problem ist, dass es nicht nur ein "bischen" an der Zeit fehlt, sondern ganz gewaltig. Selbst bei einer mäßigen Fluggeschwindigkeit von 25-30 kmh müsste der Code 5x so schnell abgearbeitet werden.
Ich kann aber gerne nochmal testen, wie lange die einzelnen Schritte dauern. Das Initialisiern der SD-Karte ist kein Problem, das geschieht nur einmal zu Beginn. Auch das Lesen des Headers tut nicht wirklich weh, da dieser nur einmal pro Bildaufruf abgefragt wird.
Die reine Datenausgabe an die LEDs braucht bei einem 200x200 Pixel Bild etwas über 1,2 Sekunden (wenn ich mich nicht verrechnet habe).
Beim Rest guck ich mal, wie ich die einzelnen Zeiten ermitteln kann und melde mich wieder.
Nette Grüße
Robert -
R2D2 Bastler schrieb:
Das Programm selbst funktioniert, ist allerdings viiiieeeel zu langsam. Ich hätte nicht gedacht, dass das Auslesen der SD-Karte mit AVR-DOS so lange dauert. Wenn jemand noch einen Tipp hat, wie man die Daten schneller (sehr viel schneller!) von der SD-Karte bekommt, dann lasst es mich bitte wissen.
Benutze ich als Puffer für kleine (autonome) Webserver mit Sensoren und puffere mit Akku (z.B. am Gewächshaus).
Die Herausforderung ist "nur" darin zu sehen, einen Teil der Daten geschickt in einem großen Puffer für die AusgabeAus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages. -
Mir fallen an deinem Code verschiedene Sachen auf, die ich (wenns mein Code wäre) erst mal korrigieren würde. Das vermeidet oft unnötige Fehlersuche. Denn diese Auffälligkeiten sind dann schon mal ausgeschlossen.
Noch eine Frage.
Hast du an den Include-Dateien
- Config AVR-DOS.bas und
- Config MMCSD_Card_HC_Arduino...bas
Ich bin überzeugt, dass da irgendwo im Code oder vielleicht auch in der angeschlossenen Hardware der wurm steckt. - Config AVR-DOS.bas und
-
@R2D2 Bastler schau doch mal, welchen Kontroller du maximal in dein Flieger rein kriegst. Je mehr sram, umso besser, dann könntest du dein Bild vielleicht puffern und aus dem ram laden. Es gibt ja recht kleine breakout-boards, auch für mega2560, oder zur Not ein blankes board/Adapter von dieser Gehäuseform auf Einzelpins, also so Experimentierboards.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
OK, ich hab jetzt Timer1 mit prescale=8 mitlaufen lassen. Damit zählt er nun 2 Takte/us, richtig?
Dann komme ich auf folgende Ergebnisse:
223us > Call Read_header()
5500us > Open Selected_picture For Binary As #20
71us > Get #20 , Rgb_value , Pos
18us > Close #20
1us-6us > Select Case M bis End Select
7600us > RB_send
Header lesen passiert nur beim ersten Bildaufruf, daher kein Problem.
Für ein ganzen Bild (200x200 Pixel) ergibt sich dann:
Open und close 1x pro Zeile, d.h. (5500us + 18us) x 200 = 1103600us -> 1,1sec
Get wird pro Pixel 3x ausgeführt 71us x 3 x 200 x 200 = 8520000us -> 8,52 sec
Select Case wird pro Pixel 3x ausgeführt (2x nur 1us, 1x6us) daher 3us x 200 x 200 = 120000us -> 120ms
RB_send 1x pro Zeile, d.h 7600us x 200 = 1520000 -> 1,5 sec
Unter dem Strich betrachtet, dauert das Byte-Sammeln mit über 8 sec pro Bild viel zu lange und das bei einem Bild von nur 200 Pixeln Länge, welches in natura etwa 2 Meter lang wäre.
Mein Ziel wäre es gewesen, lange Bilder von 20-30 Metern Länge in den Himmel zu malen. Ist daher so nicht zu machen.
Bei den anderen beiden Dateien hab ich nur die Pins an meinen Nano angepasst.
Bezüglich Euren anderen Ideen:
Ich hab bisher fast nur mit Attinys oder dem Nano gearbeitet, daher hab ich nichts anderes hier. Gerne kann ich auch andere Hardware einsetzen, muss nicht unbedingt deine SD-Karte sein, Hauptsache sie ist möglichst klein und leicht wegen dem Modellflug (ne externe Festplatte geht also garnicht ).
Mit so einem SPI-/I2C-SRAM würde das gehen??? Hab sowas noch nie benutzt, lerne aber gerne dazu. Solange ich irgendeine "Stecklösung" finde (damit ich nicht das ganze Modell an den Rechner klemmen muss), nehm ich auch diese.
Nette Grüße
Robert