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
Wo genau liegt denn dein problem? Brauchst du ne schaltung, Programmcode (wenn ja, welche entwicklungsumgebung) usw?
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
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.
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
Ich fange mit der Programmierung eines MSC1210 gerade an und benötige sehr detaillierte Informationen. Danke
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...
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
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.
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
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
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.
"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
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....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.