www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik programm in den speicher laden


Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nehmen wir an ich speichere eine kompilierte .hex datei auf einer mmc
karte oder irgendeinem anderen speicher. wie würde ich dann dieses
programm aus dem programm dass im flash ist laden bzw. ausführen? ist
das überhaupt möglich? achja C wäre schön. dass das vollkommen
idiotisch ist oder ähnliches weiß ich, also lieber über die idee
nachdenken, danke ;).

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hängt vom Controlelr ab. Ist mit ner von Neumann Architektur überhaupt
kein Problem und auch nicht so außergewöhnlich. Mit ner Harvard
Architektur hat man da eher schlechte karten.

Eckhard

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den AVRs gehts definitiv nicht. Die können Programme nur aus dem
eingebauten Flash ausführen.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem AVR und einem Bootloader, der hex in OP-Code übersetzt, sollte
das gehen. Dann müsste der Bootloader "einfach" die hex-Datei lesen
und erkennen können und als OP-Code in den Programmspeicher schreiben.
Ist auf jeden Fall machbar.

(Wieder son Gameboy-Projekt?)

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm ich versuche eine art mikrocomputer zu bauen ;). vielleicht dann
doch eher auf ARM basiert?

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder eine Derivat verwenden.

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin wohl heute zu Dumm zum tippen :-( Ich meinte:

Ein 8051 Derivat verweden, die können das Program auch aus einem
externen Speicher ausführen.

Gruss,
rweber

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ob 8051er einfach so mit einer MMC oder ähnlicher Flaschkarte
zurechtkommen, bezweifle ich. Die mögen an externen Speichern lieber
parallele Bausteine...

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hatte noch eine neue idee, die mag sich für den einen komisch
anhören aber für mich macht das gerade sinn! Wie wäre es wenn ich
einfach zwei avrs nehme, sagen wir einen mega8 und einen mega32. der
mega8 läd das hauptprogramm, kann das display antreiben und die
tastatur und natürlich die mmc karte. dann wird ein program geladen und
der mega8 programmiert den mega32, gibt ein reset und dieser arbeitet
das programm ab, wenn das programm beendet wird greift wieder der
mega8. ich weiß nicht ob man das mit dem programmieren geht aber rein
theoretisch könnte man das machen..

Autor: Andreas B. (baitronic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube das STK500 macht das genauso, sollte also gehen..

Gruß Andreas

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich glaube das STK500 macht das genauso, sollte also gehen..

Sind wir hier in der Kirche?

Beim STK500 gibt es insgesamt 3 Controller:
Der Zielcontroller. Der wird mit dem Benutzerprogramm geladen, und soll
dann entsprechend der Forderungen des Progarmmierers laufen.
Dann gibt es einen Controller, der sich um die Spannungsversorgung, die
Oszillatorfrequenz etc des STK500, sich also alles, was man beim STK500
per AVRStudio einstellbar ist, kümmert.
Der dritte Controller kümmert sich um die Kommunikation mit dem PC,
steuert somit den Kontroll-Controller an, und programmiert den
Zielcontroller.

@Philip:
Mit einem (vernünftigen) Bootloader sollte man sich den 2. Controller
sparen können...Dann könnte man auch gleich ein Programmierprogramm
(-terminal am PC laufen lassen.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber das ganze soll doch unabhängig von einem zweiten gerät (PC) sein.
ich hab mir gerade mal die alten source codes von avrprog (avrdude)
angesehen. das ist relativ simpel aufgebaut und damit sollte meine idee
zu verwirklichen sein. ich wäre aber wirklich mal gespannt ob das
schonmal jemand so gemacht hat ;).

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> der
> mega8 läd das hauptprogramm, kann das display antreiben und die
> tastatur und natürlich die mmc karte.

Damit das Ganze dann auch mit einer multimedia-kompatiblen MMC
funktioniert (also mit dem FAT-Dateisystem wegen Datentausch mit PC
unter üblichen Multimedia-OS), müsste der Mega8 dann FAT beherrschen.
Ich denke mal, dass er dazu etwas wenig SRAM hat.

Ein PC-unabhängiges "ISP-Programmiergerät" mit einem Mega32 und MMC
für Programme sollte machbar sein, über den Nutzen könnte man streiten.
In den MMC-Threads (auch MP3-Player) ist nachzulesen, dass man erst ab
Mega32 ein ordentliches FAT-System in die Reihe bekommt, da sonst das
SRAM nicht ausreicht.

...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man wirklich ein komplettes System zum Selberprogrammieren aufbauen
will, bieten sich eher 8051-Controller an.
Bei deren Architektur ist es möglich, einen RAM-Baustein in den
Programmspeicher-Bereich zu legen.
Dann muß man sich nur noch einen Assembler (mit "IDE") ausdenken, mit
dem man dann Programme in das RAM schreiben kann.
Für die Programmentwicklung schon ein Flash zu benutzen, finde ich
etwas schlecht, weil jede kleine Programm-Änderung sich auf die
Lebensdauer der Karte auswirkt. Zwar hält die gesamte Karte viele
Programmierzyklen, aber bei der Entwicklung eines Programms
überschriebt man häufig den gleichen Speicherbereich.
Die Flash-Karte würde ich dann als Sicherungshilfe benutzen.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja am mega8 sollte es nicht scheitern, ich hab hier mehrere boards,
mega32,mega8 und einen 128, nur einen funktionieren programmer zu
schreiben wird etwas schwieriger, ich brauche dann mmc
treiber->fat->intelhex konverter->programmer

Autor: Philipp Karbach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
bin schon etwas weiter gekommen, habe zwei mega32 über den SPI verknüpft
, der eine schaltet bei dem anderen eine led ein und aus. Nebenher habe
ich versucht das serial spi programming im handbuch zu verstehen. Das
hier hab ich kapiert:

1. RESET auf GND legen
2. SCK low schalten
3. 20ms warten
4. Programming Enable Instruction senden, wie genau funktioniert das?!
5. dann muss ich irgendwie die Daten schicken (die sind im moment in
einem array, ein kleines programm). Wie takte ich das? (beide boards
laufen mit 16mhz). Wie muss man dieses instruction set lesen?
6. RESET high schalten

danach sollte das programm ablaufen. Im anhang ist das array aus einer
.hex datei gebaut. Tipps sind immer erwünscht! Beispielcode natürlich
auch.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke du hast schon über SPI kommuniziert?

Da du ja bereits 2 Atmegas schon verbunden.
Einer ist als Master konfiguriert.

Eine Programmieranweisung besteht immer aus 4 Byte.

Als erste wird "Programming Enable" gesendet.

Also 0xAC 0x53 0x00 0x00

Jetzt ist der "Slave" Atmega zum Programmiervorgang bereit.

Ein 0xAC 0x80 0x00 0x00 löscht zum Beispiel den Chip/EEprom

Der Flash wird Pageweise beschrieben.

Anzahl und GRöße der PAges mußt du im MAnual nachlesen.

z.B. Atmega 8 128 Pages a 32 word

Ansonsten das Maula lesen, steht doch alles drin.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sagen wir so ich hab die SPI ports benutzt aber nicht die SPI funktionen
:/.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann Die jetzt nicht den ganzen Code schicken, aber hier mal ein
Beispiel:

unsigned char program_enable(void)
{
  pause0();  //Wartezeit nachdem  /RESET auf Low

  //aktiviert Serial Programming
  sProgcmdBuf.sende_buffer[0]= 0xAC;
  sProgcmdBuf.sende_buffer[1]= 0x53;
  sProgcmdBuf.sende_buffer[2]= 0x00;
  sProgcmdBuf.sende_buffer[3]= 0x00;

  master_transmit_cmd (WAIT_FAST);
  if (sProgcmdBuf.receive_buffer[2] == 0x53)
    return 0;
  else
    return 1;
}

...

void master_transmit (unsigned char data)
{
PORTB &= ~(1<<PB4);         //SS am Slave Low
SPDR = data;              //Schreiben der Daten
while (!(SPSR & (1<<SPIF)));//Warten auf Datenübernahme
PORTB |= (1<<PB4);//SS High --> Ende der Übertragung
sProgcmdBuf.data = SPDR;    //speichere zurückgeschiftetes Datenbyte
}

/********************************************************/
/*                                              */
/********************************************************/

void master_transmit_cmd (unsigned char wartezeit)
{
  unsigned char i;
  for (i=0;i<=3;i++)
    {
    master_transmit (sProgcmdBuf.sende_buffer[i]);
    sProgcmdBuf.receive_buffer[i] = sProgcmdBuf.data;
    }
  switch (wartezeit)
    {
    case 0:pause0();break;
    case 1:pause2();break;
    }

}

Autor: Jon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfache Beispiele SPI, u.a. hier:

http://www.mikrocontroller.net/mc-project/

Autor: Philipp Karbach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
danke für den code, ich hab das ganze mal so aufgebaut, bin mir aber
nicht sicher ob das funktioniert kann. (anhang)

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte mit einem Mega16 einen Mega8 Programmiert.

Der Mega16 lief mit 16MHz.

Zur SPI Initialisierung muss noch die SCK Frequenz eingestellt werden.

meine Init so so aus:

void SPI_MasterInit(void)
{
 //MOSI und SCK als Ausgang, Rest ist Eingang
 DDRB |= (1<<PB5)|(1<<PB7);
 //Aktivierung des SPI,SPI Interrupts, Master, Taktrate fck/16
 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

}

So einfach ist die Programmierung nicht.
Man kann die Daten leider nicht hintereinander weg in den Flash
schieben.

Es sind dazu 2 Befehle notwendig.
Erst werden die Daten übertragen, und dann in den Flash geschrieben.
(Load Program Memory, Write Programm memory)

Der Speicher ist Wortweise organisiert, d.h. die Daten werden in low-
und highbyte getrennt übertragen.

Im Manual steht mehr dazu. (wie folgt:)

Load Program Memory Page

0100 H000 0000 xxxx xxxx bbbb iiii iiii

Write H (high or low) data i to
Program memory page at word
address b. Data Low byte must be
loaded before Data High byte is
applied within the same address.

Write Program Memory Page
0100 1100 0000 aaaa bbbb xxxx xxxx xxxx

Write Program memory Page at
address a:b.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten das Kapitel "Seriel Downloading" durchlesen.

Viel Erfolg

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha, das stellt mich natürlich vor neue probleme! Hatte ganz übersehen
dass ich den SPI gar nicht wirklich initialisiert hatte sorry. Mal
sehen wie ich die daten in einzelne Worte zerlegen kann.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Am besten das Kapitel "Seriel Downloading" durchlesen.

Und das bitte nicht nur im Datenblatt eines AVRs, sondern auch in den
Datenblättern der anderen Typen. Kannst ja notfalls auch noch den
QBASIC-Quellcode meines ISP-Programmers (PC/DOS,W98) analysieren...
(www.hanneslux.de/avr)

...

Autor: Philipp Karbach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
okay data mal beiseite, nehmen wir an ich will nur den chip erase
ausführen, stimmt der code dann?

Autor: Stefan Seegel (phunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht einfach z.B. einen Mega128 mit einer MMC an der SPI
Schnittstelle und fertig ?
Der Bootloader des Mega128 sieht auf der MMC nach (FAT) ob ein
Updatevorhanden ist und schreibt selbiges ggf. in den Flash-Speicher.
Schon selbst so gemacht, funktioniert ganz ausgezeichnet; zum
aktualisieren der Firmware einfach MMC Karte rein und resetten...

Oder habe ich was beim schnellen Lesen des Threads überlesen ?

Stefan

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja wenn es sich um EIN program handelt, aber es soll eine auswahl geben.
ich weiß ich bin hier eigentlich auf dem falschen µC "dampfer" ;).
aber rein theoretisch sollte die idee funktionieren, und gar nicht
schlecht, nur realisieren muss man es!

Autor: Stefan Seegel (phunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Bootloader könnte auf dem Display eine Auswahlliste anzeigen. Kein
Problem. Oder eben verschiedene MMCs benutzen.

Stefan

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm das wäre natürlich das gleiche, aber das geht ja nicht mit allen
megas. achja, kurze anmerkung: FINALLE :)

Autor: Phill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>okay data mal beiseite, nehmen wir an ich will nur den chip erase
>ausführen, stimmt der code dann?

sieht erst mal gut aus. Probeaufbau wird's zeigen.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider hat sich gar nichts getan :(.

Autor: Phill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast ja auch Murks hingeschickt.

Man kann nicht einfach das hex File hinschicken.

Öffne mal das hex mit Ponyprog und mit einem Editor.
Dann siehst du den Unterschied.

Es müssen verschiedene Zeichen entfernt werden. z.B. Prüfsumme.

Du must ein File erstellen, wie es in Ponyprog oder
im AVRStudio: Memory view angezeigt wird. Also pure Daten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.