11.08.2012, 16:39
|
#1061
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Столкнулся с непонятной проблемой:
есть некоторая программа вида
Код:
|
#директивы
глобальные переменные
глобальные переменные
глобальные переменные
main()
{
основной код
} |
большая часть глобальных переменных в программе не используется, просто изначально они были заданы, а потом, при оптимизации кода, набность в них отпала.
так вот, если убрать эти переменные, программа перестает работать.
сравнил ассемблерный листинг, обнаружил разницу в строках присваивания переменных, напрмер, для сравнения один и тот же участок программы в 2 случаях:
Код:
|
так в работающей программе
14AE: MOVLW C8
14B0: MOVLB 1
14B2: MOVWF x46
14B4: MOVLB 0
14B6: BRA 11BC |
Код:
|
а так в не работающей
1280: MOVLW C8
1282: MOVWF xA2
1284: BRA 11BC |
что за ![Вопрос](images/smilies/icon_question.gif) помогите восполнить пробел знаний
Последний раз редактировалось ZoomerJuk; 11.08.2012 в 16:43.
|
|
|
|
11.08.2012, 17:06
|
#1062
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
ZoomerJuk, Сколько раз говорить можно ? Минимальный неработающий кусок кода .
По вашему шаблону гадать предлагаете ?
__________________
Осторожно , злой кот
|
|
|
|
11.08.2012, 17:18
|
#1063
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сейчас исправлюсь, скину 2 варианта
|
|
|
|
11.08.2012, 17:49
|
#1064
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Вот, прикрепил исходники для обоих вариантов - работающего и нет.
Разница в том, что в не работающем удалены неиспользуемые глобальные переменные.
Так же добавил ассемблерные листинги.
|
|
|
|
11.08.2012, 22:54
|
#1065
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
народ, ну что, есть какие-либо идеи?
я даже не знаю в каком направлении копать. Есть предположение, что это связано с организацией памяти, но я пока этот вопрос как следует не изучил.
|
|
|
|
11.08.2012, 22:56
|
#1066
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
ZoomerJuk, Извиняюсь , а можете подождать ?
Завтра дам вам ответ . Сегодня очень сильно занят....
__________________
Осторожно , злой кот
|
|
|
|
11.08.2012, 22:57
|
#1067
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Да подожду, конечно. Не горит. Да и куда мне деться, сам врятли смогу осилить задачу...
|
|
|
|
12.08.2012, 15:15
|
#1068
|
Вид на жительство
Регистрация: 09.12.2006
Сообщений: 337
Сказал спасибо: 422
Сказали Спасибо 34 раз(а) в 26 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Столкнулся с такой проблемой: при выводе 16 символов( в строку) на LCD 16x1 в железе печатается 16 , а в протеусе только 8. Если я меняю в файле Flex_lcd_16x1.c строку:
#define LCD_HALF_WIDTH (LCD_WIDTH/2)
на
#define LCD_HALF_WIDTH (LCD_WIDTH)
то получается наоборот- в протеусе 16 символов , в железе 8.
Как сделать чтоб работало одинаково и в протеусе и в железе(или это не реально). Проект прикладываю.
|
|
|
|
12.08.2012, 17:47
|
#1069
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Это из-за того, что в протеусе другая адрессация памяти. Смотри рисунок.
Из-за чего так, ХЗ, толи баг разработчиков, толи где настраивать надо.
Что б в проте работало, поправь следующую функцию (закомментируй проверку позиции):
Код:
|
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
lcd_xcoord = 1;
break;
case '\n':
lcd_gotoxy(1,1); // Goto start of line 1
break;
case '\b':
lcd_send_byte(0, 0x10);
lcd_xcoord--;
//if(lcd_xcoord == LCD_HALF_WIDTH)
//lcd_gotoxy(LCD_HALF_WIDTH, 1);
break;
default:
lcd_send_byte(1, c);
lcd_xcoord++;
// if(lcd_xcoord == (LCD_HALF_WIDTH +1))
//lcd_gotoxy(LCD_HALF_WIDTH +1, 1);
break;
}
} |
на железо это не должно повлиять, а там ХЗ.
Так же не применяй printf("%3.2f\r", volts) и float. Памяти они жрут немеряно.
Вместо них примени lcd_putc("abcdefgh01234567"); и напряжение измеряй, например, так:
Код:
|
lcd_putc("\fU="); //очистка дисплея, вывод U=
adc_value = read_adc(); // считываем значение с АЦП
volts = (adc_value*49)/10; // преводим в милливольты
lcd_putc((volts/1000)+'0'); // выводим тысячи миливольт
lcd_putc('.');
lcd_putc(((volts/100)%10)+'0'); // выводим сотни миливольт
lcd_putc(((volts/10)%10)+'0'); // выводим десятки миливольт
lcd_putc("V"); |
Последний раз редактировалось ZoomerJuk; 12.08.2012 в 17:49.
Причина: Опечатки
|
|
|
Сказали "Спасибо" ZoomerJuk
|
|
|
12.08.2012, 18:39
|
#1070
|
Временная регистрация
Регистрация: 12.09.2008
Сообщений: 61
Сказал спасибо: 20
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Держи исправления, vlad_ru.
|
|
|
Сказали "Спасибо" ZoomerJuk
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:28.
|
|