www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Große Konstante im ROM..


Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi erstmal :)

Ich habe folgendes Problem.. ich will zu Testzwecken eine sehr große
Konstante in den ROM schreiben.. dies mach ich mit

char code daten[] = { .. 40k hexwerte };

der Controller hat 64k Ram, geht sich also Problemlos aus.. sind auch
richtig im ROM.

nun will ich aber auf einzelne Bytes zugreifen.. der erste Versuch war
ein direkter Zugriff also über daten[ziffer].. ein korrekter Zugriff
war so nicht möglich?

genauer: ich verwendete if(daten[1533]==0xFF) ....
das Programm springt trotz richtigem Inhalt nicht in die Schleife

Somit versuchte ich es über einen Pointer

char *test;
test=test+1533;
if(*test==0xFF) ....

das selbe.. springt nicht in die schleife, obwohl eindeutig 0xFF dort
steht.. (zur Kontrolle wurden alle Mittel des Keil debuggers
verwendet).

dann gings weiter..

char *test;
char space;
test=test+1533;
space=*test;      --> in space steht nun definitiv 0xFF laut debugger!
if(space==0xFF) ... --> springt NICHT in diese schleife ?!

Ich hoffe ihr habt ne idee, ich bin echt am verzweifeln.. falls es eine
bessere möglichkeit gibt auf diese Datenmenge zuzugreifen bin ich gerne
offen für Vorschläge..

bei den Daten handelt es sich übrigens um ein MP3-File welches später
über zu Testzwecken über den internen MP3-Dekoder ausgegeben werden
soll (AT89C51SND1C)..

Danke für eure Hilfe
Grüße
Manuel

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird char als signed char oder unsigned char interpretiert?

MW

Autor: Manuel Fegerl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Beiliegend das Testprojekt.. ist ein Keil Projekt (main.c ist der
source)

Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael

Danke für deine Antwort.. war ein guter Denkanstoss :)

ich weiß zwar ehrlichgesagt den unterschied zwischen signed und
unsigned char nicht.. (vielleicht kann mir das wer erklären :), aber
nachdem ich jetzt den pointer test als unsigned definiert habe,
funktioniert das so.. :)

Danke,
Schöne Grüße
Manuel

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signed geht von -127 bis +128. unsigned von 0...255. daher konnte deine
bedingung (==255) nie erfüllt werden. manche compiler meckern da
übrigens...wie heisst der prozessor eigentlich ?

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
manuel: schäm dich. sowas muss man unbedingt wissen ! 10 mal vaterunser
aufsagen und einmal auf knien ums haus !

Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

@dicky: ist ein Atmel AT89C51SND1C
Kompiliert wurde mit Keil (7.10 compiler).. ohne warnung :(

übrigens ich höre tatsächlich zum ersten mal heute dass es unsigned
char gibt.. find ich auch komisch.. naja wieder was gelernt :)

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja mensch das ist total wichtig ! siehe auch int und unsigned int, long
und unsigned long. wenn man das nicht weiss kommt man schnell in
teufels küche. egal ob globale variable, array usw... nur bei float,
double und bool gibt es die unterscheidung nicht. ein typisches problem
sind z.b. char (signed) in for/next schleifen wenn die variable über 128
kommen kann...wer von (ältere versionen) basic kommt, weiss das manchmal
nicht. auch in asm sieht man zunächst alles wie unsigned char oder
unsigned int, allerdings gibt es wohl keinen asm-anwender der das nicht
zumindest theoretisch weiss.

merken: wenn irgendwo char,int oder long steht, ist immer die
"signed-version" gemeint. die unsigned version muss immer explizit
angegeben werden. wenn irgendwo aber nur "unsigned" steht, ist
stillschweigend "unsigned int" gemeint. ist leider anfangs etwas
verwirrend.

Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei integer wars mir immer klar.. da machts ja auch sinn (negative
zahlen..)

aber bei char find ichs etwas seltsam.. natürlich ist ein char auch nur
ein byte, is ja auch ne zahl.. macht also genauso sinn

gut zu wissen auf jedenfall :)

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja und auf 8-bittern will man ja auch mal mit negativen zahlen was
machen...

Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was mir immer noch komisch vorkommt ist halt das ich ja trotzdem nur
hexwerte vergleiche.. und die warn ja trotzdem gleich.. für was sie
stehen sollte ja egal sein bei so etwas..

Autor: Hannes Hering (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Manuel: Das der Compiler in dem Fall den (signed) char Wert (der
natürlich maximal 128 groß sein kann) nicht als 0xFF erkennt liegt
daran, das der Wert, der in der char-Variablen gespeichert ist, als -1
angesehen wird, dagegen wird die 0xFF als vorzeichenbehaftete (also
positive) int Zahl interpretiert und (char)-1 == 255 ist nunmal falsch!
;)

Autor: Manuel Fegerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klingt logisch :)

danke nochmal

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.