Hallo,
meine Idee ist, Daten im hinteren Teil des Programmspeichers eines
AVR-Controllers abzulegen.
D.h., im vorderen Speicher befindet sich das kompilierte
Bascom-Programm, welches auf die Daten im hinteren Speicherteil zugreift
(nur Auslesen).
Geht das und wenn ja, kann jemand ungefähr sagen, wie?
Wie kommen denn die Daten in den "hinteren" Speicherbereich? Ich Ram
gingen sie beim Ausschalten verloren. Wenn das ok ist, kannst Du den
Befehl "Data" verwenden. Wenn sie nicht verlorengehen sollen, speichere
im Eprom (deklarieren "AS Eram")
Hallo Hannes,
Danke für die Schlagworte!
Sorry, bin noch nicht dazu gekommen, sie in der Bascomhilfe
nachzuschlagen, habe sie aber schon notiert!!!
Nachschlagen folgt...
Hallo,
habe die Befehle unter Bascom nachgeschlagen und da kamen sie mir auch
gleich aus C64er-Zeiten wieder bekannt vor ;)
Habe dann auf die Schnelle auch gleich mal ausprobiert, wie viel Platz
eine Zahl (in dem Fall Byte) im Speicher frisst; anscheinend nur so
viel, wie sie auch gross ist.
Blöd ist nur, dass ich ca. 50kb Daten habe, bis die als Data-Zeilen
abgetippt sind, ist möglicherweise das Silizium-Zeitalter schon wieder
vorbei...
Davon ab müssen die Daten auch z.T. „mittendrin“ ausgelesen werden, weiß
jetzt gar nicht, ob das mit Data-Zeilen möglich ist.
Es gibt aber wohl noch eine Variante mit dem Inp(x)-Befehl, mit ihm kann
man anscheinend Adressen bis &HFFFF auslesen. Mit Peek(x) geht’s wohl
eher nicht, Tests aber bisher noch nicht vorgenommen.
Hat jemand einen Tip für einen freeware-Hex-Editor, mit dem man die
Daten an das kompilierte Bascom-Prog anhängen kann?
Viele Grüsse!
> Hat jemand einen Tip für einen freeware-Hex-Editor, mit dem man die> Daten an das kompilierte Bascom-Prog anhängen kann?
Wenn Du mit BASCOM werkelst, dann kannst Du ja BASIC. Was hindert Dich
daran, ein QBASIC- oder Visual-BASIC-Programm zu schreiben, dass Dir die
Data-Zeilen erstellt? Ich schreibe größere .db/.dw-Blöcke auch nicht von
Hand, da muss auch VB oder QB dran glauben und mir aus den gewünschten
Daten oder Funktionen eine fertige Include-Datei erstellen. ;-)
...
> Ich habe in einem ähnlichen Fall ein 24C512 als externen Speicher> benutzt.
Das ist sicher nicht immer nötig. Wenn die Daten (Konstanten, z.B.
Zeichensatz, Soundstream, Tabellen) ins Flash reinpassen, dann gibt es
keinen Grund, ein externes EEPROM zu benutzen.
So füllt z.B. eine Schrankensteuerung (2 verschiedene Blinker, 2 Servos
als Antriebe, Soundausgabe der Glockenschläge) einen Mega8 den Flash zu
knapp 45% (incl. Sounddaten), es würde also sogar im Mega48 Platz
finden. Es ist allerdings in ASM, die Sounddaten werden in BASCOM aber
auch nicht größer.
...
Hallo,
Danke für die vielen Antworten!
Über den externen Speicher hatte ich auch schon nachgedacht, es müsste
aber eigentlich auch so gehen.
ASM ins Basic einzubauen wäre zu überlegen, wenn es anders nicht geht.
Bei den künstlichen Datazeilen wäre noch das Problem, dass die Daten
nicht am Stück ausgelesen werden, sondern immer nur Segmente benötigt
werden. Alleine von der Verwaltung her wären definierte
Speicheradressen wesentlich besser geeignet.
Der oben erwähnte INP(x)-Befehl (x= Adresse der auszulesenden
Speicherzelle) müsste irgendwie für meine Zwecke anwendbar sein... mit
ihm kann man auch externen Speicher auslesen. Allerdings ist mir nicht
ganz klar, wie man ihn initialisieren muss, damit der interne Speicher
ausgelesen werden kann.
Meine Versuche in diese Richtung haben bis jetzt jedenfalls keine
Früchte getragen. Die auf diese Weise ausgelesenen Speicherzellenwerte
stimmen nicht mit den tatsächlichen überein und besitzen meistens den
Wert &H00.
Weiß jemand, wie man den Bascom-Befehl INP(x) auf den internen
Programmspeicher (Flash ROM) anwendet?
> Bei den künstlichen Datazeilen wäre noch das Problem, dass die Daten> nicht am Stück ausgelesen werden, sondern immer nur Segmente benötigt> werden.
Ja wo ist dann Dein Problem?
Du kannst die DATA-Blöcke durch Labels trennen.
Du kannst RESTORE mit Label verwenden.
Somit hast Du die Möglichkeit, ohne Kenntnis der realen Adressen den
Lesezeiger auf den Anfang eines jeden Data-Blocks zu setzen.
...
Schau Dir mal die Beispiele für die GraphLCD an! Dort werden die Bilder
als Data in den Flash (nicht den EEPROM) compiliert. Habe ich selber
schon etliche male gemacht! Ohne dem wäre der EEPROM zu klein!
> Der oben erwähnte INP(x)-Befehl (x= Adresse der auszulesenden> Speicherzelle) müsste irgendwie für meine Zwecke anwendbar sein...
Nein, INP(x) entspricht dem LDS-Befehl, der kann nicht auf Flash
zugreifen, nur auf RAM.
Zu RAM gehört:
0-31: Register R0 bis R31 (gemappt)
32-95: I/O-Register 0-63 (gemappt)
96-Ramend: SRAM (erst intern, dan XMEM)
oder stattdessen:
96-255: Extended I/O-Register (nicht alle AVRs)
256-Ramend: SRAM (erst intern, dan XMEM)
Der Flash liegt in einem eigenen Adressraum und das EEPROM hat einen
weiteren eigenen Adressraum.
Vielleicht solltest Du Dich mal mit dem Unterschied zwischen v.Neumann-
und Harvard-Architektur vertraut machen. Dein C64 hat(te) v.Neumann-,
der AVR hat Harvard-Architektur.
...
Hallo Leute,
mal wieder Danke für die vielen Antworten!!!
Hier erst mal nur ganz kurz:
CPEEK(x) bringt auf jeden Fall schon mal sinnvollere Ergebnisse.
Allerdings stimmen die Adressen im Programmierfeld von Bascom nicht mit
den x-Werten bei CPEEK(x) überein, weis jemand etwas darüber?
(hatte leider noch keine Zeit, das näher zu beleuchten, anscheinend gibt
es eine Parallelverschiebung in der Adressierung der Speicherbytes)
Hat das möglicherweise mit der von Hannes erwähnten Harvard-Architektur
des AVRs zu tun?
Viele Grüsse und auch schon mal schönes Wochenende!
Alle Zugriffe auf Flash erfolgen über den Z-Pointer und LPM. Wie diese
Zugriffe funktionieren, ist im Datenblatt bei der Speicherbeschreibung
mit Text und Grafiken erklärt. Wie eine Hochsprache (wie BASCOM) den
Befehl LPM nutzt, weiß ich nicht, ich bevorzuge die direkte Art, der AVR
auch, er kann kei BASIC.
Du wirst also die von BASCOM angebotenen Konzepte näher analysieren
müssen.
Um das besser geeignete Konzept auswählen zu können, müsste man erstmal
wissen, wie Deine Flash-Zugriffe aussehen. Denn da gibt es ja auch
unterschiedliche Ansprüche. Z.B. (nicht vollständig):
- Es soll ein Soundstream im festen Zeitraster an einen Port
ausgegeben werden (alle x µs das nächste Byte, Restore/Read)
- Es soll aus einem Zeichensatz das dem ASCII-Wert zugehörige Bitmuster
ermittelt werden (Zugriff über Index)
- Es soll zu einem Funktionsargument ein Rückgabewert ermittelt werden
(Lookup-Tabelle)
Beim flüchigen Ansehen der BASCOM-Hilfe sind mir READ, CPEEK und LOOKUP
mit entsprechenden Varianten (z.B. für Strings) aufgefallen. Genauer
will ich da aber nicht einsteigen, ich bevorzuge die direkte,
unmissverständliche Programmierung in ASM. Da muss ich nicht 27 mal um
die Ecke denken.
...
@Hannes, würde Jens verstehen was Du sagst, würde er nicht über 3 Foren
crossposten, in dem ihm wieder jeder das selbe sagt, das MCS Forum, das
Bascom Forum und hier, nimm CPeek !
Das ist laut Bascom Hilfe dafür vorgesehen, hab's doch auch bereits
geschrieben, Loadlabel und CPeek. Loadlabel liefert bei Übergabe des
entsprechenden Datalabels eine Wordadresse, die man CPeek übergibt,
welche einem dann das entsprechende Byte an dieser Adresse ausgibt.
CPeek macht nichts anderes als daß es die Wordadresse in das Z-Register
lädt und LPM aufruft.
Aber Jens ist recht lern- und verständnisresistent.
> CPeek macht nichts anderes als daß es die Wordadresse in das Z-Register> lädt und LPM aufruft.
Aha, dann kann man also zwischen LOADLABEL() und CPEEK() noch einen
Index zur Basisadresse addieren um Lookup-Zugriffe zu erreichen.
> das MCS Forum, das Bascom Forum und hier
Aha, das wusste ich nicht, ich besuche die anderen genannten Foren
nicht.
Ääähhh, nein, ich bin kein BASIC-Muffel, Commodore Plus/4 (C16) und PC
programmier(t)e ich in BASIC. Beim AVR empfinde ich ASM aber als
einfacher. Das hat vermutlich damit zu tun, dass meine ersten AVRs kein
SRAM hatten und ich von der Existenz von BASCOM damals auch nichts
wusste. Aber das ist gut so, in ASM bin ich flexibler. ;-)
...
Ja, genau, man kann durch zuaddieren eines Index auf die Wordadresse
einen freien Zugriff auf die Data Anweisungen aufbauen, und muss nicht
die sequentielle Read Anweisung verwenden.
Ist ja auch kein Problem, nicht jeder mag's, manche hassen es. Ich
schätze Bascom um ein paar Sachen einfach zu programmieren. Man muss das
ganze Config-Zeugs auch nicht mitmachen, sondern kann die AVR Register
über die normalen Namen konfigurieren und ansprechen, was mir persönlich
lieber ist.
Kritische Sachen mach' ich in Assembler, das lässt sich hervorragend in
den Basic Code integrieren. Es fehlen mir nur ab und zu die Pointer von
C, das wär schon manchmal praktisch.
Aber ich hatte mal einen Temperatursensor, glaube es war ein DS1820, in
C implementiert, das war vielleicht ein Mist. Da ist Bascom wirklich
bequem.
Wenn mich interessiert, was Bascom so macht und wie sauber das Compilat
ist, lad' ich das Obj File in's AVR Studio und ruf mir den Disassembler
auf.
Und wenn man nicht versteht, wie die Register des MC zu verwenden sind,
hilft einem auch C nix...
> Und wenn man nicht versteht, wie die Register des MC zu verwenden sind,> hilft einem auch C nix...
Das Verständnis der Architektur (Register, Maschinen-Befehlssatz,
Adressbereiche, I/O-Features) ist in jeder Programmiersprache ein
unschätzbarer Vorteil (bezogen auf kleine Mikrocontroller, nicht auf PC,
wo die Ressourcen generell verschwendet werden).
...
Probier doch mal folgendes:
Definiere eine Stringvariable der gewünschten Länge. Mit dem
Bascombefehl
LOADADR var , reg ermittelst du die Adresse und los geht es (in ASM).
Hallo,
nach einem turbulenten Wochenende und einem ebensolchen Wochenstart will
ich noch mal kurz den Faden aufnehmen und mich für eure aktive Hilfe
bedanken!
Dieser Dank geht hier auch ganz besonders an Hannes!
Der Befehl CPEEK(x) ist, wie sich nach eingehender Prüfung gezeigt hat,
genau das, was ich gesucht habe! Ich denke mal, dass jetzt alles weitere
gelingen müsste, ansonsten melde ich mich noch mal.
Für die Zukunft würde ich gerne auch ein paar kleinere AVR-Projekte in
ASM bewältigen. Wenn jemand hier an dieser Stelle mit ein paar Tipps
weiterhelfen kann und möchte (Buchempfehlungen, links etc.), bin ich
sehr verbunden! Werde hierzu aber auch noch im einzelnen die Forensuche
frequentieren.
Also viele Grüsse und viel Spass beim Arbeiten und Basteln weiterhin!