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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

леня писал(а):как нажатием на кнопку к переменной единичку прибавить ?

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

Переменная = 0
Кнопка нажата?
Если да, то переменная = переменная+1

Где-то так.
:)
С уважением,
Виктор.
Аватара пользователя
леня
Это не хвост, это антенна
Сообщения: 1399
Зарегистрирован: Пн сен 13, 2010 17:34:06
Откуда: калуга
Контактная информация:

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

Сообщение леня »

я уже так пытался

Переменная = 0
Кнопка нажата?
Если да, то переменная = переменная+1 (вот это вот условие мк успевает проверять хрен знает сколько раз пока кнопка нажата и к переменной прибавляется не 1 а много )
ВРУБАЙ !!!
И будь что будет !!!
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Поставь ловушку, чтобы прога дальше не шла, пока кнопку не отпустишь
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

леня писал(а):(вот это вот условие мк успевает проверять хрен знает сколько раз пока кнопка нажата и к переменной прибавляется не 1 а много )

леня писал(а):не в микроконтроллере

Где ваша логика? Что вообще вы хотели сказать?Запутать пытались? Нужно вопрос правильно задавать, а не загадками.
Вам же предлагали уже

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

If (key_press()){var++;} 

Нужно добавить сюда ловушку будет так:

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

If (key_press()){var++;while(key_press());} 


И все равно нужно будет делать защиту от дребезга.Тут уже где-то приводили на форуме код опроса клавиатуры с антидребезгом на таймере.
В поисках истины человек развивается.
Аватара пользователя
леня
Это не хвост, это антенна
Сообщения: 1399
Зарегистрирован: Пн сен 13, 2010 17:34:06
Откуда: калуга
Контактная информация:

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

Сообщение леня »

Где ваша логика? Что вообще вы хотели сказать?Запутать пытались? Нужно вопрос правильно задавать, а не загадками.

после не запятую забыл поставить :oops:

If (key_press()){var++;while(key_press());}

а как понять где тут пин с кнопкой ?
ВРУБАЙ !!!
И будь что будет !!!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

я так полагаю автор предполагал, что это функция, возвращаяющая состояние кнопки. Таким же точно образом можно было написать

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

#define KEY_PIN 5 
#define KEY_PORT PORTB
#define KEY_PRESS KEY_PORT&(1<<KEY_PIN)
 
If (KEY_PRESS){var++;while(KEY_PRESS);} 
 

и вместо вызова подпрограммы, отнимающего как минимум четыре такта просто опрашивается регистр нужного порта на предмет нажатия кнопки.
Но этот код опять же не спасет от дребезга.
В поисках истины человек развивается.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Сообщение БАТАРЕЙКУС »

Доброго времени суток.
мужики такая проблема, программирую PIC18F452, пишу на Си в МСС18, и вот проблема не могу создать массив объёмом, больше 227 ячеек. а нужно 512. причём у пика памяти 1,5 килобайта. в чём проблема то ?

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

char Buffer[512] ;

MPLINK 4.34, Linker
Copyright (c) 2009 Microchip Technology Inc.
Error - section '.udata_MMC.o' can not fit the section. Section '.udata_MMC.o' length=0x0000021d
Errors : 1
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Нужно править файл линкера и , если только для одного проекта, то добавить его в папку с проектом и подключить к проекту.
http://kevin.org/frc/C18_3.0_getting_started.pdf 108 стр.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

БАТАРЕЙКУС, Похоже была нарушена последовательность создания проекта и поэтому компилятор пытается в другой Мк ваш массив запихать.Нужно указать ему какой камень.Или возможно где то настраивается область оперативной памяти.
В поисках истины человек развивается.
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

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

Сообщение spectral1 »

привет!

ковыряю ацп, хочу отправить значение ацп по юарту, но есть проблема. значение ацп - 32 бита, а по юарту я могу только 8 отправить. у меня есть функция отправки массива char по юарту. вопрос: как мне можно преобразовать это 32 битное число(int) в char? либо разбить 32 битное число на 4 восьмибитных? подскажите пожалста.

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

void send_to_uart(uint8_t data) 
{
   while(!(USART1->SR & USART_SR_TC));                   // wait ready
   USART1->DR=data;                                                 // send
}

void send_str(char * string)
{
   uint8_t i=0;
   while(string[i])
   {
      send_to_uart(string[i]);
      i++;
   }
   send_to_uart('\r');
   send_to_uart('\n');
}
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

spectral1 писал(а): либо разбить 32 битное число на 4 восьмибитных?


Ну да.
А что за АЦП 32-битный ? Бывают в природе ?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Jack_A писал(а): А что за АЦП 32-битный ? Бывают в природе ?

Самый точный Дельта-Сигма мне попадался 24-х битный.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

леня писал(а):а как понять где тут пин с кнопкой ?
Ну вот те вариант по подробней.....
В порт выводится переменная, которая инкрементируется после нажатия кнопки

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

//#######################################################################################################################
// включаемые файлы
#define F_CPU 9600000
#include <util/delay.h>
#include <avr/io.h>

//дефайны
#define BtnPort PINB                     /*порт подключения кнопки*/
#define BtnPin (1<<4)                     /*пин подключения кнопки*/

#define LedPort PORTB                     /*порт подключения светодиода*/

//#######################################################################################################################
//Главная функция
int main (void)
{
   DDRB = 1+2+4+8;                        //включение линий светиков на вывод
   PORTB = BtnPin;                        //включит подтяжку на кнопке

   unsigned char var =0;      

   while(1)                           //главный цикл
   {
      if (!(BtnPort & BtnPin))               
      {                              //если нажата клавиша, увеличить значение переменной
         LedPort = ++var;               //выводим в порт увеличенную переменную
         _delay_ms(50);                  //делаем небольшую паузу, чтобы пропустить дребезг
         while (!(BtnPort & BtnPin))         //ожидание отпускания кнопки (с небольшой задержкой)
            _delay_ms(50);               
      }
   }
}

//#######################################################################################################################
Вложения
simple_button_proteus.rar
(23.88 КБ) 152 скачивания
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

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

Сообщение spectral1 »

Jack_A писал(а): Ну да.
А что за АЦП 32-битный ? Бывают в природе ?

на stm32f103re такой
пардон, там 16 бит :)
но сути дела не меняет

UPD
если объявить результат вычисления ацп как восьмибитное число и отправить его в уарт вот так:

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

send_to_uart(adc_res);

то в терминале будет это:

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

<00><00>’–”‰Ž¥‘X<00>

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

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

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

spectral1, буквально 2-3 странички назад отлистните и найдёте ответ на свой вопрос. Там как раз подобное разбирали и кучу вариантов предлагали.
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

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

Сообщение spectral1 »

Аlex писал(а):spectral1, буквально 2-3 странички назад отлистните и найдёте ответ на свой вопрос. Там как раз подобное разбирали и кучу вариантов предлагали.

спасибо! с указателями вроде разгребся, сделал так:


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

uint32_t adc_res;
char buf[4];
uint32_t *pbuf;

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

adc_res = ADC1->JDR1;
pbuf = &adc_res;
buf[0] = *pbuf;
send_str(buf);

правильно?

однако, в терминале все равно вместо значений АЦП это:

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

b
L
K
K
%
'
"
5
+
'
+


UPD
я тут подумал, а через юарт можно посылать двоичные числа, а если можно то как? :)
у меня переменная, в ней двоичное число, как вывести его через юарт?
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Сообщение БАТАРЕЙКУС »

Аlex писал(а):Нужно править файл линкера и , если только для одного проекта, то добавить его в папку с проектом и подключить к проекту.
http://kevin.org/frc/C18_3.0_getting_started.pdf 108 стр.


что то я не разобрался, как и что надо прописывать в исходнике?
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

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

БАТАРЕЙКУС писал(а):как и что надо прописывать в исходнике?
Не в исходнике, а в скрипте линкера. В документе же даже пример есть, что и на что нужно поменять.
В исходнике только нужно указать в какую секцию нужно "укладывать" Ваш массив. В доке это тоже написано.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

spectral1 писал(а):я тут подумал, а через юарт можно посылать двоичные числа, а если можно то как? :)
у меня переменная, в ней двоичное число, как вывести его через юарт?
А что, собственно, вам надо? Если просто увидеть число в терминале, вы должны в МК преобразовать число в ASCII-последовательность, т.к. терминал только такие символы и отображает. Если вы хотите передать число в клиентскую программу на компе с последующим использованием его именно как числа - тут нужна бинарная пересылка. С разбиением на байты перед передачей и сборкой числа на принимающей стороне. Пока не ясно, что вам надо?.
С уважением,
Виктор.
Ответить

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