Перейти к содержанию

Программа На Си


Рекомендуемые сообщения

Доброго времени суток уважаемые форумчане! Не пинайте слишком сильно. Вот в 37лет решил освоить МК и язык Си .Научился мигать светодиодом ,включать от кнопки .узнал что такое порты и как их конфигуировать.

Хочу написать программу ,чтобы при нажатии кнопки светодиод моргал ровно 5 раз и потом гаснул.При отключении кнопки светодиоды не горят. при вкл.опять моргали бы 5 раз и так бесконечно

Вот прога:

#define F_CPU 1000000UL
#include<avr/io.h>
#include<util/delay.h>

int main(void){

DDRD=0xFF;
DDRC=0x00;
PORTC|=_BV(PC0)

int i;

for(i=1;i<=5;i++)
while(1){
if((PINC&(1<<PD0))==0)
{PORTD=0x00;
_delay_ms(250);
PORTD=0xFF;}
else
  {PORTD=0x00:}
}
}

Но почему то светодиод моргает бесконечно ? Если убираю while(1) то мигает ровно 5 раз но не работает от кнопки Помогите пожалуйста !!!!!

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

код программы вставляйте с тегом [ code ][ /code ] (кнопка "Код" на панели редактора сообщений )

а что должно произойти если кнопку отжали,а СД не успел мигнуть 5 раз? потухнуть или до мигать до пяти?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ты как-то вложенность циклов перепутал.

Лучше начинай делать программу с блок-схемы алгоритма её работы.

Микроконтроллер не останавливается когда дойдет до конца программы - у него такого понятия попросту не существует, и пока не переведешь в спящий режим он будет выполнять команды по очереди... Но что он будет выполнять когда программа закончится? А закончится только заполненная область памяти, а дальше будут сплошные $FFFF, это будет соответствовать какой-то команде и он будет что-то делать пока не вернется снова в "обитаемую" часть программы, но что он за это время сделает - предсказать трудно да и не нужно, просто нельзя допускать такой ситуации, поэтому основная часть программы - это бесконечный цикл.

Внутри цикла, надо проверять нажатие кнопки, и если она НЕ НАЖАТА - переход на начало цикла, ИНАЧЕ выполнить алгоритм мигания 5 раз, ну это уже банальный цикл в 5 итераций.

У тебя кстати еще одна задержка отсутствует. Надо засветить светодиод, подождать, погасить светодиод и СНОВА подождать. иначе, в погашенном состоянии светодиод будет считанные микросекунды.

Если надо, внутри цикла снова делать проверки - если кнопка ОТЖАТА - переход на начало программы, с таким условием схема перестанет мигать.

После 5 миганий крутимся на месте пока кнопка НЕ ОТЖАТА, если она будет нажата в этот момент это приведет к повторному срабатыванию схемы и цикл не закончится никогда. Если же на этот момент кнопка и так будет отжата - программа пойдет дальше и тут же попадет на начало алгоритма ожидая нажатие кнопки.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Alexeyslav, зря распинаешься. Допустим коэффициент восприятия равен Θ. При Θ -> 0, даже при потоке информации равном бесконечности, если помножить на коэффициент восприятия, в данном случае получим стремящимся к 0 целых и столько же десятых.

Поэтому ответ на данный вопрос следует начинать с вопроса: какой бюджет?

Ссылка на комментарий
Поделиться на другие сайты

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Не зря. Зря только, что ответ ны этот пост не от топикстартера.

Изменено пользователем marinovsoft
Ссылка на комментарий
Поделиться на другие сайты

код программы вставляйте с тегом [ code ][ /code ] (кнопка "Код" на панели редактора сообщений )

а что должно произойти если кнопку отжали,а СД не успел мигнуть 5 раз? потухнуть или до мигать до пяти?

потухнуть

Ты как-то вложенность циклов перепутал.

Лучше начинай делать программу с блок-схемы алгоритма её работы.

Микроконтроллер не останавливается когда дойдет до конца программы - у него такого понятия попросту не существует, и пока не переведешь в спящий режим он будет выполнять команды по очереди... Но что он будет выполнять когда программа закончится? А закончится только заполненная область памяти, а дальше будут сплошные $FFFF, это будет соответствовать какой-то команде и он будет что-то делать пока не вернется снова в "обитаемую" часть программы, но что он за это время сделает - предсказать трудно да и не нужно, просто нельзя допускать такой ситуации, поэтому основная часть программы - это бесконечный цикл.

Внутри цикла, надо проверять нажатие кнопки, и если она НЕ НАЖАТА - переход на начало цикла, ИНАЧЕ выполнить алгоритм мигания 5 раз, ну это уже банальный цикл в 5 итераций.

У тебя кстати еще одна задержка отсутствует. Надо засветить светодиод, подождать, погасить светодиод и СНОВА подождать. иначе, в погашенном состоянии светодиод будет считанные микросекунды.

Если надо, внутри цикла снова делать проверки - если кнопка ОТЖАТА - переход на начало программы, с таким условием схема перестанет мигать.

После 5 миганий крутимся на месте пока кнопка НЕ ОТЖАТА, если она будет нажата в этот момент это приведет к повторному срабатыванию схемы и цикл не закончится никогда. Если же на этот момент кнопка и так будет отжата - программа пойдет дальше и тут же попадет на начало алгоритма ожидая нажатие кнопки.

как это реализовать программно ? помогите , направте на путь истинный. Очень хочу разобраться !!!!!!!

Ссылка на комментарий
Поделиться на другие сайты

Так я все уже написал, рисуйте блок-схему, а потом по блок-схеме каждый кубик раскрывайте в виде строчек программы. Чего уж тут сложного.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

while(1)
    {
      if((PINC&(1<<PD0))==0)
       {
         inc i++;
         if(i<6)
           {
            PORTD=0x00;
            _delay_ms(250);
            PORTD=0xFF;
            _delay_ms(250);      
            }
          if(i>6) i=6;
       }
     else
       {
        PORTD=0x00;
        i=0; 
       }
    }

это работает в протеусе как надо!Только avr studio не съело inc i++; написал просто i++ все скомпилировалось но с одним предупреждением

Ссылка на комментарий
Поделиться на другие сайты

Я думаю правильней написать "INC i" а "i++" есть не сто иное как синоним, только в отличие от первой записи его можно использовать в выражении.

Переход на определенные метки осуществляется при помощи GOTO, или какой там аналог в Си...

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Есть в си и метки и goto, но применение их крайне нежелательно

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

Ссылка на комментарий
Поделиться на другие сайты

пример будьте любезны...

есть жалкое подобие в виде break и continue - передача управления на оператор следующий за циклом на один уровень вверх

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

 while(1)
  {
 	for(int i=0;i<100;i++)
   	{
........
   goto exit;
........
   	}
   }
   exit: printf("Быстрый выход из вложенных циклов");

Но еще раз повторю - использование goto и меток это моветон.

Изменено пользователем IIIytNIK

Молодых и талантливых чрезвычайно много. Целеустремлённых и готовых довести дело до конца — гораздо меньше.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...