Forum: Mikrocontroller und Digitale Elektronik Daten vom ADC in externen Speicher schreiben


von Matthias S. (menolix)


Lesenswert?

Hallo,

vielleicht könnt Ihr mir helfen. Möchte die Daten, die ich von einem
AD-Wandler kriege, in einen externen 32k Speicher schreiben. Ich
benutze den MSC1210Y4, einen µC mit integriertem ADC. Bin mit der
Materie aber noch nicht vertraut und finde keine Infos mehr im Netz.

Gruß
Menolix

von Niels H. (monarch)


Lesenswert?

Wo genau liegt denn dein problem?
Brauchst du ne schaltung, Programmcode (wenn ja, welche
entwicklungsumgebung) usw?

von Matthias S. (menolix)


Lesenswert?

die Hardware ist fertig, aber mir fehlt das Verständnis, für den
Programmablauf. Ich programmiere in C mit dem µC51 von
www.wickenhäuser.com

Die Namen der Ports usw. habe ich mir aus der Beschreibung
rausgesucht.

Menolix

von Niels H. (monarch)


Lesenswert?

Ohne jetzt den Controler und Hardware grossartig zu kennen würde ich
folgendermaszen vorgehen:

1. Hardware inititialisieren (ADC, Interrupts, Stack etc)
2. ADC wert anfragen
3. warten auf ADC bis Wert fertig
4. ADC Wert holen
5. ADC Wert in speicher schreiben.
6. zurück zu 2

Das wäre der einfachste Weg.

von Matthias S. (menolix)


Lesenswert?

so denke ich auch.
nur der Schritt von 4 nach 5 ist mir nicht ganz klar.
ich habe den Wert vom Typ float in der Variablen temp. Wie schaffe ich
es jetzt, diesen Wert in einen externen 32K (HY62256A) Speicherbaustein
zu schreiben. Es ist alles wie vorgesehen angeschlossen. der /OE an A15,
also P2.7 (oder P2_B7)

Menolix

von Matthias S. (menolix)


Lesenswert?

Ich fange mit der Programmierung eines MSC1210 gerade an und benötige
sehr detaillierte Informationen.

Danke

von Niels H. (monarch)


Lesenswert?

Das Letzte mal, das ich es mit einem 8051 zu tun hatte, ist knapp 10
Jahre her. Man möge mir eventuelle Fehleinschätzungen verzeihen.

Wenn ich mich richtig erinnere, Adressiert der 8051 den externen
Speicher über das 8-bitRegisterpaar H und L. Ich weiss nicht, ob der
assembler dir diesen Umstand abnimmt.

Ich würde sagen, dir bleiben 2 möglichkeiten: a.)du rechnest der
Floatwert so um, das er in ein byte past. b.) du nimmst den float wert
selbst, zeigst mit einem char-pointer drauf und speicherst die
einzelnen Bytes ab.

zu a.)
Liegt der float wert beispielsweise innerhalb von 40.5 und 100, würde
ich ihn so umscalieren, das er in ein unsigned char reinpasst (0-255)
(unsigned char)byteval=(float)floatval-40.5*4.2857;

zu b.)
ist das float-typ beispielsweise 4byte gross:
unsigned char *bytes=(unsigned char)&floatvar;
for (cou=0;cou<4;cou++) {
   *EXTMEM=*bytes;
    bytes++;
}

Hoffe, das hilft ein wenig....zumindest als gedankenschubser...

von Matthias S. (menolix)


Lesenswert?

macht nichts... die Idee ist gut. Punkt b klingt vielversprechend. Werde
es damit mal versuchen.

Sollten andere dies lesen, habe mich im letzen Posting vertan.

The extern memory is an HY62256A.
/OE is connected to /RD
/WE -> /WR
/CS ->  A15 (or P2.7 P2_B7)

Vielen Dank erstmal, die nächsten Fragen kommen bestimmt ;-)

greetings
Menolix

von Niels H. (monarch)


Lesenswert?

62256 ist ein normaler Standard SRAM-Typ. Verdrahtung hört sich gut an.
Demnach liegt der extrne Speicher ab Speicheradresse 0x8000 bis 0xFFFF.
Wie man den jetzt in C anspricht, weiss ich leider auch nicht.

von Niels H. (monarch)


Lesenswert?

Oh sorry...negation!
0x0000-0x7fff

von Peter D. (peda)


Lesenswert?

Ich vermute mal, der Wickenhäuser hält sich an den Quasi-standard Keil,
dann ist das Zauberwort "xdata".

D.h. alle Variablen, die als xdata deklariert werden, landen im
externen RAM.

Allerdings ist float Perlen vor die Säue !

Der ADC wird ja wohl kaum float ausgeben, d.h. Du sparst massig
Speicherplatz und CPU-Zeit, wenn Du die Werte genau so abspeicherst,
wie der ADC sie liefert (2 Byte = unsigned short).


Peter

von Menolix (Gast)


Lesenswert?

Danke für den Tip, Peter,

das checke ich gleich mal.

Aber mit "Perlen vor die Säue" irrst Du Dich, da der ADC 24 Bit hat,
und ich brauche jedes einzelne davon :-)

Menolix

von Niels H. (monarch)


Lesenswert?

Hab mich mal eben schlau gemacht. Vermutlich wäre es so am einfachsten:
1
 xdata float xyz[8192]; // 8192 32-bit values sind 32KB
2
 for (cou=0;cou<8192;cou++)
3
      xyz[cou]=getADC();

Aber mein vorredner hat schon recht. Wenns geht, solltest du die
unsigned shorts nehmen.

von Peter D. (peda)


Lesenswert?

"Aber mit "Perlen vor die Säue" irrst Du Dich, da der ADC 24 Bit
hat,
und ich brauche jedes einzelne davon :-)"

float sind 4 Byte, 24 Bit nur 3 Byte, Du kannst also locker 25%
sparen.

Auch ist die Frage, was Du hinterher machen willst, d.h. ob die
float-Werte überhaupt benötigt werden.
Z.B. Werte anzeigen geht auch prima in long, oder gleitendes Mittel
über 256 Werte usw.


Peter

von Niels H. (monarch)


Lesenswert?

Ich glaube, bei Herrn "Menolix" handelt es sich um einen nicht allzu
erfahrenen Programmierer. Also halten wir doch einfach mal, das
theoretische etwas bei Seite....

von Menolix (Gast)


Lesenswert?

Ja, es stimmt. Habe zwar im Studium programmieren gelernt, ist aber
schon ein bißchen her. Aber das mit den 3 Byte 3*8 = 24 und nicht 32,
ist schon klar.

Arbeite mich gerade in ein neues Projekt ein, dass mit
µC-Programmierung zu tun hat.

Wenn Ihr noch weitere Infos habt, oder ne Webseite kennt, wo ich gute
Infos finde, wäre Euch sehr dankbar.

Menolix

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.