AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.10.2013, 09:25
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
mega8+CVavr+Proteus - кто из них так глючит?
Добрый день.
В CVavr'е есть код под мегу 8ю, в коде есть немного глобальных переменных, полное перечисление ниже.
Так вот компилю код, вставляю в протеус, запускаю проект и ВУАЛЯ, код работает не так как надо, переменная pwm_b постоянно принимает значение 32, и что бы не делал с этой переменной она всегда = 32.
Думал сначала проблема в коде. Заремарил все строки с этой переменной, присвоил этой переменной значение 0 и тут же вывел на дисплей - результат не порадовал - 32. Даже пробовал переименовать эту переменную, все тот же результат. Тут зачем то, даже не знаю зачем, поменял описание переменных, точнее эту переменную поднял на 2 строки выше, было:
Код:
|
unsigned char pwm_r,pwm_r_new;
unsigned char pwm_g,pwm_g_new;
unsigned char pwm_b,pwm_b_new; |
Стало:
Код:
|
unsigned char pwm_b,pwm_b_new;
unsigned char pwm_r,pwm_r_new;
unsigned char pwm_g,pwm_g_new; |
Ура, все заработало, переменная стала вести себя адекватно. Но тут заметил что теперь pwm_g стала выносить мозг. И вот тут то закралась мысля, что либо в меге нет возможности столько переменных переварить, либо CVavr их не пережевывает(нона этапе компиляции не ругается), ну или протеус обижается на такое кол-во глобальных переменных.
Подскажите, что это может быть, как избавиться от глюка?
P.S. CVavr - 2.05.3, Proteus - 7.7 SP2
P.S.S. Прошу прощения за слишком много букавак.
Код:
|
typedef struct{
unsigned char second;
unsigned char minute;
unsigned char hour;
}s_time;
eeprom unsigned char e_time[9][4];
eeprom unsigned char first_run;
eeprom unsigned char e_pwm_r;
eeprom unsigned char e_pwm_g;
eeprom unsigned char e_pwm_b;
eeprom unsigned char e_pwm_timer;
unsigned char time[9][4];
s_time t;
unsigned char displey;
unsigned char displ_position;
unsigned char s_in_menu;
unsigned char lcdbuffer[19];
int t_temp;
bit f_ds1307;
bit f_reg;
unsigned char v_reg;
unsigned char pwm_r,pwm_r_new;
unsigned char pwm_g,pwm_g_new;
unsigned char pwm_b,pwm_b_new;
unsigned char pwm_counter;
unsigned char pwm_timer;
unsigned int pwm_time_counter;
bit f_pwm_up;
typedef unsigned char byte;
typedef struct {
byte family;
byte serial[6];
byte crc;
}trom;
typedef struct {
union {
struct {
byte l;
byte h;
}b;
int w;
}temp;
union {
struct {
byte l;
byte h;
}b;
int w;
}th;
byte config;
byte res[3];
byte crc;
}tscratchpad;
trom ds_rom;
tscratchpad ds_sp;
bit ds_ok=0; |
|
|
|
|
04.10.2013, 11:25
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
а где код неработающий?
|
|
|
|
04.10.2013, 11:36
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
А зачем? Можно делать ставки, всему виною CVavr.
|
|
|
|
04.10.2013, 11:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Не, не - виновата мега, точно! Ни протезус, ни тем более ЦВ врать не могут!!!
Тем более, что мега, согласно первому посту, в процессе никак не участвует - точно она!
Сообщение от Sany81
|
как избавиться от глюка?
|
Исправить вот это вот место в программе, где он и возникает.
__________________
There's always more than one way to skin a cat.
|
|
|
|
04.10.2013, 12:15
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Вы видать не внимательно читали.
Повторюсь другими словами.
Есть код, ни как не связанный с переменной pwm_b, точнее переменная ни где, ни в одной процедуре или функцие не участвует, кроме одной, вывод информации на дисплей.
вот код:
pwm_r=0;
pwm_g=100;
pwm_b=200;
sprintf(lcdbuffer, "%03d%% %03d%% %03d%%",pwm_r,pwm_g,pwm_b);
lcd_puts(lcdbuffer);
Так вот на дисплей выйдет надпись
000% 100% 032%
Вот теперь думаю более понятно описал.
|
|
|
|
04.10.2013, 12:17
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Блин, пока писал предыдущее сообщение, понял что я мог где то лохануться и попытаться в теле программы в какой нить массив впихнуть значение превосходящее размер этого массива, вот это и могло стать причиной некрасивого поведения нужной мне переменной.
Сейчас буду проверять.
|
|
|
|
04.10.2013, 12:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
__________________
There's always more than one way to skin a cat.
|
|
|
|
04.10.2013, 13:01
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Сообщение от Sany81
|
Сейчас буду проверять.
|
"Это элементарно, Ватсон!"(С)
Добавляете в конце три строчки:
Код:
|
pwm_counter = pwm_r;
pwm_counter = pwm_g;
pwm_counter = pwm_b; |
Этим вы проверите действительность значений в pwm_r, pwm_g и pwm_b без объявления новой переменной.
Просмотрите содержимое lcdbuffer после выполнения sprintf.
Если всё верно, то разбирайтесь с lcd_puts(lcdbuffer); .
|
|
|
|
04.10.2013, 13:39
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Код:
|
pwm_r=0;
pwm_g=100;
pwm_b=200;
while (1)
{
sprintf(lcdbuffer, "%03d%% %03d%% %03d%%",pwm_r,pwm_g,pwm_b);
puts(lcdbuffer);
delay_ms(2000);
} |
"код" работает, естественно предупреждает
Цитата:
|
Warning: D:\Work\Codev\Examples\TestM48_2\TestM48_2.c(30): global variable 'pwm_r_new' was declared, but not referenced
Warning: D:\Work\Codev\Examples\TestM48_2\TestM48_2.c(31): global variable 'pwm_g_new' was declared, but not referenced
Warning: D:\Work\Codev\Examples\TestM48_2\TestM48_2.c(32): global variable 'pwm_b_new' was declared, but not referenced
|
|
|
|
|
04.10.2013, 13:50
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: mega8+CVavr+Proteus - кто из них так глючит?
Всем спасибо, нашел ошибку.
Опять невнимательность при написании кода.
Переменная lcdbuffer объявлена как массив 19, а в коде программы я присваиваю этому массиву значение из 20 символов. Вот как раз тут и и получается ошибка.
Мдя, вчера просидел пол дня с этой ошибкой, сегодня час убил, а оказывается все на поверхности, просто смотреть нужно ярче
А число 32, которое было в моей переменной, это ни что иное как пробел, которым я забивал массив, что бы очистить дисплей.
Последний раз редактировалось Sany81; 04.10.2013 в 13:56.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:19.
|
|