Hallo, programmiere mit keil einen XC167 wenn ich ein array anlege, das in einen bestimmten Speicherbereich soll, dann mache ich das so: char idata test[20]; so, jetzt habe ich bei Options L166 Locate eine eigen Classe angelegt: MeineDaten(0xED0000-0xFEFFFF) so, und wie lege ich jetz da einen array hinein?? char MeineDaten test[65535] funktioniert nicht. Wie geht das? wie lege ich einen Array in dieses Speicherbereich?? Johannes
Hallo Johannes, ich habe vor kurzem ein XC167CI Starter Kit erworben und versuche dies nun in Betrieb zu nehmen. Bisher habe ich aber noch keine Verbindung zwischen meinem Board und der Software herstellen können. Ich verwende µVision2 von Keil. Kannst Du mir vielleicht weiterhelfen und mir sagen, welche Einstellungen ich vornehmen muss? Mfg Andreas
> MeineDaten(0xED0000-0xFEFFFF)
und wie soll der Compiler wissen was du im Linker machen willst
wie wäre es mit folgendem
char test[65535] at 0xED0000;
das sollte funktionieren.
Thomas
Hallo, hatte damals mit dem StarterKit eine CD mitbekommen. Da war ein Beispiel namens "Blinky.uv2" dabei. Von dem aus habe ich das Board mit Jumper usw. mal eingestellt, und dann gieng es erst richtig los. das würde ich an deiner Stelle auch mal versuchen. wenn nicht klappt, dann meld dich. johannes
Hallo Thomas! Nun, ich dache eben das der Linker das aus der Zeile char MeineDaten test[65535]; char idata test[20]; weis. Weil es eben mit der Klasse idata funktioniert aber mit meiner eigenen Klasse MeineDaten nicht. Und genau das war je meine Frage, wie ich das dem linker angeben muß. Habe dein Zeile Probiert, aber mein Keil kann mit dem Schlüsselwort at nichts anfangen johannes
Hallo Johannes,
> Nun, ich dache eben das der Linker das aus der Zeile
nein MeineDaten ist dem Comiper unbekannt das ist ja erst im Linker
definiert.
Du hast recht at gibt es nur beim 51er
aber char xhuge test[65535]; funktioniert
Danach sollte es möglich sein test wie gewünscht mit dem Linker zu
plazieren.
Thomas
Hallo, ja das funktioniert. Aber dann sucht der Linker die Adresse ja wieder selber raus, es liegt halt irgendwo im xhuge bereich, und ich will sie aber von hand angeben. habe es aber rausgefunden: atei namens Test.c anlegen In dieser eine variable definieren: <i>unsigned char huge Packet[65535];</i> Variable mit <i>extern</i> einbinden In den Linkereinstellungen folgendes eintragen: <i>?FD0?TEST(0xED0000-0xFEFFFF)</i> dann klappt es. Bis dann und danke für die Hilfe johannes
hallo, shit nein, meine obige lösung wird zwar compiliert, aber der Linker legt das dann doch nicht an diese Adresse, so ein schrott. Funktioniert doch nicht, auch wenn das im UsersGuide so steht. also, wer hat noch Lösungsvorschläge? Johannes
Hallo Johannes! Ich hatte vor Kurzem dasselbe Problem. Ich habe es so gelöst. Zuerst musst du in L166 Locate deine eigene Klasse angeben. Das hast du schon richtig gemacht. Danach musst du für die Variablen, die in dem angegebenen Speicherbereich sein sollen ein eigenes C-File erstellen. Es kann so aussehen. Z.B: #pragma RENAMECLASS (XDATA=MeineDaten) #pragma NOINIT unsigned char xhuge hallo; In diesem C-File benennst du die XDATA - Klasse auf die MeinDaten-Klasse, die du selbst angegeben hast, um. Dadurch werden alle Variablen, die du mit Xhuge in diesem einen C-File definierst in den angegebenen Speicherbereich geschoben. Um diese Variablen jedoch auch im Hauptprogramm nutzen zu können, muss du die Variable im Haupt-C-File als Globale Variable mit dem Wörtchen "extern" definieren. Z.B: extern unsigned char xhuge hallo; So hat es bei mir funktioniert. Wenn du es nicht hinbekommst schreib mir einfach wieder. Tschüss! Martin
Eine kurze Frage noch: Hattet ihr eigentlich bei eurem XC-Board Datenbücher dabei oder nicht? In meinem Paket waren nur CD's. Das Datasheet und die User-Manuals musste ich mir selbst ausdrucken. Das ist natürlich nicht gut, denn ein Buch ist viel besser zu handhaben als ein Ordner voller Ausdrucke. Danke für eure Antwort! Martin
Hallo Martin, bei meinem Board waren ebenfalls nur CD's dabei. Find ich auch ziemlich schwach, da ich noch ein Board von Motorola habe, beí dem sowohl CD's als auch Bücher dabei waren. Mfg Andreas
Bei mir waren auch nur CD's dabei. Habe es gar nicht ausgedruckt, komme mit so ausdrucken nicht zurecht. Als pdf kann man es am Bildschirm zwar auch nicht kompfortabel lesen, aber man knn wenigstens die "suchen" funktion benutzen! johannes
Ha Ha Ha Ha Ha! Entschuldigt meinen Lachanfall. Hallo Leute! Aber das ist noch gar nichts. Habt ihr euch schon mal die Schematics-Pläne angesehen. Und dann betrachtet euch mal die CAN-Einheit. Spätestens dort sieht man, dass mancher Entwickler kein Gehirn hatte. Also kurze Erklärung: Der XC167 hat einen Twin-Can. Also zwei Can-Schnittstellen. Wenn man z.B. eine Can-Schnittstelle initialisiert, dann hat man zu Beginn die Möglichkeit, diese auf bestimmte Portpins zu legen. Bei CAN-1 hat man beim Senden 4 Pins zur Auswahl und beim Empfangen 3. Bei CAN-2 hat man 3 Pins beim Senden und 3 beim Empfangen zur Auswahl. Und was haben die Entwickler gemacht? Alle diese lustigen Pins wurden miteinander verbunden. Was heißt das? Das heißt das es völlig wurst ist, welchen Pin man zum Empfangen oder Senden nimmt, da man die anderen sowieso dann nicht mehr verwenden darf. Sonst kommt es nämlich zu Kurzschlüssen und dann ist das teure Board leicht defekt. Auch im Manual habe ich keine Warnung gefunden. Ist anscheinend nicht so wichtig. Wenn man sich den Plan nochmal etwas genauer ansieht, kann man erkennen, dass P4.7 ein Empfangspin für CAN1 ist und gleichzeitig ein Sendepin für CAN2. Das heißt, dass man zwar zwei Can-Schnittstellen hat, man aber dadurch, dass die Pins miteinander großzügig verbunden sind, nur eine benutzen kann. Wenn man trotzdem beide benutzt, dann empfängt CAN-1 alle Daten, die von CAN-2 abgeschickt werden. Ich habe auch schon mal in die Atmel-Welt etwas reingeschnuppert, aber dort ist so ein Pfusch nie passiert. Murrai
Ist mir egal, mache nichts mit dem Can. Aber wenn ihr mal die Tabelle der Belegung des Pheripherals Stecker anschaut, und dann mal versucht dort was anzuschliesen, werdet ihr merken, das das überhaupt nicht passt. Tipp: Im Schaltplan ist es richtig Johannes
Hallo, Nunja, um vom lästern wieder weg zu kommen, mal noch eine Frage zum Speichermodel: Lass mein Programm im Flash laufen, so, und suche jetz internen Speicher und möglichst viel, also wohin mit den Daten?? Es würde jetzt mal den <i>Programm SRam</i> geben. Hätte ich mal 2kbyte. Und dann noch die eigentlich dazu gedachte <i>Data memory Area<i>, so und daraus werd ich nicht so richtig schlau. Also: ab 0x00 0000 External Memory ab 0x00 8000 <i>Reserved for Internal Data SRAM</i>, oder einmal steht auch <i>reserved for Data SRAM</i> (also nicht internal, was dann), dann steht mal <i>are used for the internal Data SRAM </i> so, nun meine Frage, ist der Speicherbereich jetzt nur reserviert, vieleicht für spätere verwendung oder ist da wirklich schon Speicher oder ??? ab 0x 00C000 <i> Data SRAM</i> oder <i> IRAM</i> Ok, da ist Speicher, juhu. Sicher? Hat das jetzt jemand schon getestet. Also, um mal zusammen zu fassen: Habe jetzt: 2kbyte Programm SRAM + 16kbyte(vieleicht oder auch nicht Data Sram) + 4kbyte Data SRAM= 22kByte. Stimmt das jetzt?? So, jetzt habe ich in euren Augen sicher viel falsches geschrieben, darum hoffe ich, jemand rechnet mir mal vor, wieviel Speicher ich wo jetzt tatsächlich intern habe. Ich blick auf jeden Fall nicht mehr durch. johannes
hallo, so, wollte mal eben das Programm Sram testen. Im Listing(*.m66) steht für mein Array nun folgendes: 0E0000H Packet VAR --- MEINEDATEN ?XD?PACKET und noch 0E0000H PUBLIC VAR --- --- Packet so, und jetzt ist doch 0E0000H die Startadress vom Programm SRAM oder nicht???????? Warum sehe ich dann ide zugriffe mit dem Logicanalyzer? Johannes
Hallo! @Murrai: Hei du hast ja recht. Das Problem besteht aber nicht nur wenn man das Can-Interface einsetzt, sondern auch dann, wenn man mehrere Ports gleichzeitig verwenden will. Wenn man z.B. P4.7 benutzt, dann darf man folgende Pins nicht mehr verwenden, da es sonst zum Kurzschluss kommt: P4.5, P9.1, P9.2, P7.5, P7.6... Das ist aber wirklich ein Witz. Woher soll man das wissen? @Johannes: Was meinst du für einen Pheripheral-Stecker? Kannst du mir das genauer erklären? Meinst du das Debugg-Interface? Oh. Das mit dem Ram ist so eine Sache. Also ich sag dir mal wie ich das verstanden habe. Man hat ab F600H ein SRAM von 2K. Dieser wird für den Stack verwendet. Man kann aber auch Daten hineinspeichern. Ab C000H beginnt ein SRAM von 4K. Dies war früher das XRAM. Es kann für Daten verwendet werden. Also hast du im Ganzen 6K für Daten. Dann gibt es noch ein weiteres SRAM. Dies beginnt ab E0’0000H und hat 2K. Es wird über dieselbe Einheit wie das Flash angesprochen. Es kann dafür verwendet werden, um Programme auszutesten. In diesem Ram läuft das Programm genauso schnell wie im Flash. Das was ab 8000h im Datenblatt steht, nämlich "Reserved for internal data sram" - damit ist gemeint, dass dieser Bereich reserviert ist. Nämlich für µC-Typen, die mehr Speicher haben (Für die Zukunft reserviert). Mit anderen Worten von 8000H bis BFFFH gibt es keinen Speicher. Es kann jedoch sein, dass es Typen geben wird, die dort einen Speicher haben. Dann ist einfach das XRAM größer. Deine letzte Frage verstehe ich nicht ganz. Warum soll E0000H die Startadresse für dein Programm sein? Möchtest du dein Programm dort hineinspielen und austesten? Oder wie? Dein Array ist in diesem Bereich. Tschüss! Martin
Servus Fedi, wenn du ein Problem hast dann melde dich doch gleich bei mir!!!!!
Hallo Martin, Pheripherals Stecker: Wenn du das Board vor die liegen hast, mit dem Spannungsversorgungsstecker links vorne, dann ist rechts vorne ein 80 Poliger Stecker: Pheripherals. Auf Seite 29 des *.pdf files XC16x Board ist eine Tabelle mit der Pinbelegung. Und diese stimmt überhaupt nicht. aber im schematic ist sie richtig. Das mit den RAMs, habe mir gedacht, dass ich in den eigentlich für Programme reservierten Speicher ab 0xE0 0000 mal Daten rein lege, müsste eigentlich gehen. Oben habe ich dann mal einen Auszug aus meinem Listing gemacht, damit ihr seht, das mein Array wirklich da ist. Und das Programm funktioniert auch, aber ich sehe die zugriffe mit dem Logikanalyzer auf dem externen Datenbus. Aber der Speicher ist intern. Johannes
Hallo Johannes! Sowas ähnliches kenne ich auch. Die Pinbelegung des Prozessors im Datasheet auf Seite 5 stimmt hoffentlich. In den Schematics-Plänen ist die Belegung nämlich eine völlig andere. Dies war auch schon beim alten C167. Eigenartig ... Kaum beginnt man über C167 oder XC167 zu sprechen, beginnt man nach kurzer Zeit auch über sie zu schimpfen. Martin.
Hi, das ist doch bei allen sachen so, man sieht nur das negative, über das positive unterhält man sich nie. und der XC hat sehr viele gute seiten(meine technische Innovationen) Johannes
Ja, du hast recht. Ich habe mal gehört, dass manche Menschen nur deshalb unglücklich sind, weil sie sich immer auf die negativen Dinge konzentrieren und diese versuchen wegzudrängen. Manche Dinge lassen sich aber nicht ändern. Oh, sind wir jetzt vom Thema abgewichen? Um mal was Positives zu sagen. Ich glaube, dass der XC167 einer der leistungsfähigsten 16-Bit Kontroller überhaupt ist. Wenn jemand einen noch besseren oder schnelleren 16-Bit Kontroller kennt, bin ich gerne bereit die Information zur Kenntnis zu nehmen. Martin
ja, und schau mal an was hier so gemeckert haben, wir schimpfen über die Koku, und das Board, aber der Controller selbst ist eigentlich nicht kritisiert worden.
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.