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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AVR GCC не считает a = (b * pwm_ch2);, a и b uint, pwm_ch2 uchar; что не так?
smk
сообщение May 14 2012, 10:40
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



не могу посчитать a = (b * pwm_ch2) на АВРке. Что я делаю не так и как правильно?



--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 14 2012, 10:46
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

уж не volatile ли?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2012, 10:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

уж не volatile ли?


нет. просто не считает. Вернее считает, но в студии выскакивает Not in scope в момент подсчета, а это непорядок, жди глюков.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Navovvol
сообщение May 14 2012, 11:21
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



хз, может к одному типу привести ? или а сделать длинным.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 14 2012, 11:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Наверное результат нигде не используется - вот он и Not in scope - компилятор a заоптимизировал.
Если хотите увидеть чему равно a объявите её так:
Код
volatile uint a;
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 14 2012, 11:33
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2012, 12:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



а в железе работает. странно.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 14 2012, 12:37
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Что странным вам кажется?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sKWO
сообщение May 14 2012, 13:13
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



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

Быстрее всего компилятор через оптимизацию засунул переменную "а" в регистр. посмотрите в ассемблере где она.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 14 2012, 13:44
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Раз в железе работает, значит, студийные глюки.
Но типы данных желательно проконтролировать...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
smk
сообщение May 14 2012, 16:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

Это первое, что сделал. Результата не дало. Вот может библиотеку какую подключить?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 14 2012, 18:04
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
smk
сообщение May 15 2012, 11:37
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Сергей Борщ @ 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;
}




--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 15 2012, 12:06
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


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

Расчехлил студию. Не вижу проблем:
Прикрепленное изображение


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 15 2012, 13:06
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(smk @ May 15 2012, 14:37) *
if(!(PINA & (1<<0)))


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

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

По теме - пусть уважаемый Сергей Борщ даст свой makefile, на котором всё работает. Может ключики где-то отличаются..

Сообщение отредактировал hd44780 - May 15 2012, 13:20


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

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

 


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


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