Forum: Mikrocontroller und Digitale Elektronik AVR Atmega644 - grosse Sprünge im Flash


von Christoph (Gast)


Lesenswert?

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:
1
out  PORTD, r16
2
sbi   PORTB, 1
3
cbi      PORTB, 1
4
out      PORTD, r17
5
sbi   PORTB, 1
6
cbi    PORTB, 1
7
out      PORTD, r18
8
;...
9
out      PORTD, r23
10
sbi   PORTB, 1
11
cbi   PORTB, 1
12
ret

Vielen Dank für jede Hilfe,
Christoph

von Sascha W. (sascha-w)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von AVR-Fan (Gast)


Lesenswert?

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".)

von Thomas E. (thomase)


Lesenswert?

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.

von Christoph (Gast)


Lesenswert?

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.

von AVR-Fan (Gast)


Lesenswert?

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).

von spess53 (Gast)


Lesenswert?

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

von christoph (Gast)


Lesenswert?

Mit SP3 hab ich jetzt auch die m644def.inc zur Verfügung stehen und mein 
Projekt läuft jetzt.
Vielen Dank und Respekt!
Christoph

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.