| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Си, CVAVR, VMLAB - нужна консультация.
04.08.2012, 14:58
|
|
|
Прописка
Регистрация: 26.07.2004
Сообщений: 275
Сказал спасибо: 21
Сказали Спасибо 62 раз(а) в 28 сообщении(ях)
|
Си, CVAVR, VMLAB - нужна консультация.
Решил освоить язык "С" на наглядных средствах и сразу "споткнулся". Я не то, чтобы начинающий, но и не программист - раньше писал программы для контроллеров на ассемблере. Ну и для разных других целей по ситуации (VHDL, спектра и т.п). Вот только с "С" не приходилось работать.
Начал с простого. Кнопочка и два светодиода. Один горит другой нет. При нажатии на кнопочку переключаются. Из-за ЕВРО2012 назвал "futbol", так что пусть это никого не смущает. Для написания и компиляции использовал CVAVR. Программа получилась такой:
|
Код:
|
#include ‹mega16.h›
void main (void)
{
PORTD=0xFF; // 0...5 - входы с подтяжкой, 6,7 - выходы.
DDRD=0xC0;
while (1)
{
if (PIND.5==0){
PORTD.7=0;
PORTD.6=1;
}
else
PORTD.7=1;
PORTD.6=0;
}
} |
Загрузил в реальный макет - работает!
Правда прошивка получилась великоватой для такой программы - больше 80 слов. Судя по листингам, оно туда зачем-то добавляет кучу каких-то макросов, которые в программе нигде не вызываются. Ну да ладно, на больших программах эта надбавка, меньше 1%, будет не так заметна.
Ну а теперь в учебных целях я решил попробовать прокатить программку на VMLAB, т.к. раньше я этот пакет тоже не использовал. Может, думаю, пригодится... Все хвалят... Ну и чтобы по мере усложнения не возиться с макетом.
Для VMLAB создан вот такой управляющий файл:
|
Код:
|
.MICRO "ATmega16"
.TOOLCHAIN "GENERIC"
.TARGET "futbol.hex"
.COFF "futbol.cof"
.SOURCE "futbol.c"
.TRACE
.POWER VDD=5 VSS=0
.CLOCK 14.7456meg ; частота, как в макете
.STORE 100m
D1 VDD n1;
R1 n1 PD6 430;
D2 VDD n2;
R2 n2 PD7 430;
K0 VSS PD5;
.PLOT V(PD5) V(PD6) V(PD7) |
При моделировании происходит следующее.
Первый горит, второй погашен. Все правильно.
Нажимаем кнопочку (К0). Второй загорается, первый начинает хаотически мигать, хотя по осциллограммам видно, что не должен, а на осциллограмме РВ6 возникает паразитная генерация с периодом около 750нс. При изменении тактовой частоты в процессе симулляции, частота этой генерации тоже изменяется.
После симуляции напротив строки
PORTD.7=1;
выскакивает красный восклицательный значек. Никаких ошибок не объявляется. После сброса значек исчезает.
Если убрать один из светодиодов, то паразитная генерация не возникает.
На макете по осциллографу все нормально.
Я не могу понять, почему это происходит.
Проследить процесс в пошаговом режиме не получается, т.к. при нажатии на кнопку и одновременном нажатии клавиш F6 или F7 оно никуда не шагает.
Последний раз редактировалось dosikus; 04.08.2012 в 23:00.
|
|
|
|
04.08.2012, 15:22
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
krian, Оформите свой пост как положено ...
__________________
Осторожно , злой кот
|
|
|
|
Сказали "Спасибо" dosikus
|
|
|
04.08.2012, 22:36
|
|
|
Гражданин KAZUS.RUN
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
krian, почему после else нет открывающей фигурной скобки?
|
|
|
|
04.08.2012, 23:23
|
|
|
Прописка
Регистрация: 26.07.2004
Сообщений: 275
Сказал спасибо: 21
Сказали Спасибо 62 раз(а) в 28 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
А что не так? Я программы копировал из текстовых файлов, но при публикации автоматически убрались все отступы.
|
|
|
|
04.08.2012, 23:25
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Сообщение от krian
|
|
А что не так? Я программы копировал из текстовых файлов, но при публикации автоматически убрались все отступы.
|
Я уже исправил , в следующий раз ищите кнопку "код" сами ...
__________________
Осторожно , злой кот
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
|
|
|
04.08.2012, 23:41
|
|
|
Прописка
Регистрация: 26.07.2004
Сообщений: 275
Сказал спасибо: 21
Сказали Спасибо 62 раз(а) в 28 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Сообщение от Flopix
|
|
krian, почему после else нет открывающей фигурной скобки?
|
Вначале скобки были, но в процессе экспериментов я их убрал. Понял, что они необязательны. В данном случае они что есть, что нет. Все равно после else последовательно выполняются команды, которые за ним стоят. Я читал, что и else писать необязательно, т.к. если не выполнится условие в операторе if, то будут выполнятся команды после закрывающей фигурной скобки, которая относится к if. Также еще пишут, что если стоит else, то все операторы, что находятся между if и else считаются относяшимися к if и выполняются только при выполнении условия. Так что и там скобки вроде необязательны. Но в том компиляторе, который я использовал такая запись не проходит. Может в других проходит.
Или я не прав?
Последний раз редактировалось krian; 04.08.2012 в 23:46.
|
|
|
|
04.08.2012, 23:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.06.2005
Сообщений: 1,387
Сказал спасибо: 19
Сказали Спасибо 210 раз(а) в 156 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Скобки нужны, т.к. без них
выполняется всегда.
|
|
|
|
04.08.2012, 23:50
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Сообщение от krian
|
|
Код:
|
#include ‹mega16.h›
void main (void)
{
PORTD=0xFF; // 0...5 - входы с подтяжкой, 6,7 - выходы.
DDRD=0xC0;
while (1)
{
if (PIND.5==0){
PORTD.7=0;
PORTD.6=1;
}
else
PORTD.7=1;
PORTD.6=0;
}
} |
|
Ваш код эквивалентен такому:
|
Код:
|
while (1)
{
PORTD.6=0;
if (PIND.5==0){
PORTD.7=0;
PORTD.6=1;
}
else
PORTD.7=1;
} |
Надо так:
|
Код:
|
while (1)
{
if (PIND.5==0){
PORTD.7=0;
PORTD.6=1;
}
else {
PORTD.7=1;
PORTD.6=0;
}
} |
Скобку потеряли.
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо _Артём_ за это сообщение:
|
|
|
04.08.2012, 23:51
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Сообщение от krian
|
|
Все равно после else последовательно выполняются команды, которые за ним стоят.
|
Если скобок нет, не определен блок операторов - else обработает первый оператор . Последующие будут выполнятся не зависимо от условия . То же самое и с if ...
__________________
Осторожно , злой кот
|
|
|
|
Сказали "Спасибо" dosikus
|
|
|
04.08.2012, 23:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Си, CVAVR, VMLAB - нужна консультация.
Сообщение от krian
|
Я читал, что и else писать необязательно, т.к. если не выполнится условие в операторе if, то будут выполнятся команды после закрывающей фигурной скобки, которая относится к if. Также еще пишут, что если стоит else, то все операторы, что находятся между if и else считаются относяшимися к if и выполняются только при выполнении условия. Так что и там скобки вроде необязательны. Но в том компиляторе, который я использовал такая запись не проходит. Может в других проходит.
Или я не прав?
|
Или неправы.
Фигурными скобками выделяется БЛОК операторов. Если этого не делать, выполняется ТОЛЬКО ПЕРВЫЙ оператор после условия. ELSE относится к операторам условия.
Т.е.:
|
Код:
|
if ( condition == true )
{
operator_1;
operator_2;
}
else
{
operator_3;
operator_4;
} |
Отсутствие скобок после else приведет к тому, что выполнится только operator_3 по условию. operator_4 будет находится ВНЕ условных операций и будет выполнятся БЕЗУСЛОВНО.
2dosicus Кропали одновременно...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ut1wpr за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:42.
|
|