Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 16.07.2008, 20:09  
mikar
Прохожий
 
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mikar на пути к лучшему
По умолчанию

Странно. Зачем еще один бесконечный цикл, когда существует while(1), из которого программа отвекается на обработку прерываний. В оных возможно(поскольку полного кода нет) изменение состояния выходов порта.
Реклама:
mikar вне форума  
Непрочитано 16.07.2008, 21:07  
black27512
Временная регистрация
 
Регистрация: 13.07.2008
Сообщений: 62
Сказал спасибо: 4
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
black27512 на пути к лучшему
По умолчанию

Такой совет: попробовать продезасемблировать .HEX и поглядеть что на самом деле запихал туда компилятор... А то бывают у них выкрутасы (это я про всякие с-шные).
black27512 вне форума  
Непрочитано 17.07.2008, 07:09  
Bear-ku
Временная регистрация
 
Регистрация: 06.06.2007
Сообщений: 55
Сказал спасибо: 2
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
Bear-ku на пути к лучшему
По умолчанию

Сообщение от Lockdog
хм, то есть, мне этот кода надо запихнуть в цикл while(1)?

Надо будет проверить, но по-моему я так уже делал и проблема не решилась
Правильнее, в данном случае, бесконечный цикл поставить после установки портов.
void main(void){
DDRB=0x0F;
PORTB=0x0A;
While(1);
}
Bear-ku вне форума  
Непрочитано 17.07.2008, 07:10  
mikar
Прохожий
 
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mikar на пути к лучшему
По умолчанию

Звиняйте, невнимательно читал. Если этот код и есть вся программа, то смысла пихать ее в бесконечный цикл нет. Это превращает выхода в генератор с непонятной частотой: сначала порт ставится в 1, затем в 0 и т.д. Для данного случая, если нужно установить выхода в какое либо состояние жестко, то делается это в главной функции после инициализации до while(1). Сам цикл выбрасывать нельзя - его надо забить пустой операцией ;.
Либо в while(1), но с битом(байтом)-защелкой. Пример:
if(!set_port){
PORTB = 0xFF;
PORTB &= 0xFA;
set_port = 1;
}
После этого в цикле данный блок будет заблокирован. Переменную set_port надо объявлять глобальной, чтобы из других функций ее можно было бы изменять.
mikar вне форума  
Непрочитано 17.07.2008, 10:32  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию

Сообщение от Lockdog
Никакого переключения не идёт, сейчас это и есть вся программа, потому что я её написал, как раз, чтобы программные ошибки точно были ни при чём
Это не вся программа. Это кусок. Приведи полный листинг, включая все #include, main и т.д. Просто скопируй всю программу из компилятора и запости ее сюда.
Someone вне форума  
Непрочитано 17.07.2008, 10:39  
Lockdog
Временная регистрация
 
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
Lockdog на пути к лучшему
По умолчанию

Вот

Код:
#include ‹mega16.h›
#include ‹io.h› 

void main(void)
{   
 
 DDRB = 0xFF;

 PORTB |= 1‹‹0;
 PORTB &= ~(1‹‹1);
 PORTB |= 1‹‹2;
 PORTB &= ~(1‹‹3);

}
Lockdog вне форума  
Непрочитано 17.07.2008, 11:04  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию

Сообщение от nml
Код:
Вот

void main(void)
{   
 
 DDRB = 0xFF;

   PORTB |= 1‹‹0;
   PORTB &= ~(1‹‹1);
   PORTB |= 1‹‹2;
   PORTB &= ~(1‹‹3);

   while(1)  {}

}
Вот так попробуйте
nml вне форума  
Непрочитано 18.07.2008, 03:28  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
По умолчанию

Ну естесственно, что после установки портов нельзя допускать, чтобы выполнялось неизвестно что. Для этого в конце и ставится пустой цикл. Я поначалу подумал, что само переключение идёт в этом цикле. Тогда, действительно, переключаться будет настолько быстро, что вольтметр будет показывать что-то среднее. И ещё. Надеюсь, вы не использовали сторожевой таймер? А то получится, что ваша программа рестартует каждые 1 миллисекунду, вот и получается то, что есть. Кстати, Code Vision AVR генерирует полный код для инициализации ВСЕХ портов и устройств. А у тебя только строчки для одного порта. Возможно, что ошибочно (по причине отсутствия явной инициализации) инициализируется COM-порт или I2C шина или ещё что (например таймер или ШИМ), который использует как раз эти ноги, с которых ты и снимаешьо сигнал. При инициализации указанных модулей, насколько я помню, они перекрывают настойки портов. Поэтому не поленись и создай полный код инициализации с отключением всех неиспользуемых устройств.
Godzilla82 вне форума  
Непрочитано 18.07.2008, 06:58  
mikar
Прохожий
 
Регистрация: 16.02.2007
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mikar на пути к лучшему
По умолчанию

Полностью согласен с Godzilla82 и инициализация устройств микроконтроллера при запуске - это та часть программы, которую нельзя выбрасывать. И действительно если что-то неясно с инициализацией, то Code Vision AVR - очень хороший помощник.
mikar вне форума  
Непрочитано 21.07.2008, 10:03  
SergeBS
Вид на жительство
 
Аватар для SergeBS
 
Регистрация: 11.05.2007
Адрес: Владимир
Сообщений: 384
Сказал спасибо: 10
Сказали Спасибо 110 раз(а) в 47 сообщении(ях)
SergeBS на пути к лучшему
По умолчанию

Сообщение от Lockdog
Вот

Код:
#include ‹mega16.h›
#include ‹io.h› 

void main(void)
{   
 
 DDRB = 0xFF;

 PORTB |= 1‹‹0;
 PORTB &= ~(1‹‹1);
 PORTB |= 1‹‹2;
 PORTB &= ~(1‹‹3);

}
Ну и? Сколько компиляторов это поймет? И кто из них как отреагирует? Лень подробнее написать? Халявщик.
SergeBS вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Магический Квадрат Как они это делают? strannicmd Отвлекитесь, эмбеддеры! 3 26.11.2006 01:58
Магический Квадрат! Xabarik Отвлекитесь, эмбеддеры! 0 03.11.2006 20:47


Часовой пояс GMT +4, время: 05:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot