реклама на сайте
подробности

 
 
> WinAvr бит установить?, Сбросить/установить бит.
UserM
сообщение May 7 2005, 20:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 26-02-05
Пользователь №: 2 909



Подскажите плз. Что делаю не правильно. Взял пример кода здесь:
http://www.ars.yet.ru/union/mk/mk06.html

Код
  int main(void)              
  {
   sbi (DDRD ,PD5);              
       while (1) {              
               cbi (PORTD,PD5);  
               delay_ms(500);  
               sbi (PORTD,PD5);  
               delay_ms(500);  
          }
  }

Но при компиляции возникает ошибка , что делаю не правильно?
Версия WinAVR - 20050214

Compiling: test.c
avr-gcc -c -mmcu=at90s4433 -I. -gstabs -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -MD -MP -MF .dep/test.o.d test.c -o test.o
test.c: In function `main':
test.c:31: warning: implicit declaration of function `sbi'
test.c:33: warning: implicit declaration of function `cbi'
test.c:38:5: warning: no newline at end of file

Linking: test.elf
avr-gcc -mmcu=at90s4433 -I. -gstabs -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.o -std=gnu99 -MD -MP -MF .dep/test.elf.d test.o --output test.elf -Wl,-Map=test.map,--cref -lm
test.o(.text+0x2e): In function `main':
test.c:31: undefined reference to `sbi'
test.o(.text+0x38):test.c:33: undefined reference to `cbi'
test.o(.text+0x48):test.c:35: undefined reference to `sbi'
make: *** [test.elf] Error 1
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
UserM
сообщение May 14 2005, 14:18
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 26-02-05
Пользователь №: 2 909



Добрый, день!
Подскажите плз. почему не правильно работает внутренний цикл, переменная outer1 уменьшается не на еденицу ,а на 32h !
Код
unsigned short outer1;
while (ms--)
    {    
    outer1 = 100;
    while (outer1)
 {
 outer1--;
 }
    }

Код дисассемблера
Цитата
24:            outer1 = 100;
+00000033:  E624        LDI    R18,0x64        Load immediate
+00000034:  E030        LDI    R19,0x00        Load immediate
27:              outer1--;
+00000035:  5322        SUBI    R18,0x32        Subtract immediate
---- No Source ------------------------------------------------------------------------------
+00000036:  4030        SBCI    R19,0x00        Subtract immediate with carry
+00000037:  F7E9        BRNE    PC-0x02          Branch if not equal
+00000038:  CFF5        RJMP    PC-0x000A        Relative jump
+00000039:  9508        RET                      Subroutine return


Если добавляю еще одну переменную тогда работает правильно.

Код
unsigned short outer1, k;
while (ms--)
{    
    outer1 = 100;
    while (outer1)
 {
 outer1--;
 k++;
 }
}


Цитата
24:            outer1 = 100;
+00000033:  E624        LDI    R18,0x64        Load immediate
+00000034:  E030        LDI    R19,0x00        Load immediate
27:              outer1--;
+00000035:  5021        SUBI    R18,0x01        Subtract immediate
+00000036:  4030        SBCI    R19,0x00        Subtract immediate with carry
28:              k++;
+00000037:  F7E9        BRNE    PC-0x02          Branch if not equal
---- No Source ------------------------------------------------------------------------------
+00000038:  CFF5        RJMP    PC-0x000A        Relative jump
+00000039:  9508        RET                      Subroutine return

Версия WinAVR - 20050214
Go to the top of the page
 
+Quote Post
UserM
сообщение May 14 2005, 18:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 26-02-05
Пользователь №: 2 909



Попробовал написать цикл for и тоже компилируется и работает не правильно.
Переменная должна увеличиваться с каждым шагом , а она уменьшается. sad.gif

Код
while (1) {              

unsigned short k;        
for(k=0; k<100; k++)
{
PORTD &= ~(1<<5);
PORTD |= (1<<5)
}
}

Цитата
--- test1.c --------------------------------------------------------------------------------------
17:          int main(void)              
18:          {
+0000002E:   E5CF        LDI     R28,0x5F         Load immediate
+0000002F:   E0D4        LDI     R29,0x04         Load immediate
+00000030:   BFDE        OUT     0x3E,R29         Out to I/O location
+00000031:   BFCD        OUT     0x3D,R28         Out to I/O location
19:           bit_set(DDRD,BIT(5));        
+00000032:   9A8D        SBI     0x11,5           Set bit in I/O register
+00000033:   E683        LDI     R24,0x63         Load immediate
+00000034:   E090        LDI     R25,0x00         Load immediate
27:            PORTD &= ~(1<<5);
+00000035:   9895        CBI     0x12,5           Clear bit in I/O register
28:            PORTD |= (1<<5);
+00000036:   9A95        SBI     0x12,5           Set bit in I/O register
25:            for(k=0; k<100; k++)
+00000037:   9701         SBIW    R24,0x01         Subtract immediate from word
---- No Source -----------------------------------------------------------------------------
+00000038:   FF97        SBRS    R25,7            Skip if bit in register set
+00000039:   CFFB        RJMP    PC-0x0004        Relative jump
+0000003A:   CFF8        RJMP    PC-0x0007        Relative jump

Может в makefile , что-то не верно указал?
Прикрепленные файлы
Прикрепленный файл  Makefile.txt ( 13.78 килобайт ) Кол-во скачиваний: 63
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016