PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR GCC inline Assembler



chientech
18.09.2009, 15:33
Hi,

im Datenblatt vom AT90CAN ist auf S.320 beschrieben wie man die FUSE bits per SW auslesen kann.
Außerdem hab ich dazu das hier

http://www.dragonsgate.net/pipermail/icc-avr/2006-August/007487.html

gefunden.

Leider sieht der Code im Disassembler Window (AVRstudio)
nicht richtig aus, es wird an entscheidender Stelle kein LPM verwendet.
Gehen tut's auch nicht :-k

Also wenn man ne idee hat woran es liegen kann, warum nicht ausprobieren ob mann's hin griegt. Ich hab mich mal mit inline Assembler probiert und RN-Wissen hat mir dabei geholfen.



U8 read_highFuses(void)
{
U8 sreg;
U8 data;
U16 addr = 0x0002; // bzw. 0x0000-0x0003

__asm volatile (
// SREG sichern
"LDS %0,0x005F" "\n\t"
// wait for eeprom write to finish
// while (EECR & BIT(EEWE)) {;}
"loop:" "\n\t"
"LDS R24,0x003F" "\n\t"
"CLR R25" "\n\t"
"ANDI R24,0x02" "\n\t"
"ANDI R25,0x00" "\n\t"
"SBIW R24,0x00" "\n\t"
"BREQ loopEnd" "\n\t"
"RJMP loop" "\n\t"
"loopEnd:" "\n\t"
// disable all interrupts
"CLI" "\n\t"
// setze Z-Pointer
// (schon gemacht mit INPUT)

// setze SPMCSR = BIT(BLBSET) | BIT(SPMEN);
"LDI R24,0x09" "\n\t"
"STS 0x0057,R24" "\n\t"
// Lade PROGRAMM Speicher (FUSES) -> R0
"LPM " "\n\t"
"MOV %1,R0" "\n\t"
// SREG zurücksetzen
"STS 0x005F,%0" "\n\t"
// enable all interrupts
"SEI" "\n\t"

: "r" (sreg)
:"&r" (data) // OUTPUT Inhalt der Speicherstelle
: "z" (addr) // INPUT Adresse
: "r24", "r25", "r0", "r17" // benutzte register

);
return data;
}


leider hat der Compiler was dagegen [-X

kann mir jemand weiterhelfen und sagen was ich in dem unteren Teil mit der Register-Übergabe an die inline Assembler routine falsch mache?

Wenn ich die Zeilen mit sreg weglasse und die Platzhalter anpasse (stattdessen R17 verwende) scheint es zu funktionieren.

Ich hätte es gern verstanden.

mfg
Christoph

chientech
26.09.2009, 16:39
Hi,

ich hab's jetzt hingegriegt.

Wer Interesse dran hat, kann sich gerne melden.

gruß