K.L Piecuch
Guest
Thu Dec 28, 2006 6:41 pm
Witam!!
Mam krótkie pytanko ;-)
Chcę sobie skompilować źródła ze strony :
http://www.myplace.nu/avr/minidds/minidds.asm
w avr-gcc mniej więcej tak (jak podaje autor programu):
avr-gcc -mmcu=at90s2313 -x assembler-with-cpp minidds.asm
i otrzymuję:
minidds.asm:169: Error: number must be less than 64
w <avr/io2313.h> jest RAMEND zadeklarowany jako 0xdf,
a najwyraźniej o tę linijkę mu chodzi.
W pliku zamieniłem includa na <avr/io.h>.
Piszę przeważnie tylko w C, a tu nie za bardzo wiem czego się czepić ;-(
--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******
Zbych
Guest
Thu Dec 28, 2006 6:41 pm
K.L Piecuch przemówił ludzkim głosem:
Quote:
i otrzymuję:
minidds.asm:169: Error: number must be less than 64
w <avr/io2313.h> jest RAMEND zadeklarowany jako 0xdf,
a najwyraźniej o tę linijkę mu chodzi.
W pliku zamieniłem includa na <avr/io.h>.
Może mój edytor jakoś inaczej liczy linie, ale błąd jest chyba w tej linii:
out SPL, r16 ; setup stack pointer
więc zacznij od sprawdzenia, czy definicje rejestrów w pliku *.h nie są
przesunięte o 20h, i czy nie powinieneś użyć makra _SFR_IO_ADDR do
konwersji pomiędzy adresami SFR, a adresami mapowanymi na RAM.
K.L Piecuch
Guest
Thu Dec 28, 2006 7:41 pm
Dnia 28.12.2006 Zbych <abuse@onet.pl> napisał/a:
Quote:
Może mój edytor jakoś inaczej liczy linie, ale błąd jest chyba w tej linii:
out SPL, r16 ; setup stack pointer
więc zacznij od sprawdzenia, czy definicje rejestrów w pliku *.h nie są
przesunięte o 20h, i czy nie powinieneś użyć makra _SFR_IO_ADDR do
konwersji pomiędzy adresami SFR, a adresami mapowanymi na RAM.
Mój tak samo liczy

, ale stwierdziłem, że skoro linijkę wcześniej jest
ładowana wartość do r16 to pewnie o nią chodzi.
W <avr/io.h> jest
#define SPL _SFR_IO8(0x3D)
i to się zgadza z dokumentacją.
--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******
Zbych
Guest
Thu Dec 28, 2006 8:41 pm
K.L Piecuch przemówił ludzkim głosem:
Quote:
W <avr/io.h> jest
#define SPL _SFR_IO8(0x3D)
i to się zgadza z dokumentacją.
A sprawdziłeś jak jest zdefiniowane makro _SFR_IO8 ?
W sfr_defs.h masz coś takiego:
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Więc jeśli __SFR_OFFSET jest równe 20h, to adres SPL wyjdzie poza zakres
I/O. Przejrzyj dokładnie sfr_defs.h tam masz wszystko opisane.
If _SFR_ASM_COMPAT is not defined, C programs can use names like PORTA
directly in C expressions (also on the left side of assignment perators)
and GCC will do the right thing (use short I/O instructions if
possible). The __SFR_OFFSET definition is not used in any way in this case.
Define _SFR_ASM_COMPAT as 1 to make these names work as simple
constants (addresses of the I/O registers). This is necessary when
included in preprocessed assembler (*.S) source files, so it is done
automatically if __ASSEMBLER__ is defined. By default, all addresses are
defined as if they were memory addresses (used in lds/sts instructions).
To use these addresses in in/out instructions, you must subtract 0x20
from them.
K.L Piecuch
Guest
Thu Dec 28, 2006 9:41 pm
Dnia 28.12.2006 Zbych <abuse@onet.pl> napisał/a:
Quote:
A sprawdziłeś jak jest zdefiniowane makro _SFR_IO8 ?
W sfr_defs.h masz coś takiego:
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Więc jeśli __SFR_OFFSET jest równe 20h, to adres SPL wyjdzie poza zakres
I/O. Przejrzyj dokładnie sfr_defs.h tam masz wszystko opisane.
Dziękuję. Pomogło.
--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******