Hallo alle AVR-Spezialisten.
Ich baue einen LED-Globus und sende meine Bilddaten dafür byteweise an
den PortD. Zuerst speichere ich 8 Bytes in 8 Registern, dann rufe ich
eine Funktion auf, welche die Daten nacheinander an den PortD schiebt.
1
ldi r16, 0b11100000
2
ldi r17, 0b11100000
3
ldi r18, 0b11100000
4
ldi r19, 0b11100000
5
ldi r20, 0b01100000
6
ldi r21, 0b01100000
7
ldi r22, 0b11000000
8
ldi r23, 0b11000000
9
rcall Schiebe8byte
10
ldi r16, 0b11000000
11
ldi r17, 0b11000000
12
ldi r18, 0b11000000
13
ldi r19, 0b11000000
14
ldi r20, 0b11000000
15
ldi r21, 0b11000100
16
ldi r22, 0b11000100
17
ldi r23, 0b11000100
18
rcall Schiebe8byte
Das Problem ist, nach ca 1000 Zeile Code, funktionieren die Spünge nicht
mehr. Jedenfalls sagt der Linker "undifinerte Sprungadresse". Ich werde
noch bestimmt 4000 Bytes ausgeben und muss einen Weg finden, in die
Funktion "Schiebe8byte" und wieder zurück zu springen.
Kann mir jemand helfen?
Hier noch die Schiebefunktion:
Schiebe8byte:
dann musst du call anstelle von rcall verwenden,
aber lege die Daten doch einfach Byteweise in den Flashspeicher und lade
sie per Schleife von dort und gib sie aus.
Sascha
Christoph schrieb:> Das Problem ist, nach ca 1000 Zeile Code, funktionieren die Spünge nicht> mehr. Jedenfalls sagt der Linker "undifinerte Sprungadresse".
Ein lcall (long call) könnte helfen...
Wenn du "nur" call hinschreibst, dann sollte sich der Assembler den
passenden Call aussuchen.
Versuche es mal mit "call" statt "rcall"
Könnte sein, daß das Sprungziel zu weit für den rcall
entfernt ist. (AVR-Studio Assembler mault dann zwar was von
"zu weit".)
Lothar Miller schrieb:> Ein lcall (long call) könnte helfen...
das ist kein "L" Call sondern ein "i" Call = indirect call.
Der geht über 4 MWords.
Ein "call" geht über 64K und ist für den 644 ausreichend.
"rcall" (4K) kann irgendwann zu kurz sein.
mfg.
Hallo und vielen Dank für die Hilfe. Mit call und jmp funktionieren die
Sprünge.
Da Sisy aber ab 1000 Zeilen code abstürzt, bin ich jetzt auf AVR Studio
umgestiegen. Mit dem Atmega32 funktioniert auch alles, ich habe nur
keine Bibliothek für den Atmega644.
Kann ich da mit
1
.include "m64def.inc"
arbeiten?
Unter "Tools"->"AVR Prog" lässt sich unter "divices" auch nur der
Atmega64 auswählen. Brennen klappt, prüfen klappt, aber der Controller
abreitet anschließend nicht in seiner Schaltung.
Im AVR-Studio 418 mit Servicepack 3 findest du alle!
m644xx.def Files die nötig sind.
Die Devices sind alle einstellbar und werden auch von
der Prog-Routine erkannt (ATMEGA644xx und STK500).
Hi
Der ATMega644 hat nichts mit dem ATMega64 zu tun. Sei froh, das du dur
die Fuses nicht versaut hast.
>ich habe nur keine Bibliothek für den Atmega644.
Im aktuellen AVR-Studio gibt es m644def.inc, m644adef.inc, m644defp.inc
und
m644defpa.inc. Und welchen hast du?
MfG Spess