Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR GCC не считает a = (b * pwm_ch2);
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
smk
не могу посчитать a = (b * pwm_ch2) на АВРке. Что я делаю не так и как правильно?

MrYuran
а в чем проблема?

уж не volatile ли?
smk
Цитата(MrYuran @ May 14 2012, 13:46) *
а в чем проблема?

уж не volatile ли?


нет. просто не считает. Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков.
Navovvol
хз, может к одному типу привести ? или а сделать длинным.
_Артём_
Цитата(smk @ May 14 2012, 13:48) *
нет. просто не считает. Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков.

Наверное результат нигде не используется - вот он и Not in scope - компилятор a заоптимизировал.
Если хотите увидеть чему равно a объявите её так:
Код
volatile uint a;
demiurg_spb
Цитата(smk @ May 14 2012, 13:48) *
считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков.
Ошибочное заключение.

smk
а в железе работает. странно.
demiurg_spb
Что странным вам кажется?
sKWO
Цитата(smk @ May 14 2012, 13:48) *
Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков.

Быстрее всего компилятор через оптимизацию засунул переменную "а" в регистр. посмотрите в ассемблере где она.
hd44780
Раз в железе работает, значит, студийные глюки.
Но типы данных желательно проконтролировать...
smk
Цитата(hd44780 @ May 14 2012, 16:44) *
Раз в железе работает, значит, студийные глюки.
Но типы данных желательно проконтролировать...

Это первое, что сделал. Результата не дало. Вот может библиотеку какую подключить?
Сергей Борщ
QUOTE (smk @ May 14 2012, 19:43) *
Вот может библиотеку какую подключить?
Вот может быть пора посмотреть в листинг? Даю 99%, что переменная лежит в регистре, если вообще не заоптимизирована в следующее выражение, в котором она используется. Поэтому симулятор и не может ее показать. Ну не научили пока GCC сопровождать отладочной информацией переменную в регистре и ее блуждание по регистрам. И студии, соответственно, неоткуда брать эту информацию и показать вам она ничего не может. Откройте окно дизассемблера, осмыслите код и поймёте, в каких регистрах искать вашу переменную. Хотите надавать по рукам оптимизатору и увидеть переменную явно в памяти - объявите как volatile.
smk
Цитата(Сергей Борщ @ May 14 2012, 21:04) *
Хотите надавать по рукам оптимизатору и увидеть переменную явно в памяти - объявите как volatile.

Делал ранее и еще раз проверил. Не помогает. Привожу для интереса код (ламерского качества, сам понимаю, т.к. не писался а копи-пастился). Может кто поймет в чем там дело?

Код
#include <avr/io.h>
#include <stdint.h>
#include <math.h>

volatile unsigned char pwm=0,  pwm_ch1=0, pwm_ch2=255, step=0, b, flag=0;
volatile unsigned int count=0, tik=0;
volatile unsigned int a, c;

int main (void)
{
PORTB = 0x00;
DDRB  = 0x0F;
PORTA = 0x01;
DDRA  = 0x00;
OCR1A = 0x7F;
OCR1B = 0x7F;
OCR1C = 0xFF;
TCCR1A = 0b10100011;
TCCR1B = 0x08; //start Timer

    while(1)
        {
        if(step==0)
            {
            if(count==300)
                {
                    step=1;
                    count = 0;
                }
            }
        if(step==1)
            {
            if(count==1)
                {
                    pwm_ch1++;
                    pwm_ch2--;
                    count=0;
                }    
            if(pwm_ch2==0)
                {
                    step=2;
                    count = 0;
                }
            }
        if(step==2)
            {
            if(count==300)
                {
                    step=3;
                    count = 0;
                }
            }
        if(step==3)
            {
            if(count==1)
                {
                    pwm_ch1--;
                    pwm_ch2++;
                    count=0;
                }    
            if(pwm_ch1==0)
                {
                    step=0;
                    count = 0;
                }
            }

        
        if(pwm==255) {count++; tik++;}
        pwm++;

        a = (b * (unsigned int)pwm_ch1);
        c = (b * (unsigned int)pwm_ch2);

        OCR1A = (unsigned char)(a>>8);
        OCR1B = (unsigned char)(c>>8);

        if(tik==1)
            {
                tik=0;
                if(!(PINA & (1<<0)))
                    {
                    if(flag==0) b++;
                    if(b==255) flag=1;
                    if(flag==1) b--;
                    if(b==0) flag=0;
                    }
            }
        }
return 0;
}


Сергей Борщ
QUOTE (smk @ May 15 2012, 14:37) *
Делал ранее и еще раз проверил. Не помогает.
Как??? Все есть в листинге.
CODE
173                   .LSM39:     <---------     a = (b * (unsigned int)pwm_ch1);
174 0134 2091 0000         lds r18,b
175 0138 8091 0000         lds r24,pwm_ch1
176 013c 829F              mul r24,r18
177 013e C001              movw r24,r0
178 0140 1124              clr r1
179 0142 9093 0000         sts (a)+1,r25
GAS LISTING D:/Temp/ccOicLpk.s             page 4


180 0146 8093 0000         sts a,r24
181                   .LSM40:     <---------     c = (b * (unsigned int)pwm_ch2);
182 014a 2091 0000         lds r18,b
183 014e 8091 0000         lds r24,pwm_ch2
184 0152 829F              mul r24,r18
185 0154 C001              movw r24,r0
186 0156 1124              clr r1
187 0158 9093 0000         sts (c)+1,r25
188 015c 8093 0000         sts c,r24
189                   .LSM41:     <---------     OCR1A = (unsigned char)(a>>8);
190 0160 8091 0000         lds r24,a
191 0164 9091 0000         lds r25,(a)+1
192 0168 892F              mov r24,r25
193 016a 90E0              ldi r25,lo8(0)
194 016c 9BBD              out (74)+1-32,r25
195 016e 8ABD              out 74-32,r24
196                   .LSM42:     <---------     OCR1B = (unsigned char)(c>>8);
197 0170 8091 0000         lds r24,c
198 0174 9091 0000         lds r25,(c)+1
199 0178 892F              mov r24,r25
200 017a 90E0              ldi r25,lo8(0)
201 017c 99BD              out (72)+1-32,r25
202 017e 88BD              out 72-32,r24


А видит ли студия - не знаю. Остальные переменные видит?

Расчехлил студию. Не вижу проблем:
Нажмите для просмотра прикрепленного файла
hd44780
Цитата(smk @ May 15 2012, 14:37) *
if(!(PINA & (1<<0)))


wacko.gif blink.gif у Шуры шары
Зачем сдвиг? Чтобы у компилятора шарики за ролики заехали и чтобы он ещё и в этом if-е Вам Бог знает что нагенерил? Или Вы его специально на прочность проверяете? А потом будете спрашивать, а чего оно не работает?

Проще и понятнее
if(!(PINA & 1))

По теме - пусть уважаемый Сергей Борщ даст свой makefile, на котором всё работает. Может ключики где-то отличаются..
Сергей Борщ
QUOTE (hd44780 @ May 15 2012, 16:06) *
Зачем сдвиг?
Очень лаконичная и наглядная запись. Ничего с компилятором не случится, от 2+2 он ведь не шарахается в ужасе. Чем же сдвиг для него должен быть хуже?

QUOTE (hd44780 @ May 15 2012, 16:06) *
Может ключики где-то отличаются..
Да там ключей для отладки-то всего один: -gdwarf-2, и тот студия вроде бы автоматом подставляла.
hd44780
Про сдвиг я для порядку сказал.
Наглядно, да, но после того как когда-то давно у меня VC6 не сумел "пережевать" примитивнейший if ((status&0x80)!=0), я таких конструкций стараюсь избегать sm.gif .
smk
Цитата(Сергей Борщ @ May 15 2012, 15:06) *
Расчехлил студию. Не вижу проблем:
Нажмите для просмотра прикрепленного файла

В моем варианте проблема выглядит вот так:
(следующий шаг после точки останова)
Нажмите для просмотра прикрепленного файла
Сергей Борщ
QUOTE (smk @ May 16 2012, 12:18) *
В моем варианте проблема выглядит вот так:
Так выложите весь проект целиком. Не будем же мы гадать, что не понравилось вашей студии. Какая версия студии, кстати?
demiurg_spb
Цитата(hd44780 @ May 15 2012, 17:11) *
Наглядно, да, но после того как когда-то давно у меня VC6 не сумел "пережевать" примитивнейший if ((status&0x80)!=0), я таких конструкций стараюсь избегать sm.gif .
Правильно, ибо
Код
if ((status&0x80)!=0)
куда менее наглядно, чем
Код
if (status&(1<<7))
smk
Цитата(Сергей Борщ @ May 16 2012, 14:38) *
Так выложите весь проект целиком. Не будем же мы гадать, что не понравилось вашей студии. Какая версия студии, кстати?

Вот проект целиком:
Нажмите для просмотра прикрепленного файла

Студия 4.18 (В 716).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.