Forum: Mikrocontroller und Digitale Elektronik Bankumschaltung beim 8051


von Michael Wicki (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ihr,

Habe ein Mikrokontrollermodul der Phytec mM-552 mit dem Philips
80c552.
Dieser verfügt über 512kB Flash à 8 bänken (64kB) Bank 0 ist für die
Phytec FlashTools98 belegt.
Entwicklungsumgebung Keil uVision2 V2.05  mit:
C51: V6.01
A51: V6.01
BL51: V4.01
LIB51: V4.12
OH51: V.2.41

Habe auch ein Beispielprogramm zur Bankumschaltung, aber werde aus dem
nicht ganz schlau und es stürtzt auch nach einigen Umschaltungen ab.
Bei uns im Geschäft hat leider niemand mehr ahnung von Intel... da bei
uns nur Motorola verwendet wird...

Falls Jemand Erfahrungen hat, und mir Tipps oder Ratschläge zur
Konfiguration in Keil und Allgemein geben könnte wäre ich sehr froh!

Falls mir jemand helfen kann, aber noch weitere Infos braucht, bin ab
morgen wider im Geschäft.

Vielen Dank im Voraus,

Michael Wicki

von Peter Dannegger (Gast)


Lesenswert?

Ich denke mal, Du mußt schon ne ganze Weile (>1Jahr) programmieren, ehe
Du überhaupt in die Verlegenheit kommen kannst, eine Bankumschaltung zu
benötigen.

Ich habe noch nie die 64kB erreicht, mein größtes Programm ist nur 40kB
groß.

Ich weiß daher nur, daß es sehr tricky ist und man dann besser ICs
nehmen sollte, die direkt >64kB adressieren können, z.B. der P89C669
ist ein 8051-Derivat mit 23Bit-Programmcounter (96kB Flash intern).


Die Bankumschaltung kann jedenfalls nur funktionieren, wenn sämtliche
Interrupthandler und natürlich die Umschaltroutine in jeder Bank an der
gleichen Stelle stehen.

Genaueres muß aber in dem Manual zu Deinem Testboard stehen.
Kannst Du kein Manual besorgen, dann hilft nur das Board
wegzuschmeißen. Es gibt nämlich sehr viele Versionen einer
Bankumschaltung und man muß ja auch dem Linker sagen, welche man
benutzt.


Peter

von Michael Wicki (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Peter,

Na ganz ein Jahr habe ich daran schon nicht Programmiert aber es sind
schon mehrere 100 Stunden. Das Ganze ist für ein I2C Terminal mit
Display welches unter anderem als RS232-Terminal arbeitet. Es dient zur
Parametrisierung von einem unseren Geräten, und jetzt sollte noch ein
weiteres dazu kommen, daher kann ich jetzt nicht mehr innerhalb 3
Wochen einen neuen uP Validieren und allenfals die Software
umschreiben... also bin ich Wohl oder Übel gezwungen die
Bankumschaltung zum laufen zu bringen...

Habe jetzt den Hersteller noch nach genäueren Infos angefragt, aber so
wie ich die kenne kommt zurück, im Datenblatt sei alles genäustens
beschrieben, wohl möglich und ich verstehe einfach noch zu wenig von
der ganzen Struktur der Prozessoren.

Das mit dem Interrupt handling und so habe ich bis jetzt so verstanden,
das ein COMMON Bereich bestimmt wird (z.B. 0x0000 - 0x7FFF, siehe auch
Bild), welcher in jedem Bank vorhanden ist. Von da aus kann dann in die
verschiedenen Bänke gesprungen werden.

Trotzdem danke ich dir für die schnelle Antwort!

Grüsse aus der Schweiz,
Michael Wicki

von Peter Dannegger (Gast)


Lesenswert?

Wenn Du wirklich über 64kB sein solltest:

- Hast Du den C51-Primer gelesen, da sind viele Programmiertips drin,
um effizient zu programmieren (Small-Model, memory specific pointer,
möglichst wenig globale, Variablen, wenig signed ints, wenig floats
usw.).


- Hast Du Spaghetticode geschrieben (Copy&Paste-Methode) oder versucht,
gleichartige Sachen in Unterfunktionen zusammen zu fassen.


- Hast Du mal ins *.map-File gesehen, wo überhaupt die Speicherfresser
liegen (kannst ja mal das *.map-File als Dateianhang reinstellen).


- Hast Du viele konstante Daten (Menütexte usw.), dann könnte man die
in einen externen EEPROM (24C512) auslagern.


Ich hab irgendwo noch ein C505-Board rumliegen. Da ist ein großer CPLD
(SMD) drauf, der die Bankumschaltung macht. Mal sehen, ob ich das
Manual dazu finde.


Peter

von Michael Wicki (Gast)


Lesenswert?

Hast du Keil, dann kann ich dir schnell das Projekt schicken, wenn du
mir deine Mail-Adresse gibst

Gruss Michi

von Peter Dannegger (Gast)


Lesenswert?

danni(at)specs.de


Peter

von Michael Wicki (Gast)


Lesenswert?

die .lst files sind glaub nicht mehr so aktuell, must sie evt schnell
löschen und mit Keil frisch erstellen, kann sie dir sonst auch schnell
mailen

von BANKER (Gast)


Lesenswert?

1. Programm > 64k ist ganz normal, dazu muß man nicht ein Jahr
programmieren, das hängt eher von z.B. Visualisierungen auf dem Display
ab, Menüs in mehreren Sprachen, viele Funktionen des Geräts usw. Auser
eure Projekte bestehen darin ein paar LEDs blinken zu lassen ...
2. Ich verwende ebenfalls ein Phytec Board (80C517) mit Bankumschaltung
und habe kein Problem damit.
3. Stell einfach deinen Source ins Bord und dann sehen wir weiter...

von Peter Dannegger (Gast)


Lesenswert?

Keine Panik, laut Map-File sinds ja bisher nur 22kB und das trotz Large
Model.


Peter

von Michael Wicki (Gast)


Lesenswert?

Hallo Banker

Die Visualisierung ist nicht im uC integriert, das macht das Display
selbst, ich kommuniziere lediglich über RS233 mit dem uC zum Display
und zurück, trotzdem sind viele kleinere Komplexere Unterprogramme
implementiert, zb Datumseingabe mit Schaltjahrüberprüfung etc.
Zeiteingabe, (jeder Tastendruck des Touchscreen wird als Hex Wert über
RS232 erfasst und dementsprechend ausgewertet und verwendet)
verschiedene I2C Routinen... alles braucht seinen platz...

Habe jetzt einfach mal angefangen meinem Programm einzelne Bänke
zuzuweisen, läuft aber noch nicht so recht, aber ein wenig läufts doch
schon :) wird wohl ein haufen einzustellen geben mit dem ganzen
Speichermodel usw...

Fals ich dann wieder anstehe, werde ich dann gerne auf deine Hilfe
zurückgreifen!

Was ich auch noch nett fände, wenn du evt. ein kleines Demo-Progi mit
der Bankumschaltung hast, bei dem ich einige sachen abschauen könnte??

Meiner Ansicht nach ist das Problem des Phytec Demos, dass es in jedem
Bank in eine andere Funkion in einem anderen Bank, also immer eine
Ebene Tiefer springt, was schon bald zum Absturz beiträgt...

Für eure Infos vielen Dank!

Gruss Michi

von Peter Dannegger (Gast)


Lesenswert?

Wie gesagt, bei 22kB brauchst Du Dir doch noch lange keine Sorgen um das
Banking zu machen.

Es sei denn, Dein Programm soll noch viel viel größer werden (float lib
ist ja auch schon drin in den 22kB).


Peter

von Michael W. (apriliaracer)


Lesenswert?

Hallo Peter, mein Hex File ist aber 61.8 kB?!

von Peter Dannegger (Gast)


Lesenswert?

Ja, die Frage kommt hier etwa einmal pro Woche.

Als Faustformel: Bin = Intel-Hex / 2,8

62 / 2,8 = 22, haut also hin.


Peter

von David W. (Gast)


Lesenswert?

Meine iHex-Files sind mit nem Editor lesbar, d.h. sie sind in ASCII und
damit schon mal doppelt so groß ;) ("AB" braucht 2 Bytes anstatt 0ABh
= 1 Byte), dann noch Prüfsumme.

von Peter Dannegger (Gast)


Lesenswert?

Achso, was mir in Deinem M51-File noch aufgefallen ist, Dein Programm
wird umgeleitet nach 4000h, d.h. da ist noch eine Lücke von 16kB drin.
Das kannst noch ausschalten.


Peter

von Michael W. (apriliaracer)


Lesenswert?

Heisst das, wen Flash Tools angibt 61.8 kb das dies in wirklickeit noch
nicht erreicht ist??

von plitzi (Gast)


Lesenswert?

Wer wissen will, wie groß sein Programm wirlich ist, einfach mal nach
binär umwandeln. Tools dafür gibt es genügend (hex2bin o.ä.). Die
resultierende Dateigröße entspricht dann der Größe des belegten
Speichers.

Jörg

von Michael W. (apriliaracer)


Lesenswert?

Habe Jetzt mal so ein Hex File konvertiert, stimmt, sind tatsächlich nur
22kb, warum steht das blos nirgens in den manuals von phytec
geschrieben, ihr flash programm geht auch standarmässig auf hex files,
können in diesem Fall, die hex files grösser als 64 kB sein?

von Michael W. (apriliaracer)


Lesenswert?

an Banker,

Hast du eine kurze beschreibung was man beachten muss und was man
einstellen muss, damit die Bankumschaltung funktioniert, und was man im
Code einstellen muss, habe es bis jetzt geschafft, das der Linker mir 2
Hex files macht, für Bank 1 und Bank 2, der Commonbereich sollte der
Linker ja selbst definieren so wie ich das bei Keil gelesen habe, die
Programmteile die ich viel verwende sind jetzt einfach im Common
bereich

Wenn ich das Programm jetzt lade macht es mir zwar irgendetwas, aber
nach dem ausführen der ersten routine stürzt mir das Programm ab...?

Vielen Dank!

Gruss Michi

von BANKER (Gast)


Lesenswert?

Ja, habe ich. Ich muss die Seiten aber erst scannen. Ist aus dem Buch:
Praxis mit dem Keil C51-Compiler Teil 2 von Michael Baldischweiler. Ich
kann dir empfehlen beide Bücher zu kaufen, die sind extra-Klasse, da
steht wirklich ALLES drin was man zum 8051 Programmieren mit dem KEIL
Compiler benötigt.
ISBN 3-9804331-7-x Praxis mit dem Keil C51-Compiler Teil 2
und
ISBN 3-9804331-8-8 Der Keil C51-Compiler Einführung und Praxis Teil 1

Hier der Link dazu:
http://www.c51.de

von Michael W. (apriliaracer)


Lesenswert?

Vielen Dank für die Schnelle Antwort, auf diese Seite bin ich auch schon
des öfteren gestossen, Wenn ich nach meinem Armeedienst weiter mit
8051ern arbeiten werde, lege ich mir diese Bücher zu!
Wäre aber trotzdem sehr froh darüber wenn du mir die zutreffenden
Seiten bei gelegenheit schon mal einscannen könntest, das wäre sehr
nett!

Ich denke das XDATA Port Prinzip wird bei mir der Fall sein:
http://www.keil.com/support/man/docs/bl51/bl51_bk_example3.htm

Für deine Bemühungen danke ich vielmals!

Gruss Michi

von Simon K. (simon) Benutzerseite


Lesenswert?

In HEX FIles sind noch jede Menge andere Daten drin, außerdem werden die
Zeichen in ASCII Form geschrieben (1Byte pro Zeichen)

Ist also kein wunder dass die 64kb Datei größer ist....
Wurd aber schon gesagt

von BANKER (Gast)


Lesenswert?

Wenn du nicht schon alle Einstellungen in uVision2/3 vorgenommen hast,
hier eine meiner Batch Dateien:

@echo off
c51 main.c PP(main.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 lcd_T6963.c PP(lcd_T6963.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 lcd_420.c PP(lcd_420.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 graphic.c PP(graphic.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 class1.c PP(class1.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 functions1.c PP(functions1.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 functions2.c PP(functions2.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 functions3.c PP(functions3.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 functions4.c PP(functions4.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 functions5.c PP(functions5.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 measure.c PP(measure.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 keyboard.c PP(keyboard.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 menus.c PP(menus.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 configuration.c PP(configuration.LSI) DEBUG LARGE OT(6,Size)
DF(MONITOR)
c51 servicemode1.c PP(servicemode1.LSI) DEBUG LARGE OT(6,Size)
DF(MONITOR)
c51 servicemode2.c PP(servicemode2.LSI) DEBUG LARGE OT(6,Size)
DF(MONITOR)
c51 settings.c PP(settings.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 Icon1.c PP(Icon1.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 Icon2.c PP(Icon2.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 Icon3.c PP(Icon3.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 Icon4.c PP(Icon3.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)
c51 i240x128.c PP(i240x128.LSI) DEBUG LARGE OT(6,Size) DF(MONITOR)

a51 startup.a51 DEBUG
a51 l51_bank.a51 DEBUG

ECHO COMMON{startup.obj,l51_bank.obj,lcd_T6963.obj,class1.obj, & >
main.l51
ECHO keyboard.obj}, & >> main.l51
ECHO B1{menus.obj,main.obj,functions1.obj}, & >> main.l51
ECHO
B2{graphic.obj,Icon1.obj,Icon2.obj,Icon3.obj,i240x128.obj,functions2.obj 
},
& >> main.l51
ECHO B3{measure.obj,functions3.obj}, & >> main.l51
ECHO B4{configuration.obj,servicemode1.obj}, & >> main.l51
ECHO B5{functions4.obj}, & >> main.l51
ECHO B6{functions5.obj, servicemode2.obj} & >> main.l51
ECHO to output NOOVERLAY RS(256) & >> main.l51
ECHO BANKAREA(02000H,0FFFFH) XD(0000H) & >> main.l51
ECHO CODE(0100H,?STARTUP_START(0000H)) >> main.l51
bl51 @main.l51
oc51 output

oh51 output.b01
copy output.hex bank1.hex

oh51 output.b02
copy output.hex bank2.hex

oh51 output.b03
copy output.hex bank3.hex

oh51 output.b04
copy output.hex bank4.hex

oh51 output.b05
copy output.hex bank5.hex

oh51 output.b06
copy output.hex bank6.hex

von Michael W. (apriliaracer)


Lesenswert?

Hallo Banker,

Diese Batch-Datei sagt mir jetzt nicht so viel, ich denke, das macht
Keil von selbst, denn die hex files kommen bei mir als .h01, .h02 usw
heraus, welche ich dan in hex1.hex, hex2.hex usw umbenenne.

Im moment stehe ich bei den Target Einstellungen und bei den
Einstellungen im L51_BANK.A51 an.

Gruss Michi

von BANKER (Gast)


Angehängte Dateien:

Lesenswert?

... nu ja, so ganz automatisch machts auch der Keil (uVision) nicht, die
Einstellungen mußt du ja zuvor richtig durchführen, und da steckt sehr,
sehr, sehr wahrscheinlich auch der Wurm drin!

Aber:
Hier werden sie geholfen ;-)     (sieh dir mal den Anhang an)

von BANKER (Gast)


Angehängte Dateien:

Lesenswert?

Ach ja, noch ein Tipp:

Ich mache es nach Möglichkeit so:

Hauptprogramm und alle dazu nötigen Funktionen in die erste Bank;
den z.B. Service Mode in die nächste Bank, das Konfigurations
(Parameter) Menü in die nächste Bank, also nach Möglichkeit so wenig
wie möglich zwischen den Bänken switchen...

Ach ja, die notwendigen A51 Dateien nicht vergessen (L51_bank.a51 und
Startup.a51)

von BANKER (Gast)


Lesenswert?

... und ??? Status?

von Michael W. (apriliaracer)


Lesenswert?

Hallo Banker,

Habe das Banking erst mal eingestellt, da ich das Programm bis ende
nächste woche fertig haben soll, und es ja jetzt trotzdem noch ohne das
Bankumschalten geht.
Ich werde mich aber nach, oder vieleicht auch während meinem
Armeedienst an meinem Evaluation board damit auseinander setzen!
(hab noch n Farb-LCD rumliegen...)

Für eure Hilfe danke ich vielmals, ist echt ein tolles Forum, wie
Banker so schön sagst, hier werden sie geholfen :D

Also dann, viele Grüsse!

M.Wicki

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.