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

 
 
> От HELP MEGA8 к вопрос по IAR!, Переходим с проблемы на проблему!
Sergio66
сообщение Jun 21 2005, 11:40
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Я два дня назад создал тему HELP MEGA8. Спасибо всем, кто откликнулся. Однако, проблема оказалась совсем не в подключении кристалла, в совершенно в другом месте! Проблема оказалась в IAR 4.10B/W32 (4.10.2.5).
Вот такой код на С:
#include <iom8.h>

int main( void )
{
long unsigned int i;
DDRB|= (1<<1);

while(1)
{

PORTB^=(1<<1);
i=0xffff;
while (i--);
}
}
все догадались, что должно произойти. Диод на PB1 должен моргать.
Однако, камень запускается раз на 4 - 5 включений питания. (Все подтянуто, все сглажено).

Меняем проект на:
.include "m8def1.inc"

begin:


ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16


ldi r16,(1<<1)
out DDRB,r16

; основной цикл программы
loop:
ldi r16,(1<<1) ; светится один светодиод
out PORTB,r16
rcall delay ; задержка
ldi r16,(0<<1) ; теперь гасим его
out PORTB,r16
rcall delay ; задержка

rjmp loop ; повторение цикла

; процедура задержки
; примерно полсекунды при частоте 7,37 МГц
; три пустых вложенных цикла соответственно
delay:
ldi r16,30 ; 30
delay1:
ldi r17,200 ; 200
delay2:
ldi r18,200 ; и еще 200 итераций
delay3:
dec r18
brne delay3
dec r17
brne delay2
dec r16
brne delay1
ret
вот такая нехитрая замена, сгенеренная в AVRStudio 4.
Все работает как часы!!!Вопросов нет!!!
То есть есть, но уже к знатокам IAR!!!
Компилю проект с опциями:
оптимизация отключена
кристалл - м8
модель Small
Подскажите, ведь не может быть, что IAR не может работать с этим типом контроллеров!!! Понимаю, что сам дурак, но в чем???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Jun 21 2005, 13:36
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Sergio66 @ Jun 21 2005, 17:40)
Я два дня назад создал тему HELP MEGA8. Спасибо всем, кто откликнулся. Однако, проблема оказалась совсем не в подключении кристалла, в совершенно в другом месте! Проблема оказалась в IAR 4.10B/W32 (4.10.2.5).
Вот такой код на С:
#include <iom8.h>

int main( void )
{
    long unsigned int i;
    DDRB|= (1<<1);

  while(1)
{

    PORTB^=(1<<1);
    i=0xffff;
    while (i--);
}
}
все догадались, что должно произойти. Диод на PB1 должен моргать.
Однако, камень запускается раз на 4 - 5 включений питания. (Все подтянуто, все сглажено).
*

Этот код (в цикле который) порождает:
Код
  while(1)
  {

      PORTB^=(1<<1);
      ??main_0:
E002               LDI     R16, 2
B318               IN      R17, 0x18
2710               EOR     R17, R16
BB18               OUT     0x18, R17
      i=0xffff;
      while (i--);
CFFB               RJMP    ??main_0
  }

Т.е. реально задержки, как видно, никаой нет. Просто компилятор посмотрел тут, что ничего содержательного в цикле while (i--); не делается, поэтому решил, что этот цикл надо заоптимизировать, с чем он успешно справился. smile.gif

А вот если объявить i как volatile, то тогда он (компилятор) уже не будет иметь права делать какие-либо оптимизации на ее счет и получится реальный цикл:
Код
int main( void )
{
   volatile unsigned int i;
   DDRB|= (1<<1);

   while(1)
   {      
           
       PORTB^=(1<<1);
       i=0xffff;          
       while (i--);            
   }                          
}

РЕЗУЛЬТАТ:

  while(1)
  {

      PORTB^=(1<<1);
      ??main_0:
E002               LDI     R16, 2
B318               IN      R17, 0x18
2710               EOR     R17, R16
BB18               OUT     0x18, R17
      i=0xffff;
EF0F               LDI     R16, 255
8308               ST      Y, R16
8309               STD     Y+1, R16
      while (i--);
      ??main_1:
8108               LD      R16, Y
8119               LDD     R17, Y+1
01C8               MOVW    R25:R24, R17:R16
9701               SBIW    R25:R24, 1
8388               ST      Y, R24
8399               STD     Y+1, R25
2B01               OR      R16, R17
F7C1               BRNE    ??main_1
CFF0               RJMP    ??main_0
  }

Как видно, цикл тут получился не в две инструкции. Т.е. если цель была сформировать задержку, то тут придется конкретно подбирать количество циклов. Сие не есть гуд и для оной цели у IAR'а есть специальная функция __delay_cycles(unsigned long), которая заставляет компилятор корректно сгенерировать задержку из указанного количества циклов.

Кстати, что за тип такой странный - long unsigned int i;?

И еще не понял, почему то запускалось, то нет. Не вижу связи с кодом. По логике оно просто должно было маслать в цикле без задержки, т.е. на ноге должны были быть переключения с периодом цикла инверсии состояния пина. Что-то там еще есть, что не попало в наше поле зрения. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Jun 21 2005, 13:47
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



long unsigned int i;
long - случайно попало при копировании в конфу. На самом деле, там стоит самое, что ни на есть unsigned int i;
И дело тут не в volatile, т.к. я отключил всякую оптимизацию.
И цикл отрабатывается компилятором верно, чтот видно из листинга.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Jun 21 2005, 13:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



И еще, я убрал из программы все, что может косвенно служить источником неприятностей, это касается функции задержки. То, что сделал я - по крайней мере, видно, как работает.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergio66   От HELP MEGA8 к вопрос по IAR!   Jun 21 2005, 11:40
- - yung   Только сейчас бросилось в глаза. А почему main опи...   Jun 21 2005, 11:59
|- - Miron   Цитата(yung @ Jun 21 2005, 15:59)Только сейча...   Jun 21 2005, 12:14
||- - Sergio66   Цитата(Miron @ Jun 21 2005, 15:14)Цитата(yung...   Jun 21 2005, 12:26
|- - Olegovich   Цитата(yung @ Jun 21 2005, 14:59)Только сейча...   Jun 21 2005, 12:49
- - NickB   Надобно посмотреть что за код генерирует компилято...   Jun 21 2005, 12:28
|- - Sergio66   Цитата(NickB @ Jun 21 2005, 15:28)Надобно пос...   Jun 21 2005, 13:23
- - NickB   Напишите вместо while (i--); таким образом while ...   Jun 21 2005, 12:39
|- - Sergio66   Цитата(NickB @ Jun 21 2005, 15:39)Напишите вм...   Jun 21 2005, 13:09
- - NickB   А что асм в листинге показывает ? Может глюк какой...   Jun 21 2005, 13:25
- - NickB   так чтобы получился цикл задержки надо либо убрать...   Jun 21 2005, 13:48
- - NickB   А чем Вы грузите устр в первом и во втором случае?   Jun 21 2005, 13:59
|- - Sergio66   Цитата(NickB @ Jun 21 2005, 16:59)А чем Вы гр...   Jun 21 2005, 14:19
|- - Sergio66   Еще один прикол от IAR? Пишем: DDRB|= (1<...   Jun 21 2005, 15:07
|- - Sergio66   Есть!!!!! Заработало!...   Jun 21 2005, 17:39
- - indela   Цитата(Sergio66 @ Jun 21 2005, 18:07)Еще один...   Jun 21 2005, 17:33
- - NickB   Похоже что ваш программатор неверно понимает форма...   Jun 22 2005, 06:52
- - yung   Зато сколько информативных постов!   Jun 22 2005, 06:58


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:29
Рейтинг@Mail.ru


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