|
AVR GCC не считает a = (b * pwm_ch2);, a и b uint, pwm_ch2 uchar; что не так? |
|
|
|
 |
Ответов
|
May 14 2012, 18:04
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 15 2012, 11:37
|
Гуру
     
Группа: Свой
Сообщений: 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; }
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 15 2012, 12:06
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 16 2012, 11:38
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|