اطلاعیه

Collapse
No announcement yet.

مشکل با خواندن sreg در زبان c

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با خواندن sreg در زبان c

    من با برنامه کوتاه زیر رجیستر وضعیت یا sreg رو با زبان اسمبلی خوندم و روی پورت D نشون دادم .
    کد:
    ldi r17,0x0f
    ldi r18,0x01
    add r17,r18
    in r20,sreg
    ldi r21,0xff
    out ddrd,r21
    out portd,r20
    ولی همین برنامه رو که به شکل زیر وارد کدهای زبان C میکنم ارورهای زیر رو میده (از Atmel studio استفاده میکنم)
    کد:
    [LEFT]asm("LDI r17,0x0f");
        asm("ldi r18,0x01");
        asm("add r17,r18");
        asm("in r20,sreg");
        asm("ldi r21,0xff");
        asm("out ddrd,r21");
        asm("out PORTD,r20")[/LEFT]
    Error recipe for target 'test0.elf' failedtest0
    Error undefined reference to `sreg'test0
    Error undefined reference to `ddrd'test0
    Error undefined reference to `PORTD'test0







    ;

    #2
    پاسخ : مشکل با خواندن sreg در زبان c

    خودم راه حلشو پیدا کردم باید از طریق پوینترها اینکارو انجام بدیم و ضمنا در دستورات اسمبلی باید آدرس رجیسترها رو استفاده کنیم
    مثلا این برنامه به خوبی کار میکنه :
    کد:
    #include <avr/io.h>
    
    int main(void)
    {
        unsigned char *i;
        i=(unsigned char*)0x200;
        
        asm ("LDI r17,0xff");
        asm ("LDI r18,0x01");
        asm ("add r17,r18");
        asm ("in r20,__SREG__");
        asm ("LDI r21,0xff");
        asm ("out 0x11,r21");    
        asm ("STS 0x200,R20");
        
        PORTD=*i;    
        
    }
    البته من هنوز نفهمیدم برای نوشتن چند خط پشت سر هم اسمبلی در بین خطوط برنامه c از چه روشی باید استفاده کرد؟

    دیدگاه


      #3
      پاسخ : مشکل با خواندن sreg در زبان c

      خیلی خوبه که وقتی جواب سوالتو گرفتی اونو به اشتراک گذاشتی تا بقیه استفاده کنن.
      برای نوشتن چند دستور اسمبلی تو محیط C باید ازین روش استفاده کنی
      کد:
      #asm
      sbi  0x18,0
      nop
      cbi  0x18,0
      nop
      sbi  0x18,0
      nop
      cbi  0x18,0
      #endasm
      ضمنا بجای استفاده از پویینتر میتونی ادرس رجیستر رو بدی که ادرس رجیسترها تو دیتاشیت قسمت رجیسترها وجود داره.در واقع شما با دستور C همینکارو کردی
      جدیدترین ویرایش توسط saeiddiod; ۰۵:۲۰ ۱۳۹۷/۱۲/۱۰.

      دیدگاه

      لطفا صبر کنید...
      X