roboforum.ru

Технический форум по робототехнике.
Текущее время: 27 ноя 2024, 10:34

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 266 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16, 17, 18  След.
Автор Сообщение
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 18:51 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
:) да не, компилятор нормальный. эт он после такого кода перед тем как повеситься тоже малость решил пошутить


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 18:55 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Ну да, если компилятор пропускает ошибки, что ему еще остается :)

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 20:13 
Не в сети

Зарегистрирован: 06 июн 2009, 20:42
Сообщения: 231
Откуда: Москва
Цитата:
По поводу первой ошибки: goto из одной функции в другую не прыгает.
а как тогда прыгать из одной в другую (из одного места программы в другое)? В asm с этим проблем не было. :sorry: Неужели придётся вводить ещё одну переменную, чтобы записывать в неё должный выбор, а потом проверку этой переменной...хотя проверяться-то всё ровно в функции будет... запутался, помогите плз. Писали, что на Си лучше и помощников больше будет, а реально на asm я за такое же время уже почти всё написал тогда)

Цитата:
По поводу второй: в main мешает зайти вот этот бесконечный цикл while (1 != 1);
дык, где-то (у AVR123?) написано было, что функции, которые потом вызывают, определяются до main - я так понял, что это и есть подпрограммы. Так же было написано, что читать код начинают с main - причём здесь тогда все те функции, что находятся до main? :o


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 20:21 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Кароче!
Вот схема:
Вложение:
cxema.GIF
cxema.GIF [ 34.17 КиБ | Просмотров: 1869 ]

Вот рабочая программа:
Код:

#include <mega8.h>
#include <delay.h>

/////////////////// функция инициализации портов ////////
void init(void)
{
DDRB=0b00000110;               // PB1 PB2 на выход
DDRD=0b00000000;               // PORTD на вход
PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы 
}
////////////////// основная функция /////////////////////
void main(void)

  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    { 
     if(PIND.0)                 // сканируем кнопку если нажата
         PORTB.1 = ~PORTB.1;    // то мигаем синим светодиодом
         else                   // если нет
          PORTB.2 = ~PORTB.2;   // то зелёным
       delay_ms(500);           // пауза 0,5 сек.
    }
}
/////////////////// end /////////////////////////////////

Вот архив с поектом в CVAVR и рабочей моделью в протеусе.
Вложение:
1.rar [17.04 КиБ]
Скачиваний: 0

Разбирайся :)

Добавлено спустя 1 минуту 28 секунд:
Кстати, советую поставить Протеус для моделирования схем.

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 20:50 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
две строчки яб добавил, на гашение светодиодов.
Код:

#include <mega8.h>
#include <delay.h>

/////////////////// функция инициализации портов ////////
void init(void)
{
DDRB=0b00000110;               // PB1 PB2 на выход
DDRD=0b00000000;               // PORTD на вход
PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы 
}
////////////////// основная функция /////////////////////
void main(void)

  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    { 
     if(PIND.0==0)                 // сканируем кнопку если нажата PD0=0
         {if (PIND.1 && PIND.2)   // и  не нажаты PD1=1 и PD2=1
              PORTB.0 = 1;       // вкл РВ0                                     
          else                   // если нажата PD0==0 и нажата любая PD1 и PD2
              PORTB.2 = ~PORTB.2;// мигаем, тут можно уйти на ПП мигания.             
         }
     else                         // если не нажата PD0==1
         {PORTB.0 = 0             // то гасим РВ0         
         }
     delay_ms(500);           // пауза 0,5 сек.
    }
}
/////////////////// end /////////////////////////////////


Последний раз редактировалось rig 15 мар 2010, 23:45, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:15 
Не в сети

Зарегистрирован: 06 июн 2009, 20:42
Сообщения: 231
Откуда: Москва
Спасибо за пример, но он слишком лёгкий и не помогает ответить на мои вопросы. Не обижайтесь, пожалуйста, но мне нужно другое, чтобы понять логику Си.
Мне нужен работающий код, который бы делал то, что я пытался сделать в этом посте. Думаю, что многое бы для меня прояснило. (можно без скринов и проекта для протеуса - кода с комментариями было бы досаточно :roll: )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:28 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
Цитата:
- Если ножка PD0 соединена с землёй, и если ни одна из ножек PD1 и PD2 не соединены с землёй, то подать напряжение на ножку PB0.
- Если ни одна из ножек (PD0, PD1, PD2) не соединены с землёй, то убрать напряжение с ножки PB0.
- Если ножка PD0 соединена с землёй, а так же если хотя бы одна из ножек PD1 и PD2 соединены с землёй, то "поморгать" (метка: Fast_Burning).

Код:
while(1=1){
 
  if(PIND.0==1){
    if((PIND.1==1)&&(PIND.2==1)){
      PORTB.0=0
    }else{
      //?????
    };
  }else{
    if((PIND.1==1)&&(PIND.2==1)){
      PORTB.0=1
    }else{
      //Flashing PB0
      PORTB.0^=1;
    };
  };
 
  delay_ms(500);
};

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:34 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
подправил свою редакцию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:44 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Ну пожалуйста, точно по техзаданию :D
Цитата:
- Если ножка PD0 соединена с землёй, и если ни одна из ножек PD1 и PD2 не соединены с землёй, то подать напряжение на ножку PB0.
- Если ни одна из ножек (PD0, PD1, PD2) не соединены с землёй, то убрать напряжение с ножки PB0.
- Если ножка PD0 соединена с землёй, а так же если хотя бы одна из ножек PD1 и PD2 соединены с землёй, то "поморгать" (метка: Fast_Burning).

Код:
#include <mega8.h>
#include <delay.h>

/////////////////// функция инициализации портов ////////
void init(void)
{
DDRB=0b00000110;               // PB1 PB2 на выход
DDRD=0b00000000;               // PORTD на вход
PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы   
}
////////////////// подпрограмма мигания ///////////////////
void flash(void)
{
PORTB.1 = 1;          // зажечь светодиод
delay_ms(500);        // пауза 0,5 сек.
PORTB.1 = 0;          // погасить светодиод
delay_ms(500);        // пауза 0,5 сек.   
}
////////////////// основная функция /////////////////////
void main(void)

  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    { 
     if(!PIND.0)                // сканируем первый контакт. если есть...
     {
       if(!PIND.1 || !PIND.2 )  // ...сканируем другие два контакта, если есть, мигаем светодиодом
         flash();               // подпрограмма мигания (или дыхания)
         else                   // если только первый
          PORTB.1 = 1;          // зажигаем постоянно
      }
      else PORTB.1=0;           // если нет контактов, гасим светодиод       
    }
}                                       
/////////////////// end /////////////////////////////////

Или всё равно просто?

Добавлено спустя 54 секунды:
О! пока писАл, уже опередили :lol:

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Последний раз редактировалось yak-40 16 мар 2010, 00:14, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:49 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
устал уже мониторить тему.
автора не устаривает отсутствие оператора goto XX?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:49 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
GrayHunter, чувствуете как на Си помощников добавилось? ;)

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:52 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
rig писал(а):
автора не устаривает отсутствие оператора goto XX?

Ага! И простота программы :ROFL:

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 15 мар 2010, 23:55 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
нее, вы меня в эту дыру не затягивайте ,я спать пошел, мне еще работать нада со сранья пока вы спать будете.

Добавлено спустя 2 минуты 20 секунд:
вот вам, даже полос прокрутки нет :P
Код:
while(1)
{   if(PIND.0==0)                 // сканируем кнопку если нажата PD0=0
         {if (PIND.1 && PIND.2)   // и  не нажаты PD1=1 и PD2=1
              PORTB.0 = 1;       // вкл РВ0                                     
          else                   // если нажата PD0==0 и нажата любая PD1 и PD2
              PORTB.2 = ~PORTB.2;// мигаем, тут можно уйти на ПП мигания.             
         }
     else                         // если не нажата PD0==1
         {PORTB.0 = 0             // то гасим РВ0         
         }
     delay_ms(500);           // пауза 0,5 сек.
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 16 мар 2010, 02:17 
Не в сети

Зарегистрирован: 06 июн 2009, 20:42
Сообщения: 231
Откуда: Москва
Спасибо за примеры, но я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена? Так же вроде никто не вывел в подпрограмму мигание ("быстрое прогорание")... Так у меня код программы будет не около 300, как на asm, а около 1000 строк на Си, наверное. :o

Дело в том, что проверить мне нужно все три ножки отдельно, т.е.:
- проверить есть ли перемычка на ножке (условно назовём её так:) 1, и не замкнуты ли ножки 2 и 3
- проверить есть ли перемычка на ножке 2, и не замкнуты ли ножки 1 и 3
- проверить есть ли перемычка на ножке 3, и не замкнуты ли ножки 1 и 2
- если перемычки/замкнуто больше одной, то "быстро прогорать"
- если перемычек нет - просто моргать (технически)
- ...

А ведь это всего лишь "режим ожидания" кристалла, который будет работать лишь до того момента, пока не замкнут какие-нибудь из определённых ножек, и только потом начнётся сама программа, с аналогичными проверками перемычек, которые позволят МК понять, где он находится, и выполнить и "дыхание" с нужной частотой, и управлять "зарядом кристалла"... Насколько я понимаю, на Си это всё будет один сплошной геморой/куча вложенных друг в друга функций if и т.п...

Если я примерно правильно себе всё это представил, то чем же тогда Си здесь лучше asm, если на asm гораздо меньше ограничений по расположению действий, подпрограмм? В asm, насколько я понимаю, можно в любой момент, не нарушая целостности кода/не переписывая всё чуть ли с нуля, убрать любое действие в подпрограмму (далее - "пп"), свободно прыгать между пп, и много чего ещё, что реализуется на Си через длинную череду связанных межу собой функций, где чтобы кардинально изменить одну - придётся менять и другие так же кардинально, т.к. сломается "стержень логики"...

В общем, если я не прав - поправьте плз, желательно с примерами, а то теоретически у меня вот так всё пессимистично получается :sorry:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 16 мар 2010, 07:00 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
по условию задачи проверка перемычек на ПП не тянет
GrayHunter писал(а):
Спасибо за примеры, но я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена?


ну а усложнять задачу надо до написания кода а не после:
GrayHunter писал(а):
Дело в том, что проверить мне нужно все три ножки отдельно, т.е.:
- проверить есть ли перемычка на ножке (условно назовём её так:) 1, и не замкнуты ли ножки 2 и 3
- проверить есть ли перемычка на ножке 2, и не замкнуты ли ножки 1 и 3
- проверить есть ли перемычка на ножке 3, и не замкнуты ли ножки 1 и 2
- если перемычки/замкнуто больше одной, то "быстро прогорать"
- если перемычек нет - просто моргать (технически)
- ...


и как понимать
GrayHunter писал(а):
- проверить есть ли перемычка на ножке (условно назовём её так:) 1, и не замкнуты ли ножки 2 и 3- проверить есть ли перемычка на ножке 2, и не замкнуты ли ножки 1 и 3- проверить есть ли перемычка на ножке 3, и не замкнуты ли ножки 1 и 2

что етсь перемычка и что есть замкнуто.Схему надо ваших мыслей.

Это разве проблема??? что будем делать со свободной памятью? Быстродействия хватает, так зачем ужиматься :pardon: Когда все заработает, можно потратить время на компактность кода.
GrayHunter писал(а):
Так у меня код программы будет не около 300, как на asm, а около 1000 строк на
Си, наверное


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 266 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16, 17, 18  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO