roboforum.ru

Технический форум по робототехнике.

 

Магический кристалл

Обсуждаем рождающиеся мысли и результаты экспериментов.

Re: Магический кристалл

Сообщение Angel71 » 15 мар 2010, 18:51

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

Re: Магический кристалл

Сообщение blindman » 15 мар 2010, 18:55

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

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

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

Re: Магический кристалл

Сообщение GrayHunter » 15 мар 2010, 20:13

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

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

Re: Магический кристалл

Сообщение yak-40 » 15 мар 2010, 20:21

Кароче!
Вот схема:
cxema.GIF

Вот рабочая программа:
Код: Выделить всёРазвернуть

#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 секунд:
Кстати, советую поставить Протеус для моделирования схем.
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3019
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Магический кристалл

Сообщение rig » 15 мар 2010, 20:50

две строчки яб добавил, на гашение светодиодов.
Код: Выделить всёРазвернуть

#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 раз(а).
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Магический кристалл

Сообщение GrayHunter » 15 мар 2010, 23:15

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

Re: Магический кристалл

Сообщение =DeaD= » 15 мар 2010, 23:28

- Если ножка 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]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Re: Магический кристалл

Сообщение rig » 15 мар 2010, 23:34

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

Re: Магический кристалл

Сообщение yak-40 » 15 мар 2010, 23:44

Ну пожалуйста, точно по техзаданию :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 раз(а).
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3019
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Магический кристалл

Сообщение rig » 15 мар 2010, 23:49

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

Re: Магический кристалл

Сообщение =DeaD= » 15 мар 2010, 23:49

GrayHunter, чувствуете как на Си помощников добавилось? ;)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Re: Магический кристалл

Сообщение yak-40 » 15 мар 2010, 23:52

rig писал(а):автора не устаривает отсутствие оператора goto XX?

Ага! И простота программы :ROFL:
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3019
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: Магический кристалл

Сообщение rig » 15 мар 2010, 23:55

нее, вы меня в эту дыру не затягивайте ,я спать пошел, мне еще работать нада со сранья пока вы спать будете.

Добавлено спустя 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 сек.
}
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: Магический кристалл

Сообщение GrayHunter » 16 мар 2010, 02:17

Спасибо за примеры, но я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена? Так же вроде никто не вывел в подпрограмму мигание ("быстрое прогорание")... Так у меня код программы будет не около 300, как на asm, а около 1000 строк на Си, наверное. :o

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

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

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

В общем, если я не прав - поправьте плз, желательно с примерами, а то теоретически у меня вот так всё пессимистично получается :sorry:
GrayHunter
 
Сообщения: 231
Зарегистрирован: 06 июн 2009, 20:42
Откуда: Москва

Re: Магический кристалл

Сообщение rig » 16 мар 2010, 07:00

по условию задачи проверка перемычек на ПП не тянет
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 строк на
Си, наверное
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Пред.След.

Вернуться в Идеи

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

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

Mail.ru counter