Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

MOHCTEP писал(а):Так и мне непонятно, оттого и спросил.))
Прикольно :)) Т.е. Вы делаете что-то, что известно только Вам, а мы должны понять это :))

Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Ага, кажется я понял Вас.
Тут без флоата не обойтись. По крайней мере будет 2 переменные.
Одна будет равна размеру массива, делённому на tot.
Вторая - шаги. Обнуляем её и прибавляем к ней значение первой переменной tot раз. Целой частью от второй переменной при каждом шаге - будет индексом массива каждого шага.

ЗЫ. Ещё тут напрашивается алгоритм Брезенхема, но никак не могу сообразить, как его применить. Нужно думать...
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Вопросы по С/С++ (СИ)

Сообщение MOHCTEP »

Боюсь открывать "секрет", а то китайцы сопрут смеяться будете, а я, с горя, расфигачу макетку об пол и погибнет очередной "здравствуй мир" на светодиодах. :))
Нельзя поделить 16-ти метровую верёвку на 9 одинаковых кусков, длиной, равной целому значению метров.
Все точно. Я ж и просил "по возможности равномерно". Т.е. пропуски могут немного и различаться. Важно распределиться по исходному массиву.
Вот и застрял на этой самой равномерности. На я.в.у. эта задачка решается в 5 секунд, через округление, скажем этакого "процентного" индекса.

ЗЫ. Увидел Ваш ответ, после отправки. Ну примерно так и делаю, только пытался обойтись целочисленной математикой. А она "забака такая" накапливает ошибку. :(
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Только с целочисленной не обойтись, ибо нужно деление, т.к. известно только кол-во отрезков.
Можно сделать с фиксированной точкой, но тогда придётся делать бешеные умножения и деления на 10 в n-ной степени. Что тоже не айс.

На я.в.у. эта задачка решается в 5 секунд
А Вы на чём пишите ? Вроде вопрос задали в теме по Си :dont_know:
И ещё. Какие вычисления (умножения, деления, ... ) допустимы в реализации ?
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Вопросы по С/С++ (СИ)

Сообщение MOHCTEP »

На Си и пишу. Просто, после ООПешных, да скриптовых разгульных возможностей, здесь тяжеловато. Пытаю сейчас тиньку2313. Тут всего 2 к флеша и оперативы совсем ничего, так что с флоатом не разгуляться.
придётся делать бешеные умножения и деления на 10 в n-ной степени.
Так. А если умножать/делить на 2^n?

Хотел видео на ютуб закинуть, но 380 кило полчаса грузит, это - от души.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

MOHCTEP писал(а):Так. А если умножать/делить на 2^n?
Ну можно и на 2^n. Только нужно прикинуть минимальную точность для фиксированной точки.
Можно взять 256, хорошо на него и делить и умножать.
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Вопросы по С/С++ (СИ)

Сообщение MOHCTEP »

Спасибо! :beer: Попробую, авось что-то да получится. :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Получится, куда оно денется.
16 (кол-во ячеек) умножаем на 256 (это запись 16-ти в старший байт и очистка младшего), получаем делимое. Далее делим его на tot, получаем шаг. Единственное громозкое вычисление.
Потом берём другую переменную, обнуляем её и с каждым шагом прибавляем результат деления на tot. Индексом в массиве будет - старший байт. Младший не трогаем, он будет некой дробной частью после точки.
Всё :)
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Вопросы по С/С++ (СИ)

Сообщение MOHCTEP »

Аlex и еще раз - спасибо за разъяснения! :) Теперь и я, с моим минимальным багажом СИ, вижу "удачность" такого подхода.
ЗЫ. Жаль, не могу повлиять на Вашу карму. :(
Ой! :shock: кармомет сработал! :)))
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение GARMIN »

Вот и разобрались с алгоритмом Брезенхема!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

Всем Доброго дня!!!!
Нашел код для работы с прерыванием, перечитал, пересмотрел многое по прерывание, но что-то программа не работает так как мне надо.
В примере где я его нашел все работает.

где, что я не учел прошу подсказать....

//Кнопка и светодиод.
//при нажатии кнопки светодиод загорается,при отжатии гаснет...
//у меня в протеусе изначально не горит, при нажатии загорается и не гаснет совсем....

// ATtiny16


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


ISR (INT0_vect)
{
PORTC|=(1<<1);

}


int main(void)

{
DDRC |=(1<<1);
PORTC&=~(1<<1);

MCUCR&=~(1<<0);
GICR|=(1<<6);

sei();

while(1)
{
cli();
};

}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ROMan2947 писал(а):при нажатии загорается и не гаснет совсем
ну а чего вы хотели, если в коде есть только включение, но нет отключения?

Код: Выделить всё

ISR (INT0_vect)
{
PORTC ^= (1<<1);
}
и в главном цикле убрать запрет прерываний! как же вы будете работать с прерываниями, если запрещаете их?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

ARV писал(а):
ROMan2947 писал(а):при нажатии загорается и не гаснет совсем
ну а чего вы хотели, если в коде есть только включение, но нет отключения?

Код: Выделить всё

ISR (INT0_vect)
{
PORTC ^= (1<<1);
}
и в главном цикле убрать запрет прерываний! как же вы будете работать с прерываниями, если запрещаете их?

Я по такой же аналогии думал,но меня смущал тот момент, что в примере все работает именно по коду указанному выше...
вот ссылка на пример http://www.youtube.com/watch?v=8H7FOQp1 ... W6&index=7
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.

И пример в видео тоже не ахти - светодиод зажжётся только один раз при первом нажатии кнопки и больше свое состояния не поменяет. А то и вообще и без нажатия зажжётся на старте контроллера.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.




Ну asm("nop") это я так понимаю на ассемблере разрешение прерывания. Ну я заменил его на Си как cli(); или я что-то недопонимаю...(
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.

И пример в видео тоже не ахти - светодиод зажжётся только один раз при первом нажатии кнопки и больше свое состояния не поменяет. А то и вообще и без нажатия зажжётся на старте контроллера.




Блин вот такие видосы и сбивают с истинного пути...
поправьте пож. так как будет все работать, разберу все сначала...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

ARV писал(а):я вам сказал, что и как исправить, чтобы заработало в протеусе. в реале могут быть проблемы с дребезгом контактов кнопки.




ну поставил я в модуль прерывания отключение светодиода,между вкл и отлк задержку вставил...но почему же у меня при нажатой кнопке светодиод все таки гаснет, а не продолжает гореть...программа обрабатывает код указанный в прерывании, почему снова не уходит в прерывание..??
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Посмотрите на что-то вроде
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom16.h>

#define LED_DDR  DDRC
#define LED_PORT PORTC
#define LED      (1<<1)

#define BTN_DDR  DDRD
#define BTN_PIN  PIND
#define BTN      (1<<2)

static char status = 0;

ISR (INT0_vect)
{
  if (status)
    LED_PORT &= ~LED;
  else
    LED_PORT |= LED;

  status = !status;
}

int main(void)
{
  BTN_DDR &= ~BTN;      // Set as input
  LED_DDR |= LED;       // Set as output

  GICR |= (1<<INT0);    // Enable INT0
  MCUCR &= ~(1<<ISC10); // Any logical change

  sei();

  while (1) {
  }

  return 0;
}
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Re: Вопросы по С/С++ (СИ)

Сообщение ROMan2947 »

WiseLord писал(а):Посмотрите на что-то вроде
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom16.h>

#define LED_DDR  DDRC
#define LED_PORT PORTC
#define LED      (1<<1)

#define BTN_DDR  DDRD
#define BTN_PIN  PIND
#define BTN      (1<<2)

static char status = 0;

ISR (INT0_vect)
{
  if (status)
    LED_PORT &= ~LED;
  else
    LED_PORT |= LED;

  status = !status;
}

int main(void)
{
  BTN_DDR &= ~BTN;      // Set as input
  LED_DDR |= LED;       // Set as output

  GICR |= (1<<INT0);    // Enable INT0
  MCUCR &= ~(1<<ISC10); // Any logical change

  sei();

  while (1) {
  }

  return 0;
}



спасибо!!! но этот немного другая тема по-моему...
Ответить

Вернуться в «Разные вопросы по МК»