Forum: Mikrocontroller und Digitale Elektronik programm in den speicher laden


von Philipp Karbach (Gast)


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 ;).

von Eckhard (Gast)


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

von johnny.m (Gast)


Lesenswert?

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

von Rahul (Gast)


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?)

von Philipp Karbach (Gast)


Lesenswert?

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

von Robert W. (rweber)


Lesenswert?

... oder eine Derivat verwenden.

von Robert W. (rweber)


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

von Rahul (Gast)


Lesenswert?

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

von Philipp Karbach (Gast)


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..

von Andreas B. (baitronic)


Lesenswert?

Ich glaube das STK500 macht das genauso, sollte also gehen..

Gruß Andreas

von Rahul (Gast)


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.

von Philipp Karbach (Gast)


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 ;).

von Hannes L. (hannes)


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.

...

von Rahul (Gast)


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.

von Philipp Karbach (Gast)


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

von Philipp Karbach (Gast)


Angehängte Dateien:

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.

von Joe (Gast)


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.

von Philipp Karbach (Gast)


Lesenswert?

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

von Joe (Gast)


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;
    }

}

von Jon (Gast)


Lesenswert?

Einfache Beispiele SPI, u.a. hier:

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

von Philipp Karbach (Gast)


Angehängte Dateien:

Lesenswert?

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

von Joe (Gast)


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.

von Joe (Gast)


Lesenswert?

Am besten das Kapitel "Seriel Downloading" durchlesen.

Viel Erfolg

von Philipp Karbach (Gast)


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.

von Hannes L. (hannes)


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)

...

von Philipp Karbach (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan S. (phunky)


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

von Philipp Karbach (Gast)


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!

von Stefan S. (phunky)


Lesenswert?

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

Stefan

von Philipp Karbach (Gast)


Lesenswert?

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

von Phill (Gast)


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.

von Philipp Karbach (Gast)


Lesenswert?

leider hat sich gar nichts getan :(.

von Phill (Gast)


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.

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.