Технический форум по робототехнике.
inc » 13 ноя 2009, 13:28
Написал на С программу в Codevision с ипользованием флагов размером в 1бит и вот такими IF:
if((in_work==0)&&(time_work_set==1)&&(time_pause_set==0)
программа нормально компилируется , но работать не хочет в отладчике видно, что она на ифы тупо забивает и идет
дальше.
Подскажите в чём дело как этим боротся?
- Вложения
-
- dizel.rar
- (3.29 КиБ) Скачиваний: 9
Duhas » 13 ноя 2009, 13:46
мне вот интересно где флаги эти хранятся после компиляции )
а по теме - хз ) я давно на сях не пишу.. но явных косяков не вижу..
EdGull » 13 ноя 2009, 13:49
inc дай внятное название теме, иначе получишь предупреждение.
Master » 13 ноя 2009, 13:59
По моему, такие записи не корректны, нельзя в дефайнах писать через ";" команды
- Код: Выделить всё • Развернуть
#define sound_on TCCR0=0x3D;TCNT0=0x00;OCR0=0xFA
#define sound_down TCCR0=0x00; TCNT0=0x00;OCR0=0x00
#define time_start TCCR1A=0x00; TCCR1B=0x05;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x3A;OCR1AL=0x98;OCR1BH=0x00;OCR1BL=0x00
#define time_stop TCCR1A=0x00;TCCR1B=0x08;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x3A;OCR1AL=0x98;OCR1BH=0x00;OCR1BL=0x00
Добавлено спустя 5 минут 22 секунды:Попробуй закоментировать строчку, кажется в ней прога будет зависать.
- Код: Выделить всё • Развернуть
while(start_butt==0){}
SSG » 13 ноя 2009, 14:11
А у меня ругается вот как:
- Вложения
-
- Error.png (3.04 КиБ) Просмотров: 1585
Master » 13 ноя 2009, 14:16
А как ты его компилишь, он же выложил тока сишный файл, а остальных нету?
inc » 13 ноя 2009, 15:02
сейчас выкладываю весь проект. Спасибо, но почему он в ифы не заходит? (while(start_butt==0){}-работает как и должно)
p.s.извиняюсь за дублирование темы- запарился.
- Вложения
-
- code_vis.rar
- проект
- (59.85 КиБ) Скачиваний: 7
Master » 13 ноя 2009, 15:40
while(start_butt==0){}-работает как и должно
А не получается что когда start_butt=0 вы в этой процедуре весите и до ифов дело не доходи или он их игнорирует даже если кнопка не нажата?
И в чем вы симулируете?
Добавлено спустя 3 минуты 34 секунды:Для начала нужно удалить запятые везде после фигурных скобок
};
После них точка с запятой после них никогда не ставится, и очень странно что ваш CV не выдал ошибки.
Michael_K » 13 ноя 2009, 15:58
кодевиженом не пользуюсь, поэтому только по стандартному Си.
1. Как минимум точки с запятой наставить после дефайнов, где несколько команд.
А вообще принято так
#define sound_on() {blabla=77; count++; PORT|=0x55;}
2. Точки с запятой после фигурных скобок лишние не бывают.
(вообще по стандарту точки с запятой можно лишние втыкать между операторами - это не ошибка,
поэтому компилер и не ругается, и не должен).
3. Посмотреть как определен бит в хедерах у кодевижена.
Вполне вероятно, что через чар, тогда сравнивать его с единицей
(а может и нулем - от реализации зависит) некорректно.
Правильнее, имхо, писать так: if((bit1)&(!bit2)).
Но лучше понять как в кодевижене реализован тип бит.
Последний раз редактировалось
Michael_K 13 ноя 2009, 16:31, всего редактировалось 1 раз.
Master » 13 ноя 2009, 16:06
2. Точки с запятой после фигурных скобок лишние не бывают.
(вообще по стандарту точки с запятой можно лишние втыкать между операторами - это не ошибка,
поэтому компилер и не ругается, и не должен).
У меня ругается, значит это заморочки CV.
inc » 13 ноя 2009, 16:55
спасибо, буду дальше разбиратся
Добавлено спустя 10 минут 58 секунд:
да, точно bit определяется через char,и как можно поступить в данном случае?
Master » 13 ноя 2009, 17:05
юзайте не bit, а char, памяти вроде хватит.
SSG » 13 ноя 2009, 17:45
Набросал тестовую программку под Atmega 8 с двумя флагами и одним ифом. Все откомпилировалось и в VMLab нормально работает (в ифы заходит).
Добавлено спустя 1 минуту 23 секунды:Master писал(а):юзайте не bit, а char, памяти вроде хватит.
Действительно. Можно все флаги в один или несколько чаров собрать и устанавливать-читать только нужные биты байта.