Forum: Mikrocontroller und Digitale Elektronik xdata Array ausgeben


von Peter (Gast)


Lesenswert?

Hallo zusammen

Ich arbeite mit einem at89c2051 und Keil.
Nun habe ich ein Array im externen Bereich mit xdata abgespeichert, da 
es sonst zu gross ist. So weit so gut.

Nun möchte ich diese Zahlen auch wieder ausgeben, aber dies funktioniert 
nicht! :(
Könnt ihr mir einen Tipp geben wie ich die zahlen ausgeben kann?
Ich habe schon einen Kollegen gefragt und dieser hat mir ein Vorschlag 
gegeben, aber dieser funktioniert nicht.

Hier ist sein Vorschlag (P1 ist der ausgang, Port1)

unsigned char xdata arr[126]= {126. zahlen}
unsigned char i;

void warte(){
//Warteschleife
}
void main(){

 while (i<126){
 P1 = (unsigned char *) &(frisch_INF+i);
 warte();
 i++;
 }

}

von Peter (Gast)


Lesenswert?

Ich hab noch ein Fehler in meinem Programm entdeckt. :)

es sollte so aussehen:

unsigned char xdata arr[126]= {126. zahlen}
unsigned char i;

void warte(){
//Warteschleife
}
void main(){

 while (i<126){
 P1 = (unsigned char *) &(arr+i);
 warte();
 i++;
 }

}

von Peter (Gast)


Lesenswert?

Hat niemand eine Idee was falsch sein könnte oder wie es richtig sein 
sollte? :(

von Thomas (Gast)


Lesenswert?

Hab Geduld. Erst mal i initialisieren (i=0;).

von Peter (Gast)


Lesenswert?

Das hab ich gemacht, aber hier nicht angegeben.
Es funktioniert trotzdem nicht.

von Ralf (Gast)


Lesenswert?

> Ich arbeite mit einem at89c2051 und Keil.
> Nun habe ich ein Array im externen Bereich mit xdata abgespeichert, da
> es sonst zu gross ist.
Die fett markierten Begriffe schließen sich aus... Der AT89C2051 hat 
keinen on-Chip-XData-Speicherbereich.

Ralf

von Pieter (Gast)


Lesenswert?

moin moin,

wo bitte hat der 89c2051 einen xdata Bereich?

MfG
Pieter

von Peter (Gast)


Lesenswert?

Ok
Danke für den Hinweis ;)

Wie müsste ich dann ein Array mit 126 zahlen speichern?

Wenn ich es normal init. also:
unsigned char arr [126]= {zahl}
gibt es immer ein Fehler, dass mein Array zu lang ist.

von Ralf (Gast)


Lesenswert?

> Wie müsste ich dann ein Array mit 126 zahlen speichern?
Vergiss es. Der AT89C2051 hat nur insgesamt 128 Bytes RAM, davon gehen 
mindestens acht für die verwendete Registerbank drauf und mindestens ein 
paar Bytes für den Stack. Du brauchst also 2052 aufwärts.

Ralf

von Peter (Gast)


Lesenswert?

Ok danke für den Tipp.

Wenn ich jetzt z.b. ein 2052 habe:
müsste ich dann das array auch mit xdata abspeichern oder nicht?
und wie müsste es ausgegeben werden?

von Pieter (Gast)


Lesenswert?

...wenn ich ganz tief in mir suche...der 2051 hatte doch nur 128Byte 
RAM.
Davon will das C-Prog noch was abhaben.
Fange doch mal mit der Arraygröße klein an und vergrößere Schrittweise.

..und google mal nach RTFM.

MfG
Pieter

von Bernd N. (Gast)


Lesenswert?

code uint8_t myArray [126] = {

Leg dein Array ins ROM.

von tom (Gast)


Lesenswert?

wenn dein gewählter uC das RAM-mässig nicht hergibt, aber so ein kleines 
progrämmchen nur hat, könntest du das array ja in den code-speicher 
(ROM=FLASH) packen. Wird etwas langsamer sien als aus dem RAM aber tut 
es auch mit dem kleinen uC. Wie dieser Zugriff genau mit Keil51 geht 
musst Du noch herausfinden (google, etc.).


ausserdem ist das hier wohl (auch) Unfug:

>> P1 = (unsigned char *) &(arr+i);
...wenn der compiler nicht meckert dann tust du hier die adresse von 
arr[0] + wert der variable i ausgeben, ist wohl nicht ganz das was sein 
soll.

wenn du auf P1 nacheinander die werte des array ausgeben möchtest, dann 
besser so:

void main()
{
  unsigned char i = 0;

  while (i<126)
  {
    P1 = arr[i];
    warte();
    i++;
  }
}

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.