Hallo Besucher, der Thread wurde 2,6k mal aufgerufen und enthält 10 Antworten

letzter Beitrag von Rudi54 am

Bootloader für SD-Card

  • Moin , Moin
    Ein freundliches "Hallo" in die Runde!
    Ich bin neu hier.(lerne seid rund 8 Monaten das programmieren)
    Auf der Suche nach einem "Bootloader für SD-Card" fand ich den Thread von "lordbubsy"
    "Step-by-Step SD2IEC Lochraster Nachbau" (Nach "AntaBaka" und "LarsP")
    So etwas suche ich. Aber der Haken, in "Bascom-AVR".
    Bootloader findet man ja genug. Aber alle für UART.


    Bei mir verbaute Hardware:
    ATMega644 , 16Mhz extern
    SD-Card über 74HCT241(Puffer) an Hardware SPI.
    LCD-Display 20*4 im 4Pin Modus an PORTC.4-7,(RW an PORTC.1=0)
    SD-detect an PORTB.2
    2 Taster, jeweils an PORTB.0 und PORTB.3(Wahl, Enter, beide=Esc)
    1 Led an PORTB.1 (Kontroll-Led)
    Ich würde gern neue "Mustertabellen", die auf der SD-Card sein sollen, (wenn, mehrere)
    auswählen, und die ausgewählte Datei mit dem "BOOTLOADER" in die Application Flash Section
    schreiben (brennen).
    Das man CONFIG_AVR-DOS.bas und CONFIG_MMC.bas braucht um die Sd-Card zu initialisieren, ist mir schon klar.
    Nur, ich weiss nicht wie man den "Bootloader.bas" für Hardware SPI umschreibt.(steht überall "Print" drin)
    Und wie man das dann alles zusammen fügt. z.B. ""Open Datei1 For Input As ? 'Tja, als was?""


    Kann mich da jemand aus dem Forum dabei unterstützen?


    Mit dem Sourcecode für SD2IEC in "C" komme ich nicht klar!


    Für Reaktionen und Anregungen bedanke ich mich schon im Voraus. :dafuer:


    Rudi54
    (54 = Geburtsjahr)

  • Also der SD Bootloader ist ein separates Teil vom SD2IEC Hex File.


    Ich glaube nicht dass der Bascom dies flashen kann, weil es braucht spezielle Fuse Einstellung.



    Beim Atmega644 wird da ein kleiner Bereich des Speichers "geschützt" über Fuses und da wird der Bootloader geflashed. Bei Start nach einem Hardreset wird der bootloader gestartet. Wenn der Bootloader auf der SD ein Update findet, dann flashed er es. Wenn nicht, startet der Bootloader das HEX File im nicht geschützten Speicher.


    Die Installation des Bootloader ist keine große Sache, wenn man ein standard Flash programm wie AVRprog verwendet und die Fuses richtig konfiguriert.

  • Danke Diddl für die erste Reaktion !


    Also 1. müsste Bascom das packen. Es gibt ja eine "BootLoader.bas" aber eben nur für UART.
    Man müßte diese, nach meiner Meinung, vielleicht nur umschreiben auf Hardware SPI.


    Mir ist nur nicht klar "wie die SPI das Update finden soll" (dazugehörige Befehle, entweder im
    Programm "SD_Speicherkarte.Bas" die für den "Sd_init" zuständig ist, oder im Programm
    "BootLoader.bas". Oder auch in beiden.)


    Das mit den Fuses ist mir klar. Damit sagt man dem Controller wie groß der "geschützte Bootbereich"
    sein soll. Beim Atmega644 bis zu 4096 Words. Die Start-Adresse wird ja dann im Bootloader-Programm
    angegeben. Z.B. "$loader = $7C00" für 1024 Words.

  • Also 1. müsste Bascom das packen. Es gibt ja eine "BootLoader.bas" aber eben nur für UART.
    Man müßte diese, nach meiner Meinung, vielleicht nur umschreiben auf Hardware SPI.


    Nee so einfach läuft das nicht.


    SPI alleine ist nur die Ansprache der SD Card, dazu brauchst du FAT File System und Directory durchsuchen etc etc.


    Aber es gibt ja den Bootloader vom SD2IEC. Der ist an sich universell. Nur diese Prüfung der Versionsnummer ist etwas gefinkelt. Habe das nicht mehr genau im Kopf. Jedenfalls der Bootölloader wäre ok. Der Bascom erzeugt HEX Files. Die müssen dann einfach auf die SD Karte kopiert werden.

  • Danke Diddl auch für dieses !


    So einfach will ich mir das auch nicht machen.
    Ich möchte es mit meinen 60 mal lernen und selber rumtüfteln.
    Bis jetzt habe ich alles aus Foren, RN-Wissen, Büchern usw.
    Habe auf Arbeit als Betriebselektriker viel mit Elektronik
    (SPS usw.) zu tun.(Da möche man im Schaltschrank schon
    wissen wo man die Finger rein steckt und wo nicht.)
    Wieder zum Thema.
    Wie oben schon beschrieben ist meine Hardware soweit fertig.
    Kann auch nicht mehr viel ändern, da alle Pins belegt sind.
    Somit kann ich die SD2IEC.hex, nicht so richtig gebrauchen.
    Ausser dem sollte mein Hauptprogramm (funktioniert) wenn der
    Platz ausreicht, mit in die Bootloader-Sektion.
    CONFIG_AVR-DOS.bas und CONFIG_MMC.bas gibt es von
    Franz Josef Vögel. Auch ein Beispiel Programm von Peter Tuch.
    Da wird eine .txt Datei von SD-Card über RS232 zum Terminal
    ausgegeben. Mit; weiter unten:
    **********************************************
    Open Datei1 For Input As #10 ' Const Datei1 = "lesen.txt"


    Do
    Line Input #10 , Temp ' Zeileweise einlesen


    Print Temp


    Loop Until Eof(#10) <> 0 ' wiederholen bis zum Ende
    ' der Datei (Eof)
    Print "... gelesen"


    Print


    End If


    Close #10 ' Datei wieder schließen


    End If
    *********************************************
    Für AVR-DOS File System gibt es folgende
    Unterstützte Anweisungen und Funktionen:
    INITFILESYSTEM , OPEN , CLOSE, FLUSH , PRINT, LINE INPUT,


    LOC, LOF , EOF , FREEFILE , FILEATTR , SEEK , BSAVE , BLOAD ,


    KILL , DISKFREE , DISKSIZE , GET , PUT ,FILEDATE , FILETIME ,


    FILEDATETIME , DIR , WRITE , INPUT , FILELEN
    Und da bin ich nun am Ende mit meinem bis jetzt gelernten.
    Allein schon die Frage: was heisst "#10" und dann weiter:
    welche Anweisung oder Funktion nehmen? Um nicht zum
    Terminal sondern zum Applications-Bereich zu kommen.
    Also grob gesagt, der Bootloader soll "diese .hex Datei"
    in den, nach dem Reset, freien Flash brennen.


    Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
    (Gernold Penz)

  • Ah, BASCOM kann mit Dateien umgehen!


    Das ist cool, wusste ich gar nicht. Das vereinfacht die Sache enorm.




    Ja die #10 ist easy. Das ist der Kanal. Du kannst auch genauso #8 oder #12 verwenden. Nur dann eben überall. Ist genau wie beim C64.


    Kanalnummern brauchst du, damit du gleichzeitig auf mehrere Dateien zugreifen kannst. verstehst du den Sinn?




    So, nun hast du aber das Problem, dass HEX Dateien Text enthalten, der interpretiert werden muss. Du liest einfach zeilenweise mit dem Befehl "Line Input".


    Dann muss du jede zeile interpretieren. Ganz vorne beginnt die Zeile mit der Adresse. Dann folgen die Datenbytes und eine Prüfsumme.

  • Erstmal Dank für Deine Hilfe !
    Bis jetzt habe ich mir alles mühsam aus dem Internet zusammen gesucht.
    Und ob das alles so richtig ist, sei dahin gestellt.


    Ob BASCOM mit "Dateien" umgehen kann, weiss ich aber auch nicht.
    Steht oben in der Declaration! Const Datei1 = "lesen.txt"
    Ist wohl mehr ein "Alias".


    Kanal; habe ich schon mal was von gelesen.
    Ch= Eine Kanalnummer, die eine geöffnete Datei identifiziert.
    Dies kann eine fest codierte Konstante oder eine Variable sein.


    Kann ich die einfach festlegen? "As #10"
    Oder als Variable; "Dim # As Byte" (Ich glaube da meckert die Syntax)
    Oder sind die Channal's irgend wo definiert?

  • Kann ich die einfach festlegen? "As #10"
    Oder als Variable; "Dim # As Byte" (Ich glaube da meckert die Syntax)
    Oder sind die Channal's irgend wo definiert?


    Channels fest definiert, nee, das gab es nur bei Commodore. :D



    Schau, es fängt IMMER mit einem OPEN an. Beim Open gibst du einen Datei an über den Dateinamen UND dazu einen Channel# den du frei wählst. Ja?


    Nach dem OPEN ist diese Datei fest verbunden mit dem Channel#. So lange bis du ein CLOSE machst. Das Close gibt den Channel wieder frei.


    Zwischen OPEN und CLOSE kommen Befehle zum lesen oder schreiben der Datei (alle anderen Befehle).


    Der Sinn ist, dass du eine Datei nicht jedesmal mit dem Namen ansprechen musst. So ein Channel ist einfach praktischer wie ein langer Pfadname. Ja?



    Verwende einfach 10 als Kanal Nummer wie im Beispiel und mach dir zunächst kene Gedanken darüber.



    Stelle dir eine Datei einfach vor als ein Strom von Datenbytes. Nach dem OPEN steht der Zeiger auf dem ersten Byte der Datei. Durch fortlaufendes Lesen bekommst du nach und nach alle folgenden Bytes. Irgendwann ist das Ende der Datei erreicht, das letzte Byte gelesen, das erkennst du an einem Marker EOF oder indem du mit zählst.


    Manchmal ist es einfacher, wenn man ein Programm zuerst am BASIC des PC erstellt. Da testet und verbessert. Und die finale Version dann in den BASCOM überträgt. Es ist einfach leichter am PC ;)

  • OPEN heisst "öffnen"


    CLOSE heisst schliessen.


    Eine Datei ist ein Fluss aus Daten. Aus Bytes wenn man so will.




    Stell dir eine Tankstelle vor. Es gibt Zapfhähne für 91 Oktan Benzin, 95 Oktan und Diesel.


    Du entscheidest dich für 95 Oktan: OPEN "95oktan" FOR INPUT AS #10 (Nimm Zapfhahn "95oktan" von der Säule und stecke in in dein Einfüllstutzen von Wagen #10)


    Du beginnst Benzin in dein Auto (einfüllstutzen #10) zu füllen: LINE INPUT #10, a$ (Lass Benzin fliessen über den Einfüllstutzen #10)


    Du willst noch mehr Benzin in dein Auto (einfüllstutzen #10) füllen: LINE INPUT #10, a$ (Lass Benzin fliessen über den Einfüllstutzen #10)


    Du beendest den Tankvorgang und legst den Zapfhahn zurück, damit andere in benutzen können: CLOSE #10



    ;)

  • Bevor du dich da jetzt reinsteigerst, ich bezweifle ganz stark, daß du den Code für einen Bootloader mit SD-Karte auf BASIC in die max. 4K Bootsize bekommst. Die Routinen für FAT und SD-/SPI-Zugriffe brauchen wesentlich mehr Platz, als die für die serielle Schnittstelle.


    Ich seh das daher nur in C oder Assembler realisierbar, wo es ja auch schon genügend Beispiele gibt.

  • Danke Diddl und kbr !


    Erstens war es sehr lehrreich, denn ich bin ja ein lernender.
    Die Einstiegskurse im Netz gehen ja leider nicht so weit.
    (Mach mal da einen Taster dran und da eine Led, dann drücke
    Taster und wenn du Glück hast, leuchtet die Led.)
    Ich kenne hier oben keinen, der einem mal etwas weitergehendes
    erklärt. Sorry.


    Ja kbr, ich hab den "BASCOM BootLoader" mal abgespeckt, die Zeile:
    "Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0"
    durch:
    "Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1"
    ersetzt. Print alles raus, soweit bis die Syntax nicht mehr gemeckert hat.
    Also nur mal so.
    Da war er, bei Startadresse $7000 = 4096 Words, bei 89%.
    Wie du geschrieben hast, müssen "C" oder "Assembler" da doch effektiver sein.
    Ich habe mich im Vorfeld auch umgesehen. Welche Sprache? Und da war Baskom,
    um einsteigen zu können, die Einfachere relativ leicht zu Überblickende.


    Neue Idee: SD-Card als externes EEPROM.
    (Gibt es, aaaaber auch auch nur in "C".)
    Oder "C" lernen. (Ach man.......)