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

 
 
> 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
 
Start new topic
Ответов
hd44780
сообщение May 14 2012, 13:44
Сообщение #2


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

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



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


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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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
smk
сообщение May 16 2012, 09:18
Сообщение #7


Гуру
******

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



Цитата(Сергей Борщ @ May 15 2012, 15:06) *
Расчехлил студию. Не вижу проблем:

Прикрепленное изображение

В моем варианте проблема выглядит вот так:
(следующий шаг после точки останова)
Прикрепленное изображение


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


Гуру
******

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



QUOTE (smk @ May 16 2012, 12:18) *
В моем варианте проблема выглядит вот так:
Так выложите весь проект целиком. Не будем же мы гадать, что не понравилось вашей студии. Какая версия студии, кстати?


--------------------
На любой вопрос даю любой ответ
"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   AVR GCC не считает a = (b * pwm_ch2);   May 14 2012, 10:40
- - MrYuran   а в чем проблема? уж не volatile ли?   May 14 2012, 10:46
|- - smk   Цитата(MrYuran @ May 14 2012, 13:46) а в ...   May 14 2012, 10:48
|- - _Артём_   Цитата(smk @ May 14 2012, 13:48) нет. про...   May 14 2012, 11:21
|- - demiurg_spb   Цитата(smk @ May 14 2012, 13:48) считает,...   May 14 2012, 11:33
|- - sKWO   Цитата(smk @ May 14 2012, 13:48) Вернее с...   May 14 2012, 13:13
- - Navovvol   хз, может к одному типу привести ? или а сделать д...   May 14 2012, 11:21
- - smk   а в железе работает. странно.   May 14 2012, 12:02
|- - demiurg_spb   Что странным вам кажется?   May 14 2012, 12:37
||- - smk   Цитата(Сергей Борщ @ May 16 2012, 14:38) ...   May 16 2012, 17:45
|- - hd44780   Цитата(smk @ May 15 2012, 14:37) if(...   May 15 2012, 13:06
|- - Сергей Борщ   QUOTE (hd44780 @ May 15 2012, 16:06) Заче...   May 15 2012, 13:20
- - hd44780   Про сдвиг я для порядку сказал. Наглядно, да, но п...   May 15 2012, 14:11
- - demiurg_spb   Цитата(hd44780 @ May 15 2012, 17:11) Нагл...   May 16 2012, 11:45


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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 02:29
Рейтинг@Mail.ru


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