Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.07.2008, 20:09
|
|
Прохожий
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Странно. Зачем еще один бесконечный цикл, когда существует while(1), из которого программа отвекается на обработку прерываний. В оных возможно(поскольку полного кода нет) изменение состояния выходов порта.
|
|
|
|
16.07.2008, 21:07
|
|
Временная регистрация
Регистрация: 13.07.2008
Сообщений: 62
Сказал спасибо: 4
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Такой совет: попробовать продезасемблировать .HEX и поглядеть что на самом деле запихал туда компилятор... А то бывают у них выкрутасы (это я про всякие с-шные).
|
|
|
|
17.07.2008, 07:09
|
|
Временная регистрация
Регистрация: 06.06.2007
Сообщений: 55
Сказал спасибо: 2
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Сообщение от Lockdog
|
хм, то есть, мне этот кода надо запихнуть в цикл while(1)?
Надо будет проверить, но по-моему я так уже делал и проблема не решилась
|
Правильнее, в данном случае, бесконечный цикл поставить после установки портов.
void main(void){
DDRB=0x0F;
PORTB=0x0A;
While(1);
}
|
|
|
|
17.07.2008, 07:10
|
|
Прохожий
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Звиняйте, невнимательно читал. Если этот код и есть вся программа, то смысла пихать ее в бесконечный цикл нет. Это превращает выхода в генератор с непонятной частотой: сначала порт ставится в 1, затем в 0 и т.д. Для данного случая, если нужно установить выхода в какое либо состояние жестко, то делается это в главной функции после инициализации до while(1). Сам цикл выбрасывать нельзя - его надо забить пустой операцией ;.
Либо в while(1), но с битом(байтом)-защелкой. Пример:
if(!set_port){
PORTB = 0xFF;
PORTB &= 0xFA;
set_port = 1;
}
После этого в цикле данный блок будет заблокирован. Переменную set_port надо объявлять глобальной, чтобы из других функций ее можно было бы изменять.
|
|
|
|
17.07.2008, 10:32
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
|
Сообщение от Lockdog
|
Никакого переключения не идёт, сейчас это и есть вся программа, потому что я её написал, как раз, чтобы программные ошибки точно были ни при чём
|
Это не вся программа. Это кусок. Приведи полный листинг, включая все #include, main и т.д. Просто скопируй всю программу из компилятора и запости ее сюда.
|
|
|
|
17.07.2008, 10:39
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Вот
Код:
|
#include ‹mega16.h›
#include ‹io.h›
void main(void)
{
DDRB = 0xFF;
PORTB |= 1‹‹0;
PORTB &= ~(1‹‹1);
PORTB |= 1‹‹2;
PORTB &= ~(1‹‹3);
} |
|
|
|
|
17.07.2008, 11:04
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от nml
|
Код:
|
Вот
void main(void)
{
DDRB = 0xFF;
PORTB |= 1‹‹0;
PORTB &= ~(1‹‹1);
PORTB |= 1‹‹2;
PORTB &= ~(1‹‹3);
while(1) {}
} |
|
Вот так попробуйте
|
|
|
|
18.07.2008, 03:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Ну естесственно, что после установки портов нельзя допускать, чтобы выполнялось неизвестно что. Для этого в конце и ставится пустой цикл. Я поначалу подумал, что само переключение идёт в этом цикле. Тогда, действительно, переключаться будет настолько быстро, что вольтметр будет показывать что-то среднее. И ещё. Надеюсь, вы не использовали сторожевой таймер? А то получится, что ваша программа рестартует каждые 1 миллисекунду, вот и получается то, что есть. Кстати, Code Vision AVR генерирует полный код для инициализации ВСЕХ портов и устройств. А у тебя только строчки для одного порта. Возможно, что ошибочно (по причине отсутствия явной инициализации) инициализируется COM-порт или I2C шина или ещё что (например таймер или ШИМ), который использует как раз эти ноги, с которых ты и снимаешьо сигнал. При инициализации указанных модулей, насколько я помню, они перекрывают настойки портов. Поэтому не поленись и создай полный код инициализации с отключением всех неиспользуемых устройств.
|
|
|
|
18.07.2008, 06:58
|
|
Прохожий
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Полностью согласен с Godzilla82 и инициализация устройств микроконтроллера при запуске - это та часть программы, которую нельзя выбрасывать. И действительно если что-то неясно с инициализацией, то Code Vision AVR - очень хороший помощник.
|
|
|
|
21.07.2008, 10:03
|
|
Вид на жительство
Регистрация: 11.05.2007
Адрес: Владимир
Сообщений: 384
Сказал спасибо: 10
Сказали Спасибо 110 раз(а) в 47 сообщении(ях)
|
Сообщение от Lockdog
|
Вот
Код:
|
#include ‹mega16.h›
#include ‹io.h›
void main(void)
{
DDRB = 0xFF;
PORTB |= 1‹‹0;
PORTB &= ~(1‹‹1);
PORTB |= 1‹‹2;
PORTB &= ~(1‹‹3);
} |
|
Ну и? Сколько компиляторов это поймет? И кто из них как отреагирует? Лень подробнее написать? Халявщик.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:35.
|
|