Forum: Mikrocontroller und Digitale Elektronik ATMega8 und call


von Stevko (Gast)


Lesenswert?

Hallo liebe Gemeinde,

ich habe wieder mal ein spezielles Problem.

Umgebung:
   ATMega 8-16MHz
   AVR-Studio 4.07
   AVRASM(Hilfe) 1.56
   Programmiersprache: ASM

Bei dem Programm für ein Belichtungsgerät bin ich bei ca. 3k
Quellcode.
Somit fuktionieren manche RCALL-Aufrufe nicht mehr. Bekannte
Fehlermeldung: "Außerhalb der Reichweite". Ist ja auch klar, da RCALL
nur +/- 2k adressieren kann. Im Datenblatt vom Mega ist nur der Befehl
RCALL aufgeführt. Aber in der AVRASM(Hilfe) wird der Befehl CALL
angeblich beim Mega8 unterstützt. Also habe ich die RCALL mit CALL
ausgetauscht, was mir eine Unmenge übler Beschimpfungen(ca 100) vom
AVR-Studio einbrachte: "Call will not supported". Da aber die
*.hex-Datei trotzdem funktioniert, habe ich das Programm weiter
ausgebaut. Nur sind die "Fehlermeldungen" nervig und eigentlich
sollte doch der Aufruf einer Unterroutine den ganzen Flash erreichen.

Jetzt meine Frage:

Unterstützt der Mega8 den Befehl Call obwohl er im Datenblatt nicht
aufgeführt ist?
Wird vielleicht bei neueren Mega8 nur Call unterstützt und mein
AVR-Studio + Datenblatt sind zu alt?

Achso, "Wrap relative Jump" bringt keine Änderung.

Gruß
  Stevko

von johnny.m (Gast)


Lesenswert?

Bei bis zu 8 k Programmspeicher brauchste keinen call. Da reicht rcall.
Das sind keine +-2kB sondern +-2kWords, also +-4kB! ATMega 8 hat 8 kB
Flash, also mit nem rcall sollte es eigentlich funktionieren! Wenn
nicht, dann ist irgendwo was falsch konfiguriert.

von johnny.m (Gast)


Lesenswert?

Noch was zur Förderung des Verständnisses: Der rcall-Befehl kann +-4kB
ansprechen. D.h. bei Controllern mit bis zu 8 kB Flash size gibt es
keinen call (4kB nach vorne und 4 nach hinten macht 8 kB!). Wenn das
mit rcall nicht klappt, dann ist irgendwo in AVRStudio wahrscheinlich
der falsche Controllertyp eingestellt (also einer mit 16 oder mehr kB
Flash). Mal bei Configuration Options nachsehen. Kleiner Tip: Im
Datenblatt des Controllers steht hinten immer ein Instruction Set
Summary drin. Da steht auch, welche Befehle für den Controller
überhaupt zur Verfügung stehen.

von Stevko (Gast)


Lesenswert?

Hallo jonny.m,

Du verwirrst mich etwas.

1) In meinem Datenblatt ist im "Instruction Set
Summary" kein! CALL aufgeführt, wurde aber von mir schon beschrieben.

2) Das RCALL welches angemeckert wurde,!und nur dieses!, habe ich durch
CALL ersetzt und das Programm lief. Erst später wegen der wachsenden
Programmgröße wurden alle RCALLs ausgetauscht.

3) Bereich 4kByte:
Ok bei 675Byte rufe ich eine Routine mit RCALL auf dessen Adresse bei
6700Byte liegt. Wie wird dies geregelt?

4) Es ist definitiv der Mega8 mit 2MHz eingestellt und nicht der
Mega32, welcher mein Liebling ist.

Bitte jonny.m kläre mich auf.

von johnny.m (Gast)


Lesenswert?

zu 1) Genau, es ist kein call aufgeführt. Es geht also im Prinzip nur
rcall!

zu 2) Warum AVRStudio dann meckert, kann ich so direkt nicht
nachvollziehen.

zu 3) 8192 Bytes-6700Bytes = 1492Bytes
      1492Bytes + 675Bytes = 2167Bytes
Der Programmzähler zählt ja zyklisch. Bei einem Overflow oder Underrun
zählt er ja trotzdem weiter, in dem Fall von 675 rückwärts bis auf null
und dann von 8192 bis 6700. Macht 2167 Bytes. Und das ist weniger als
4kBytes!

zu 4) Ich kanns mir so nicht erklären. Und wenn alles korrekt
konfiguriert ist, weiß ich auch nicht weiter

von crazy horse (Gast)


Lesenswert?

es gibt keine Adresse 6700 (=0x1A2C). Die höchste
Programmspeicheradresse ist 0xfff=4095dez.
Die Programmspeichergrösse ist in kB (8bit)angegeben, der Speicher aber
16bit breit. Mit der Folge, dass es eben nicht 8192 Adressen gibt,
sondern nur 4096. Und dafür braucht es nur eine 12bit-Adresse, und die
passt in den rcall-Befehl.
Fest steht, Typen die nur rcall/rjmp haben, erreichen damit ihren
gesamten Programmspeicher. Und die Grenze liegt eben genau bei 8kB.
Grössere bieten zwar auch den rcall/rjmp, da damit aber nicht der
gesamte Speicher direkt erreibar ist, gibt es zusätzlich die
call/jmp-Befehle.

von johnny.m (Gast)


Lesenswert?

Sorry, sind natürlich KBytes und nicht kBytes!

von Stevko (Gast)


Lesenswert?

@jonny.m & @crazy horse

Danke für die Aufklärung. Das mit dem zyklischem Programmspeicher habe
ich völlig außer Acht gelassen, sorry. Nach Eurer Erklärung verstehe
ich zwar warum RCALL ausreicht, aber nicht weshalb bei mir
Fehlermeldungen produziert wurden. Wie gesagt, ich habe nur das RCALL
gegen CALL ausgetauscht und und nicht den Namen des Sprungzieles
verändert.
Habe hier auf Arbeit das neuste AVR-Studio installiert und ein kleines
DummyProgramm geschrieben, natürlich mit CALL. Mit dieser Version
erscheint die gelbe Fehlermeldung: "Call will not supported"
überhaupt nicht! Bin mir gar nicht mehr so sicher, ob ich zu Hause
wirklich Version 4.07 habe, sondern eine eher eine etwas ältere.

Werde heute Abend(falls genügend Zeit) zu Hause wieder alle CALL gegen
RCALL austauschen und wo er meckert die Spungadressen notieren.
Mehr fällt mir auch nicht ein.

Gruß
  Stevko

von Conlost (Gast)


Lesenswert?

Hallo,

die neueste Version vom Studio lautet 4.12,
eventuell mal updaten.

Es grüsst,
Arno

von Stevko (Gast)


Lesenswert?

ok, ich bin wahrscheinlich verflucht!

Habe gestern Abend alle CALL gegen RCALL ausgetauscht und es kam keine
Fehlermeldung mehr! Na das hat mich schon gewundert, zumal ich das
Programm ja noch erweitert habe.
Aber, als der oben genannte Effekt auftrat habe ich natürlich eine
Sicherungskopie vom Projekt erstellt. Also das Backupprojekt ins
AVR-Studio und das einzigste CALL wieder durch RCALL ersetzt. Das
Projekt war somit im selben Zustand wie Montagabend, als mich die
Fehlermeldung: "RCALL außerhalb der Reichweite" mich fast in den
Wahnsinn getrieben hatte. Und siehe da, es kam keine Fehlermeldung
mehr! Der einzigste Unterschied zu Montagabend war der Neustart des
Rechners.

Danke an Alle die geholfen haben.

Gruß
  Stevko

von Karl H. (kbuchegg)


Lesenswert?

:-)
Willkommen im Club.

Der nächste Zeitpunkt an dem ein solcher oder ähnlicher
Effekt zu erwarten ist, ist wenn Du das Projekt das erste
mal dem Kunden zeigst. Stichwort: "Hmm, ich versteh das nicht.
Gestern gings noch".

von Hannes L. (hannes)


Lesenswert?

> war der Neustart des
> Rechners.

Das kann ich bestätigen. AVR-Studio (besonders mit aufgerufenem
Simulator) reagiert manchmal merkwürdig. Zum Speichern reicht es aber
meist noch. Nach einem Neustart ist alles wieder ok.

Es laufen aber neben AVR-Studio meist noch Speedcommander, PDF-Reader
mit Datenblatt, Mailprogramm, Browser, DOS-Box mit ISP-Programmer...

...

von Stevko (Gast)


Lesenswert?

@Karl Heinz:

naja im Club bin ich eigentlich schon, aber in einer anderen Sparte ->
Datenbanken für PC. Meine "Absicherung" gegen den Oha-Effekt sind 6
schaltbare Platten, wie Platte_1 nur für Programmierung, Platte_2 für
persönliche Dinge, Platte_3 für Linux,..., Datenplatte, Testplatte!
Auf der Testplatte installiere ich (fast)die gleiche Software wie der
Kunde, installiere dann meine Datenbank und teste.

@HanneS:
Das AVR-Studio läuft bei mir z.Z. auf einer separaten Platte, wo nur
Win_98 und Mini-Office installiert ist. Aber auch da kommt es manchmal
zu unerklärlichen Phänomenen. Was mir aufgefallen ist: AVR-Sudio +
AVRASM(Hilfe) und AVR-Sudio-Simulator in der Startphase. Simulator 3-5x
benutzt dann hängt sich das AVR-Studio auf, aber es wird wenigstens noch
gespeichert. Das gleiche ohne AVRASM(Hilfe) im Hintergrund kann ich den
Simulator beliebig oft starten, es gibt keine Probleme. Aber solange es
nur diese Kleinigkeiten sind will ich nicht klagen, bis auf das
verfluchte RCALL-Problem. :-)

Gruß
  Stevko

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.