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

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

Сообщение ut1wpr »

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

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

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

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

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

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

Сообщение zero648 »

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

Сообщение vitalik_1984 »

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

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

If (key_press()){var++;} 
Нужно добавить сюда ловушку будет так:

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

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

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

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

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

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

Сообщение 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);} 
 
и вместо вызова подпрограммы, отнимающего как минимум четыре такта просто опрашивается регистр нужного порта на предмет нажатия кнопки.
Но этот код опять же не спасет от дребезга.
В поисках истины человек развивается.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Доброго времени суток.
мужики такая проблема, программирую 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
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение vitalik_1984 »

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

Сообщение 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');
}
Друг Кота
Аватара пользователя
Сообщения: 6335
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

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

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

Сообщение 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 КБ) 155 скачиваний
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

Сообщение spectral1 »

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

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

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

send_to_uart(adc_res);
то в терминале будет это:

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

<00><00>’–”‰Ž¥‘X<00>
нули - это когда на входе ацп ноль - остальное, когда значение не ноль. текстовые сообщения норм доходят. как правильно переменную отправить?
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение 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
я тут подумал, а через юарт можно посылать двоичные числа, а если можно то как? :)
у меня переменная, в ней двоичное число, как вывести его через юарт?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Аlex писал(а):Нужно править файл линкера и , если только для одного проекта, то добавить его в папку с проектом и подключить к проекту.
http://kevin.org/frc/C18_3.0_getting_started.pdf 108 стр.
что то я не разобрался, как и что надо прописывать в исходнике?
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

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

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

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

Сообщение ut1wpr »

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

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