Autor Beitrag
ABoecker
Hält's aus hier
Beiträge: 5

Windows XP Pro
Delphi 6 Pro
BeitragVerfasst: Di 29.03.05 13:08 
Hallo Leute,

ich mache auf Grund meiner Umschulung zum Fachinformatiker FR Anwendungsentwicker Kaufmännische Systeme ein Praktikum.

Hier soll ich ein Programm schreiben, womit ein interner Speicher (EPROM) programmiert werden soll.

Jetzt habe ich probleme in der Übertragung der Speicher Adressen. Mir ist nicht ganz klar wie ich auf den Speicher zu greifen soll, und wie ich einzelne Adressen ansprechen kann.

Würde mich freuen wenn mir jemand einen hilfreichen Tip geben kann.

Danke im Voraus
ABoecker
ABoecker Threadstarter
Hält's aus hier
Beiträge: 5

Windows XP Pro
Delphi 6 Pro
BeitragVerfasst: Di 29.03.05 13:25 
Was ich vergessen habe zu erwähnen ist, das dieser Speicher über eine Serielle Schnittstelle angesprochen werden soll!!! :?: :?:
firus1983
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 170

Win98,XP,
D6 Entrpr
BeitragVerfasst: Di 29.03.05 13:47 
Schau dich mal bei torry.net nach Kompos für die serielle Schnittstelle um....

_________________
Veni Vidi Codi !
Ich kam, sah, und programmierte !
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 08:08 
Mooin,

was mein Kollege da so nich ganz prall ausgedrueckt hat, ist, das wir die Verbindnung zu einem externen Geraet ueber die serielle Schnittstelle schon hinbekommen, is ja genug Info hier im Board, doch muessen wir verschiedene Adressen ansprechen und das is hier nirgens (oder ich habs nich gefunden) beschrieben.

Kann man das nach dem Motto Client.Adress := irgendwas; umstellen?
Und welches Format muss, darf das haben? Hex, binaer?

danke fuer eure Hilfe.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 08:24 
Da kann euch keiner helfen, der nicht weiß, mit was ihr arbeitet. Wie das geht, hängt nur von dem System ab, das ihr über die serielle Schnittstelle ansprechen könnt. In der Doku dazu muss angegeben sein, welche "Kommandos" dieses zwischen geschaltete Gerät kennt.

Primitivster Fall: Ihr schickt einen Datenblock und das System schreibt den beginnend mit der ersten Speicherzelle in den EPROM. Das wärs dann. Darüber gibt es beliebig komplizierte Möglichkeiten, sowas zu realisieren. Wichtig wäre auch zu wissen, in welchem Format ihr die Daten liefern müsst. Ich kenne aus grauer Vorzeit solche Systeme. Da musste der Speicherinhalt z.B. nicht ASCII-codiert sondern Intel-Hex-codiert sein.

Also postet da mal ein paar Infos dazu.
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 08:59 
Jo, jetzt haste mich aber erwischt. Tja, was soll ich da als Dummnoob zu sagen, ich kuck ma, was hier so beiliegt.

Aaalso, ich habe hier eine Speicherberiechuebersicht liegen, wonach der Adressbereich von $4000 - $47FF geht bei einem 2k EEPROM.

Darin dann jeweils so normale Hexwerte wie zb: 02, 98, 9A, 9C, ...
Ob das nu Intel Hex is, oder was auch immer, keine Ahnung, muss ich mir erst mehr Infos reinpauken.

Unser Prob liegt nun darin, nachdem wir die Verbindung aufgebaut haben, in die fortlaufenden Adressen das passende reinzuschreiben. Dabei ist nicht das schreiben das Problem, das wird wohl mit WriteFile(Com, ...) laufen, sondern das aendern der Adresse.
Da hab ich keine Ahnung von.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 09:22 
Die Frage wäre, ob das Gerät, mit dem ihr in den EPROM schreibt eine Adressierung ermöglicht?

Wenn ja, dann müßte normalerweise einfach das was ihr an das Gerät schickt einer bestimmten Formatierung
entsprechen. In diesem Stream müßt ihr dann, bei dem was ich bis jetzt gesehen hab, an einer bestimmten
Stelle das Byte für die Adresse setzen, damit das Gerät (ich nenn es jetzt mal liebevoll Controller) den
Wert in den Speicher schreibt.

Gruß :)

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 10:16 
hmm, solangam bin ich hinlaenglich verwirrt.

Hier mal ein Auszug aus dem urspruenglichem C Quellcode, der (wie ich annehme) fuer die Uebertragung zustaendig ist:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
void Sende_Daten(char *daten_ptr)
{
  int i;

  stat_outbuf.status = HST_BUF_WRITING;

  /* Daten in Puffer */
  for (i=0;(i<=(int)strlen((char *)daten_ptr))&&(i<BLOCKSTRGMAX);i++)
    stat_outbuf.buffer[i]=blockstrg_ptr[i];
  stat_outbuf.buffer[i]=0;

  stat_outbuf.byt_cnt=(word)strlen((char *)(&stat_outbuf.buffer[0]));
  if (stat_outbuf.byt_cnt!=0)
    stat_outbuf.byt_cnt--;

  /* Sendung anstossen */
  events[COM_FLGS] = (byte)(events[COM_FLGS] | CMS4_FLG);
  events[GLBL_FLGS] = (byte)(events[GLBL_FLGS] | EVENT_FLG);
}


Und, was vielleicht anschaulicher ist, ein Auszug aus der Uebertragung zwischen dem Geraet und dem 286er laptop, der das urspruengliche C Programm enthaelt:

...
42BA 42 B
42BB 6F o
42BC 65 e
42BD 63 c

42BE 6B k
42BF 65 e
42C0 72 r
42C1 56 V
42C2 65 e
42C3 72 r
42C4 73 s
42C5 32 2
...

Wir sollen das uralt C Programm neu in Delphi schreiben, sodass das auch auf einem Rechner laeuft, der schneller als ein 286er ist.
Das Orginalprogramm verheddert sich bei der Uebertragung und bricht dann ab.

Also wenn jetzt noch wer ne Idee hat, ich hab keine mehr, ich mach erstma Mittag. Mahlzeit.

Moderiert von user profile iconraziel: Code-Tags hinzugefügt, Überflüssige Absätze entfernt.
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 10:19 
Bei meinen Fällen war das damals so, dass man nur komplette Bausteine programmieren konnte. Also musste man einen Datenblock (in HEX) von der entsprechenden Länge an das Gerät schicken. Eine Positionierung an eine bestimmte Stelle oder eine Programmierung von Ausschnitten war nicht möglich.

Die Adresse des Bausteins müsst ihr aus zwei verschiedenen Blickwinkeln betrachten:
Die Adresse, mit der das Programmiergerät den Baustein anspricht, muss nich diie selbe Adresse sein, mit der der Baustein später in der tatsächlichen Anwendung betrieben wird. Euer Programmcode muss auf alle Fälle so geschrieben sein, dass die Adressen der tatsächlichen Anwendung verwendet werden. Ob ihr die Adresse des Programmiergerätes überhaupt benötigt wissen wir ja noch nicht, da wir noch nicht wissen, ob ihr Ausschnitte programmieren könnt. Das wäre eine Funktion, die das Programiergerät bereitstellen muss (Auslesen des vorhandenen Codes aus dem Bausteien, ersetzen eine Teils durch euern Code, brennen des neuen Gesamtcodes).
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 10:37 
user profile iconElassar_Targon hat folgendes geschrieben:


Und, was vielleicht anschaulicher ist, ein Auszug aus der Uebertragung zwischen dem Geraet und dem 286er laptop, der das urspruengliche C Programm enthaelt:

...
42BA 42 B
42BB 6F o
42BC 65 e
42BD 63 c
42BE 6B k
42BF 65 e
42C0 72 r
42C1 56 V
42C2 65 e
42C3 72 r
42C4 73 s
42C5 32 2
...




Das sieht ganz genau wie ne Adressierung aus. :D
42BA -> 42BB -> 42BC usw.

//Edit: mich würde das Senden- Event interessieren. Weil beim Senden selber, wird nur n Struct zusammengebastelt bzw. gefüllt.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 13:04 
Also moeglicherweise stillt dies Deine Neugier:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
/****************************************************************************/
/*   BESCHREIBUNG : Interrupt Service Routine fuer das Sender von Daten.    */
/*                  Diese Routine ist auf Geschwindigkeit getrimmt.         */
/*                  Die Kommunikation mit den hoeheren Schichten findet     */
/*                  mit "stat_inbuf...status" statt.                        */
/*                                                                          */
/****************************************************************************/

void  Stat_ISR_Send(void) {

static byte out_byte;                              /* static wg. Debugger */
static byte last_out_byte;                           /* static wg. Debugger */

  /* Beim 1. Endezeichen ist Datenfeldende erreicht !  */

  last_out_byte=out_byte;
  out_byte = *stat_outdat_ptr++;

  if (*stat_outcnt_ptr==0) {
       stat_out_strg_cnt++;
  }
  switch (stat_out_strg_cnt) {
          case 0:   /* Header und Datenfeld senden */
                    if ((*stat_outcnt_ptr)-- <=  0)  { /* Byte's zaehlen */
                        out_byte=0;
                        *stat_outstat_ptr = STAT_BUF_ERR_DAT_LEN;        /* Fehler melden  */
      events[COM_FLGS] = (byte)(events[COM_FLGS] | CMG4_FLG);
      events[GLBL_FLGS] = (byte)(events[GLBL_FLGS] | EVENT_FLG);
                    }
                    else {
      stat_out_chk_wert = (byte)((byte)(0x7F) & (byte)(stat_out_chk_wert ^out_byte));
                        /* Byte auf Port schreiben */
      _outp(stat_com_base_adr, out_byte);
                    }
                    break;
          case 1:
                    out_byte=0;
                    *stat_outstat_ptr = STAT_BUF_OUTDAT_OK;         /* Zustand    */
        events[COM_FLGS] = (byte)(events[COM_FLGS] | CMG4_FLG);
        events[GLBL_FLGS] = (byte)(events[GLBL_FLGS] | EVENT_FLG);
                    break;                                    /* melden     */
          default:  *stat_outstat_ptr = STAT_BUF_ERR_FATAL;         /* nicht      */
        events[COM_FLGS] = (byte)(events[COM_FLGS] | CMG4_FLG);
        events[GLBL_FLGS] = (byte)(events[GLBL_FLGS] | EVENT_FLG);
                    break;                                    /* moeglich   */
  }
}


Und, was fuer mich dann interessant ist, aber eigentlich nicht meine Frage war, das Senden des Blockses.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
/****************************************************************************/
/*   BESCHREIBUNG : Das 1. Zeichen aus dem Ausgabebuffer wird gesendet;     */
/*                  Die ISR uebernimmt das Senden der restlichen Daten.     */
/*                  Die Kommunikation mit der ISR findet ueber die globalen */
/*                  Variablen statt.                                        */
/*                                                                          */
/****************************************************************************/

void  __far Send_OutBuf_Stat(void) {

    ClrEventFlag(COM_FLGS,CMS4_FLG);

    /* Initialisieren ... */
    stat_outstat_ptr  = &stat_outbuf.status;
    stat_outcnt_ptr   = &stat_outbuf.byt_cnt;
    stat_outdat_ptr   = &stat_outbuf.buffer[0];        /* 1. Byte          */
    stat_out_chk_wert = (byte)(stat_out_strg_cnt = 0);
    *stat_outstat_ptr = STAT_BUF_SENDING;                     /* senden melden    */

    /* ... und Ausgabe starten */
    _outp(stat_com_base_adr, (*stat_outdat_ptr++));

}



Somit habt ihr beide Recht, 1. wird das alles als Block in einem Rutsch uebertragen und dies an fortlaufende Adressen geknuepft. Nur wenn ich dies nun weiss, wie bekomme ich das unter Delphi 6 hin, das sich die Adressen um je 1 weiterzaehlt und nicht alles in eine klatscht?

danke schon jetzt fuer eure Anteilnahme.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 13:48 
Nochmal hallo, :D

Im Prinzip, werden ja nur die Daten aus einem Array nacheinander gesendet.

Das Ganze läuft unter Windows über die Win32 API Funktion "WriteFile()".

Dort könnt ihr dann z.B. die Größe des zu sendenden Datenpuffers übergeben.
Also könntet ihr euren Datenarray beibehalten und dann per for- Schleife einzelnd schreiben,
wenn ihr alles genau überwachen wollt.

Bevor ihr aber euch mit der WriteFile- Funktion totarbeitet, würde ich euch ne Komponente
an's Herz legen.

Einfach mal unter "Seriell", "RS232", "RS- 232- C" etc. im Forum suchen. Da werden einige Empfohlen.
Da seht ihr dann auch Beispiele noch zusätzlich.

Das einzige wozu ich jetzt nix sagen kann ist, wie ihr die Adresse angeben sollt.
Da werd ich bei flüchtiger Betrachtung nicht schlau aus dem Code. :)

ausblenden Quelltext
1:
_outp(stat_com_base_adr, (*stat_outdat_ptr++));					


Ob stat_com_base_adr die an die zu schreibende Adresse darstellt oder den Comport weiß ich nicht.
Kenn die Funktion nicht, gehört die zu ISR? Was ist eigentlich ISR?

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 13:55 
ISR = Interrupt Service Routine
und frach mich nich nach dem C Kot.


Jo, zu RS 232 habsch schon wie oben gesagt, ne Menge gutes Zoig gefunden, allerdings gehted immer nur um Datenuebertragung oder um ansteuern einzelner Pins.

Aber wie man nen Satz Daten, als Array, oder string in mehreren Etappen (Adressweise) schickt, is nach wie vor unklar.

Vielleicht mach ich mir hier auch nur n zu grossen Kopp drum und das geht recht easy...

"Oh Herr, lass Hirn regnen."
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.03.05 14:08 
Ja, du machst dir nen zu großen Kopf. :D

Die größe der Daten bestimmt man durch die Angabe des Puffers.
D.h. schreibt man einen Array mit 10 Elementen, gibt man einfach die Größe an
und die Daten werden Automatisch (von den meisten Komponenten zumindest)
geschrieben.

Wenn du jetzt per Hand (was nämlich die Komponenten selber machen) einzelnd Werte schreiben möchtest,
machst du nix anderes als den Wert Ary[i] zu übergeben und anstatt die größe des Ary- Puffers gibst du
nur die Größe des Elementes an. (:gruebel: komisch formuliert)

Hier der Header von WriteFile
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
BOOL WriteFile(

    HANDLE hFile,  // handle to file to write to 
    LPCVOID lpBuffer,  // pointer to data to write to file 
    DWORD nNumberOfBytesToWrite,  // number of bytes to write 
    LPDWORD lpNumberOfBytesWritten,  // pointer to number of bytes written 
    LPOVERLAPPED lpOverlapped   // pointer to structure needed for overlapped I/O
   );


lpBuffer muß auf das Element beschränkt werden. (z.B. @Ary[i])
nNumberOfBytesToWrite muß auf die Größe beschränkt werden. (z.B. SizeOf(Ary[i])

Hoffe das stimmt soweit. Ich hab ewig nimma mit sowas gearbeitet. :mrgreen:

//Edit: Achja :welcome:

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Elassar_Targon
Hält's aus hier
Beiträge: 8

win2000, win XP, dos

BeitragVerfasst: Mi 30.03.05 14:16 
hmm, oeh, ja, ich werd ma schaun, obs das bringt. Nu mach ich aber erstma (geistig) Feierabend.

Danke fuer das welcome :)