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://<br /> <a href="http://www.d...html</a><br />
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

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.

Code:
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