mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik xdata Array ausgeben


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
 }

}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
 }

}

Autor: Peter (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

wo bitte hat der 89c2051 einen xdata Bereich?

MfG
Pieter

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd N. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
code uint8_t myArray [126] = {

Leg dein Array ins ROM.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.