Forum: Mikrocontroller und Digitale Elektronik Wie bekomm ich die Daten in den Speicher?


von ichbinswieder (Gast)


Lesenswert?

Hi,
im Modul Mikroprogrammierung/Mikroprozessoren haben wir zur Zeit ein 
projekt am Laufen.
Eine kleine Schaltung, bestehend aus einem Speicher(D2732) und paar 
Flipflops soll zusammen was machen.
Was genau ist an dieser Stelle Nebensächlich, mir gehts eig mehr um den 
Softwareteil(ich hoffe ich hab trotzdem das richtige Forum gewählt).Zum 
"Brennen" der Bauteile verwenden wir das Programm "Galep". Das 
ermöglicht das Importieren von Jedec-Files, Binärfiles und Hex-Files.
Nun habe ich ein C-Programm geschrieben, dass mir meinen Speicherinhalt 
generiert, wahlweise in Hex-Form oder in Binärform.
Importiere ich nun das Binärfile(besteht komplett aus 0 und 1), so wird 
es auch korrekt angezeigt, jedoch "interpretiert".
statt 10101010, was eigentlich in eine Speicherzelle sollte(AA), steht 
in der Speicherzelle eine 31(h) und in den darauffolgenden auch 30 bzw 
31.
Sozusagen interpretiert Galep mein Inputfile in Ascii.
um eine 10bzw A zu erzeugen, müsste ich ja nun das Zeichen da 
reinschreiben, das den ASCII Wert A hat. versuche dahingehend 
scheiterten jedoch allesamt.
Also habe ich ein Bereits vorhandenes File als "Intel HEX"-File 
gespeichert und mir mal angeschaut, mein C Programm umgeschrieben, dass 
es mir genau sowas liefert, das kam dabei heraus:

:1 000000 00 09 01 0A 02 0B 03 0C 04 4B 08 11 09 12 0A
:1 000100 13 0B 14 0C 53 10 19 11 1A 12 1B 13 1C 14 5B
:1 000200 18 21 19 22 1A 23 1B 24 1C 63 20 29 21 2A 22
:1 000300 2B 23 2C 24 6B 28 31 29 32 2A 33 2B 34 2C 73
:1 000400 30 A9 31 AA 32 AB 33 AC 34 6B 40 09 41 48 42
:1 000500 49 43 4A 44 4B 48 11 49 50 4A 51 4B 52 4C 53
:1 000600 50 19 51 58 52 59 53 5A 54 5B 58 21 59 60 5A
:1 000700 61 5B 62 5C 63 60 29 61 68 62 69 63 6A 64 6B
:1 000800 68 31 69 70 6A 71 6B 72 6C 73 70 29 71 E8 72
:1 000900 E9 73 EA 74 EB 80 09 81 0A 82 0B 83 0C 84 CB
:1 000A00 88 81 89 82 8A 83 8B 84 8C C3 90 89 91 8A 92
:1 000B00 8B 93 8C 94 CB 98 91 99 92 9A 93 9B 94 9C D3
:1 000C00 A0 99 A1 9A A2 9B A3 9C A4 DB A8 A1 A9 A2 AA
:1 000D00 A3 AB A4 AC E3 B0 A9 B1 AA B2 AB B3 AC B4 EB
:1 000E00 C0 89 C1 48 C2 49 C3 4A C4 4B C8 81 C9 C0 CA
:1 000F00 C1 CB C2 CC C3 D0 89 D1 C8 D2 C9 D3 CA D4 CB
:1 001000 D8 91 D9 D0 DA D1 DB D2 DC D3 E0 99 E1 D8 E2
:1 001100 D9 E3 DA E4 DB E8 A1 E9 E0 EA E1 EB E2 EC E3
:1 001200 F0 A9 F1 E8 F2 E9 F3 EA F4 EB

beim Importieren kommt jedoch ein Fehler, das File sei Fehlerhaft.

Hat jemand Ideen?!
Grüße

von FPGASchubser (Gast)


Lesenswert?

>>> Hat jemand Ideen?!

Ja - jede Menge.

Du schreibst offensichtlich ein ASCII - File mit Buchstaben drin. Du 
solltest das ganze als Binärdatei abspeichern und dies dann auch so von 
Galep behandeln lassen.

Grüße zurück...

von FPGASchubser (Gast)


Lesenswert?

P.S.

Intel-Hex lässt sich so einfach nicht betuppen. Google mal nach "intel 
hex wiki" und du wirst sehen - so einfach ist es nun wieder auch nicht 
ein gültiges Intel hex - format zu schreiben.....

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

sollte Dein INTEL Hex-Format nicht so aussehen?
http://www.netzwolf.info/microcontroller/nanopascal/intel_hex

Mit freundlichen Grüßen
Guiod

von THaala (Gast)


Lesenswert?

>>> Nun habe ich ein C-Programm geschrieben, dass mir meinen Speicherinhalt
>>> generiert, wahlweise in Hex-Form oder in Binärform.

Da halte ich für deinen Irrtum.
Ich denke du hast eine Text-Datei vollgeschrieben mit "10101010" usw.
Ich wette ein Glas Senf darauf, das das vermeintliche "AA" dass du 
geschrieben haben willst eine Mindestlänge von 8 Byte hat, da jedes 
Zeichen darin ein Character ist.

Der wirkliche Inhalt deiner Datei ist 0x31, 0x30, 0x31, 0x30, 0x31, 
0x30, 0x31, 0x30 (und evtuell noch 0x0A, 0c0D)

Was Galep dir anzeigt ist die Wahrheit. Zeig lieber mal dein C - 
Programm her.....

von ichbinswieder (Gast)


Lesenswert?

Öffne ich Galep, editier den Speicher, exportiere das als Hex-File, so 
kommt genau das raus. Importiere ichs wieder, funktionierts. Die von mir 
erzeugte Textdatei enthält genau das selbe Schema, der von mir gepostete 
abschnitt ist der wirkliche Inhalt meiner Datei.
Ich sollte mir wohl Intel Hex format mal genauer zu gemüte führen.
Das werde ich auch gleich tun.
Grüße

von THaala (Gast)


Lesenswert?

Du wirfst hier was durcheinander.

Reden wir doch mal von deiner sogenannten Binär - Datei die du erzeugt 
haben willst. Lade Sie hoch und hänge Sie doch hier mal an. (lass erst 
mal die Finger wech von Intel - Hex...)

Gruß Thilo

von Karl H. (kbuchegg)


Lesenswert?

ichbinswieder schrieb:
> Öffne ich Galep, editier den Speicher, exportiere das als Hex-File, so
> kommt genau das raus.

Was kommt da raus?
Ein File das so aussieht?
1
:1 000000 00 09 01 0A 02 0B 03 0C 04 4B 08 11 09 12 0A
2
:1 000100 13 0B 14 0C 53 10 19 11 1A 12 1B 13 1C 14 5B
3
:1 000200 18 21 19 22 1A 23 1B 24 1C 63 20 29 21 2A 22
4
...
das glaub ich dir nicht.

> Importiere ichs wieder, funktionierts.

Nicht weiter verwunderlich. Ein Programm sollte seine selbst erzeugten 
Dateien lesen können.

> Die von mir
> erzeugte Textdatei enthält genau das selbe Schema,

Glaub ich nicht. Der von dir gepostetet Abschnitt wirft einige Probleme 
auf. Und da ist das 'Nicht-Intel-Hex'-sein noch gar nicht mit 
eingerechnet.

Zb glaub ich nicht, dass die recht offensichtlichen Adressen pro Zeile 
tatsächlich um Hex 100 ansteigen. Hex-10 würde ich dir glauben. Zum 
anderen glaube ich dir nicht, dass pro Zeile nur 15 Werte enthalten 
sind. 16 hätte ich dir geglaubt.


Du musst dir das 'Schema', welches dir GALEP als Hex-File vorgibt schon 
ein wenig genauer ansehen, einfach nur 'von der Ferne sieht das ungefähr 
genauso aus' ist zu wenig.

von ichbinswieder (Gast)


Lesenswert?

Ich bin leider wieder zu Hause und hab die GalepSoftware nicht hier aufm 
Heim-PC, aber es ist tatsächlich so, dass die um 100hex ansteigt.
100% sicher, da der index an der oberen Leiste in etwa so aussieht(im 
galep):
00 01 02 03 ...0F
hat mich auch verwundert.
Dass es nur 15 sind, kann mein Fehler sein, da hab ich mich verzählt
Zu dem hab ich mir gerade durchgelesen wie ein intel hex file aufgebaut 
ist und jetzt kann ichs selber kaum glauben, aber es ist so, dass 
tatsächlich hinter jedem Doppelpunkt eine 1 steht, was ja für 1 
Datensatz spricht.
Sinnvollerweise sollte die Schwierigkeit des Projektes nicht im 
"brennen" des Speichers liegen, sondern im erzeugen des Speicherinhalts 
und aufbauen der Hardware. -.-
Ich moddel mein C-Programm mal um und poste dann, was rauskommt

von ichbinswieder (Gast)


Angehängte Dateien:

Lesenswert?

So, im Anhang die Datei.
Das hätte ich gern im Speicher, sodass, wenn ich an den Eingang 0..0 
anlege 0..0 rauskommt, wenn ich 00..01 anlege 00001001 rauskommt usw.
Grüße

von ichbinswieder (Gast)


Lesenswert?

:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0

mal die ersten 5 original Zeilen, hab das Programm im internet gefunden

von ichbinswieder (Gast)


Lesenswert?

ah, verstanden. da steht keine 1, sondern eine 10h für 16dez :)

von Karl H. (kbuchegg)


Lesenswert?

ichbinswieder schrieb:
> :10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
> :10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
> :10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
> :10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
> :10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
>
> mal die ersten 5 original Zeilen, hab das Programm im internet gefunden

Das sieht aber schon ganz anders aus als das was du erzeugt hast.
Soviel zum Thema "sieht genauso aus"

> :10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0

:
10                 dezimal 16, wegen 16 Bytes im Datensatz
0010               die müssen an die Adresse 0x0010
                   (und die Adressen nehmen um 0x0010 zu, wie
                   man durch Vergleich mit der nächsten Zeile
                   unschwer feststellen kann)
00                 -> diese Zeile ist ein Daten Record
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                   die 16 Datenbytes höchst persönlich
F0                 und noch eine Prüfsumme über den Record

von ichbinswieder (Gast)


Angehängte Dateien:

Lesenswert?

habs schon. zwar passt die checksumme nicht, aber da gibts kein Fehler 
nur eine Warnung. Gut danke, funktioniert :)
Grüße

ps:das teil mal im anhang

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

ichbinswieder schrieb:
> habs schon. zwar passt die checksumme nicht, aber da gibts kein Fehler
> nur eine Warnung. Gut danke, funktioniert :)
> Grüße

Die Checksumme wirst Du doch auch noch hinbekommen.

Zitat: http://www.netzwolf.info/microcontroller/nanopascal/intel_hex
"Die Prüfsumme besteht aus einem Byte, dargestellt durch zwei 
Hexziffern. Bei einem gültigen Datensatz ist die Modulo-256-Summe der 
Bytes aus den Feldern 1 bis 5 gleich 0."

Mit freundlichen Grüßen
Guido

von THaala (Gast)


Lesenswert?

Nachdem ich nun deine Datei mal gesehen habe stelle ich fest das ich ein 
Glas Senf gewonnen hätte.
Du könntest natürlich mal versuchen den Unterschied zwischen einer 
Binärdatei und einer Character - Datei zu verstehen bevor du dich in 
Abenteuer mit einer Intel-Hex kodierung verstrickst.

Binärdateinen öffnet man zum schreiben mit option "wb":
1
FILE *fp;
2
fp=fopen("c:\\ausgabe", "wb");
3
char x[4]= {0xAA, 0xBB, 0xCC, 0xDD};
4
fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
5
fclose( fp );

Das ist es was Du ursprünglich machen wolltest.... und wenn du die datei 
ausgabe jetzt in galep öffnest wirst du auch die Bytes 0xAA, 0xBB, 0xCC, 
0xDD an den ersten vier Stellen finden.....

Gruß Thilo

von ichbinswieder (Gast)


Lesenswert?

THaala schrieb:
> Nachdem ich nun deine Datei mal gesehen habe stelle ich fest das ich ein
> Glas Senf gewonnen hätte.
> Du könntest natürlich mal versuchen den Unterschied zwischen einer
> Binärdatei und einer Character - Datei zu verstehen bevor du dich in
> Abenteuer mit einer Intel-Hex kodierung verstrickst.
>
> Binärdateinen öffnet man zum schreiben mit option "wb":
> FILE *fp;
> fp=fopen("c:\\ausgabe", "wb");
> char x[4]= {0xAA, 0xBB, 0xCC, 0xDD};
> fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
> fclose( fp );
>
> Das ist es was Du ursprünglich machen wolltest.... und wenn du die datei
> ausgabe jetzt in galep öffnest wirst du auch die Bytes 0xAA, 0xBB, 0xCC,
> 0xDD an den ersten vier Stellen finden.....

Ich kenn sehr wohl den Unterschied und es geht jetz.


Wegen den Prüfcodes, das wäre zwar das I-Tüpfelchen aber sinnlose arbeit 
:)
Grüße

von Ekart (Gast)


Lesenswert?

Was für einen Prozessor benutzt Ihr? 6502? 8051? Das in der Schule immer 
noch die Uralt Sachen Wie 2732 EPROMS verwendet werden finde ich 
Komisch. da es doch viel heute viel einfachere sachen giebt wie AVR und 
Pic.

von Erich (Gast)


Lesenswert?

@Ekart
>Was für einen Prozessor benutzt Ihr?

Naja, bist immerhin "so alt" dasste was von einem 6502 oder 8051 gehört 
hast.
Jedoch hat der TO (der Startautor hier) gesprochen von einem
>Speicher(D2732) und paar Flipflops
Von einem uC oder uP war überhaupt nicht die Rede !

Offensichtlich handelt es sich um die (umständliche) Erstellung von 
Daten für eine Ablaufsteuerung, einen Automaten, einem Mealy-Automaten 
oder Moore-Automaten.

Den Rest können interessierte selbst herausgoogeln oder Wikipedia 
befragen.

Und wenn das zutrifft, dann schreibe ich euch a.W. demnächst hier den 
Link zu einem Programm rein, mit welchem man solche (einfachen) 
Automaten erstellen kann.
Das gibt dann gleich die fertige .HEX Datei raus, z.B. für ein 2732.

Gruss

von ichbinswieder (Gast)


Lesenswert?

Prozessor? Meinst du jetz in dem Speicher? Dass da ein Prozessor drin 
ist, wäre mir neu :)

Ja PIC(Axe) haben wir auch schon verwendet(im Modul Hardwarepraktikum) 
aber im Modul Mikroprozessoren gehts halt um die Grundlagen, da eignen 
die die Oldschool-sachen eben besser. Z.b. datenübertragung über den 
Parallelport, macht heut keiner mehr, aber sollte man trotzdem wissen 
wie es geht.

In unserem Projekt sollen wir uns selber was ausdenken, was wir 
zusammenfriemeln. Zur verfügung haben wir Speicher und PLAs, (P16v8). 
Daraus soll halt etworfen werden. Für die Features kann man dann auch 
was "moderneres" nehmen, aber der Kern soll so aufgebaut werden.
Grüße

von Achim M. (minifloat)


Lesenswert?

Probiers mal mit dem uralten Bin2Hex:
http://www.keil.com/download/docs/113.asp

Ein unter Unix-Flavors laufendes Pendant sollte sich auch finden lassen, 
falls benötigt.

mfg mf

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.