- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 2 von 2

Thema: AVR GCC inline Assembler

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184

    AVR GCC inline Assembler

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    Hi,

    ich hab's jetzt hingegriegt.

    Wer Interesse dran hat, kann sich gerne melden.

    gruß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen