logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][AVRgcc]wskazniki zle wskazuja,asm

02 Sty 2011 16:07 1164 4
REKLAMA
  • #1 8947465
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 8947582
    tmf
    VIP Zasłużony dla elektroda
    Instrukcja LPM zawsze używa rejestru Z jako rejestru adresowego, Ponieważ jego wartości nie zmieniasz, więc dwa razy odczytujesz spod tego samego adresu. Swoją drogą po co ta wstawka?
  • REKLAMA
  • REKLAMA
  • #4 8951660
    Konto nie istnieje
    Konto nie istnieje  
  • #5 8953600
    Andrzej__S
    Poziom 28  
    Zupełnie niepotrzebnie kombinujesz z tymi wskaźnikami. Poza tym, jak już napisał kolega tmf źle wczytujesz dane z FLASH, bo przed instrukcją lpm należy do rejestru z załadować wskaźnik do właściwej lokalizacji w pamięci programu. Spróbuj na przykład tak:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <avr/pgmspace.h>
    
    prog_char a[3] = {'1','2','3'};
    prog_char b[3] = {'5','6','7'};
    
    int main(void)
    {
    	asm(
    			"ldi r30, lo8(%[ptr])   \n\t" \
    			"ldi r31, hi8(%[ptr])   \n\t" \
    			"lpm r22, z             \n\t" \
    			"ldi r30, lo8(%[ptr1])  \n\t" \
    			"ldi r31, hi8(%[ptr1])  \n\t" \
    			"lpm r23, z             \n\t" :
    			:
    			[ptr]  "p" (a),
    			[ptr1] "p" (b+1)
    		);
    	while(1){};
    }
    
    

    Ten kod wczytuje do r22 element a[0] ('1'), a do r23 element b[1] ('6').
REKLAMA