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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

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

А если серьезно - ну учится человек, чем дальше тем лучше будет. Может быть не было времени заниматься "причесыванием" кода. Если захочет представить свой код на суд нам - то так и напишет :)).
Изображение only pure true norwegian blackx Изображение
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Я так думаю, что если работал код в целом виде, то лучше так его и использовать. А если захотелось модули сделать, то лучше не из готового кода их сделать, а продуманно в каждый модуль нужные только там функции помещать и относящиеся только к этому модулю.Ну и про объявление не забывать :)
Так же чтобы не было ошибок необходимо делать блокировку повторного подключения модулей, как было в статье по ссылке.
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

vitalik_1984 писал(а): Так же чтобы не было ошибок необходимо делать блокировку повторного подключения модулей, как было в статье по ссылке.
Всегда было интересно, почему препроцессор сам этого не делает :roll:.
Изображение only pure true norwegian blackx Изображение
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Сообщение AVT-28 »

Вывод времени в привычном формате.
У меня давнишняя проблема вывода времени в привычном формате.
А вот теперь сделал одну штуку на заказ за денежку. А вот с временем так и не разобрался что бы это сделать без извращений в языке.

Поясню. Обычно так 18:05 или 08:05
У меня так 18:5 или 8:5

Компилятор hi-tech, mplab. может в хайтеке есть уже какое то форматирование? Мануал пробовал почитать или слепой или не нашел. Да и в англицком совсем плохо.
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

AVT-28, смотря чем пользуешься для преобразования чисел соответствующих часам и минутам в строку.
Вообще это называется вывод с лидирующими нулями (leading zeros).
На Си вот так можно
printf("%09d", 4917);
Напечатает
000004917

Ну, или проверять на значения числа, и для случая <10 добавлять "0" к строке отдельно.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Сообщение 0259 »

Коты подскажите что не так пожалуйста это моя программка только учусь программировать и не могу разобраться с переменными
ответ можно? в личку а то я боюсь тут не найду не своего вопроса не ответа

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

#include <mega16.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{

PORTA=0x00;
DDRA=0x01;


PORTB=0x00;
DDRB=0x00;


PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0x00;


while (1)
      {
      {
      //volatile unsigned char del;
      volatile char del;
      if (PINB.0 == 1) {
      del = (1);
      };
      if (PINB.1 == 1) {
      del = (50);
      };
      if (PINB.2 == 1) {
      del = (2);
      };
      if (PINB.3 == 1) {
      del = (15);
      };
      if (PINB.4 == 1) {
      del = (20);
      };
      if (PINB.5 == 1) {
      del = (25);
      };
      if (PINB.6 == 1) {
      del = (30);
      };
      if (PINB.7 == 1) {
      del = (35);
      };
    
      
      PORTA.0 = 1;
      delay_ms(del);
      PORTA.0 = 0;
      
 


      };
}}
Последний раз редактировалось Аlex Пн фев 04, 2013 07:57:23, всего редактировалось 1 раз.
Причина: [code][/code]
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

А вопрос то какой ? :))
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Сообщение 0259 »

Аlex писал(а):А вопрос то какой ? :))
не могу разобраться с тем как правильно объявить переименую и с тем как её вызвать
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

как правильно объявить переименую
http://yandex.ru/yandsearch?clid=9582&t ... D0%B5&lr=2
как её вызвать
Как это ? Куда вызвать, на дом ? :))
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Сообщение 0259 »

Аlex писал(а):
как правильно объявить переименую
http://yandex.ru/yandsearch?clid=9582&t ... D0%B5&lr=2
как её вызвать
Как это ? Куда вызвать, на дом ? :))
конечно спасибо но поиском я пользоваться умею тем более яндексом.
вот что я нашел
http://123avr.com/05.htm
по лучше того что нашли вы
но вот как объявить переименую и потом взять то значение которое в ней находиться (лежит)(записано)
не знаю вот и обращаюсь сюда чтоб узнать
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

но поиском я пользоваться умею
Заметно...
Если бы умели, то не задавали бы вопросов, типа
но вот как объявить переименую и потом взять то значение которое в ней находиться (лежит)
Зачем тут по 100 раз переписывать то, что уже неоднократно написано другими и выложено в интернет ?
по лучше того что нашли вы
Ну ну... Дерзайте...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Сообщение 0259 »

написано и переписывалась теми кто учился так?
ну вот
и как раз учусь я
повторение мать ученья так что можно и нужно повторить специально для таких как я
не так обязательно поясничить проше ведь повторить более подробно описав?
Открыл глаза
Сообщения: 70
Зарегистрирован: Ср мар 28, 2012 10:46:17

Сообщение 0259 »

Аlex писал(а):http://www.misigames.h15.ru/yroki/C/kernigan.pdf
Курите...
вот так бы сразу! ото у вас то опыта огромный мешок сразу бы отсыпали да и всё
а то будто жалко вам!
спасибо сударь :))
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

ото у вас то опыта огромный мешок сразу бы отсыпали да и всё
Дак его, опыта этого, пол-интернета. Вы же поиском умеете пользоваться, что сами не нашли эту книгу ?
Мне бы вот было лень писать на форум, если можно найти ответ в течении 5 минут.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

спящий
СпойлерspiRoutine.h

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

#ifndef SPIROUTINE_H_
#define SPIROUTINE_H_

#include "stm32l1xx.h"
#include "stdio.h"

void spi_init(void);						//инициализация SPI
static void xmit_spi(uint8_t xmit_data);	//отправка числа
static char rcvr_spi(void);					//прием числа
static void send_cmd(char cmd,char arg);	//посылка пакета

#endif
-------------------------------------------------------------------------------------------------------------------------------
spiRoutine.c

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

#include "stm32l1xx.h"
#include "stdio.h"
#include "spiRoutine.h"

void spi_init(void)	
{
	RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; //Тактирование портов A, B
	//Линини SPI1 (Master)
	//PA12(MOSI), PA11(MISO), PA5(SCK), PA4(NSS) - AF, Push-Pull, AF5(SPI1)
	GPIOA->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER11_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER4_1; //Alternate function
	GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_12 | GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_5 | GPIO_OTYPER_OT_4); //Push-Pull
	GPIOA->AFR[1] |= (5<<16 | 5<<12); //PA12 = AF5, PA11 = AF5
	GPIOA->AFR[0] |= (5<<20 | 5<<16); //PA5 = AF5, PA4 = AF5
	
	/*Настройка SPI1 (Master)
	8 бит данных, MSB передается первым, программный режим управления NSS, вывод NSS (PA4) разрешено использовать в качестве выхода*/
	RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Тактирование модуля SPI1
	SPI1->CR1 &= ~SPI_CR1_CPOL; //Полярность тактового сигнала
	SPI1->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала
	SPI1->CR1 &= ~SPI_CR1_DFF; //8 бит данных
	SPI1->CR1 &= ~SPI_CR1_LSBFIRST; //MSB передается первым
	SPI1->CR2 = 0; //Вывод NSS - выход управления slave select
	SPI1->CR1 |= SPI_CR1_MSTR; //Режим Master
	SPI1->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256
	SPI1->CR1 |= SPI_CR1_SSM; //Программный режим NSS
	SPI1->CR1 |= SPI_CR1_SSI; //Аналогично состоянию, когда на входе NSS высокий уровень
	SPI1->CR1 |= SPI_CR1_SPE; //Включаем SPI1
}

static void xmit_spi(uint8_t xmit_data)
{
	SPI1->DR = xmit_data; //Пишем в буфер передатчика SPI1. После этого стартует обмен данными
	//отправка числа
	while (!(SPI1->SR & SPI_SR_TXE)); //убедиться, что предыдущая передача завершена
}

static char rcvr_spi(void)		//прием числа
{
	uint8_t res;
	SPI1->DR = 0xff; //Пишем в буфер передатчика SPI1. После этого стартует обмен данными
	while (!(SPI1->SR & SPI_SR_TXE)); //убедиться, что предыдущая передача завершена
	//прием числа
	while(!(SPI1->SR & SPI_SR_RXNE)); //Ожидаем окончания приема данных модулем SPI1 (RXNE =1 - приемный буфер содержит данные)
	res= SPI1->DR;
	return res;
}

static void send_cmd(char cmd,char arg)	/* Send command packet */
{
	xmit_spi(cmd); /* Start + Command index */
	xmit_spi((char)(arg >> 24)); /* Argument[31..24] */
	xmit_spi((char)(arg >> 16)); /* Argument[23..16] */
	xmit_spi((char)(arg >> 8)); /* Argument[15..8] */
	xmit_spi((char)arg); /* Argument[7..0] */
	xmit_spi(0x95);
}
-------------------------------------------------------------------------------------------------------------------------------
constants.h

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

#ifndef CONSTANTS_H_
#define CONSTANTS_H_

#define CMD0 (0x40+0) /* GO_IDLE_STATE */
#define CMD1 (0x40+1) /* SEND_OP_COND (MMC) */
#define ACMD41 (0xC0+41) /* SEND_OP_COND (SDC) */
#define CMD8 (0x40+8) /* SEND_IF_COND */
#define CMD9 (0x40+9) /* SEND_CSD */
#define CMD10 (0x40+10) /* SEND_CID */
#define CMD12 (0x40+12) /* STOP_TRANSMISSION */
#define ACMD13 (0xC0+13) /* SD_STATUS (SDC) */
#define CMD16 (0x40+16) /* SET_BLOCKLEN */
#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */
#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */
#define CMD23 (0x40+23) /* SET_BLOCK_COUNT (MMC) */
#define ACMD23 (0xC0+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */
#define CMD24 (0x40+24) /* WRITE_BLOCK */
#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */
#define CMD55 (0x40+55) /* APP_CMD */
#define CMD58 (0x40+58) /* READ_OCR */

#endif
-----------------------------------------------------------------------------------------------------------------------------
main.c

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

#include "stm32l1xx.h"
#include "stdio.h"
#include "spiRoutine.h"
#include "constants.h"
uint8_t temp,res,i;

int main()
{
	spi_init();
	
	//LED
	GPIOB->MODER |= GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0; //PB6, PB7 - GP Output
	GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7); //PB6, PB7 - Push-Pull
	GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7; //40 MHz
	GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR6 | GPIO_PUPDR_PUPDR7); //No pull
	
	for (int n = 7; n; n--) xmit_spi(0xff); /* 80 dummy clocks */
	for (int n = 7; n; n--) xmit_spi(0xff); /* 80 dummy clocks */
	
	send_cmd(CMD0,0);
	while(!(res==1))
	{
		SPI1->DR = 0xff;
		res=rcvr_spi();
		if (i>10)
		{
			send_cmd(CMD0,0);
			i=0;
		}
		i++;
		putchar(res);
	}
	
	send_cmd(CMD1,0);
	while(!(res==0))
	{
		SPI1->DR = 0xff;
		res=rcvr_spi();
		if (i>20)
		{
			send_cmd(CMD1,0);
			i=0;
		}
		i++;
		putchar(res);
	}
	
	xmit_spi(CMD18);
	xmit_spi(0);
	xmit_spi(0);
	xmit_spi(0);
	xmit_spi(0);
	xmit_spi(0xff);
	
	while(1)
	{
		res=rcvr_spi();
		if(res!=0Xff)
		{
			if(res!=0X0) {putchar(res);}
		}
	}
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

В "spiRoutine.c" функция "rcvr_spi()" объявлена как static, и она же объявлена в "spiRoutine.h" как static (?!) да еще и вызывается из "main.c" (?!!!). Таких советчиков надо брать за шкирку и топить в ближайшем водоеме.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

Совесть писал(а):Таких советчиков надо брать за шкирку и топить в ближайшем водоеме.
а теперь пролистали обсуждение сначала - у чела возникла проблема раскидать файл по кускам, что я и сделал, тупо скопировал код совсем в нем не ковыряясь, а про статик ему уже 3 страницы рассказывают

цель - показать что объявлений функций желательно размещать в хидерах, функции в с файлах и продемонстрировать что такой подход более удобен чем спихивание всего в один файл

если быть немного внимательным, то можно заметить - та функция которую я добавил, никакими статиками не болеет, остальное все копипаст
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

...тупо скопировал код...
Вот это и есть причина моего высказывания.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

мне лично лень ковырять чужой код, тем более вопрос звучал совсем другой
ну а если вы такой умный, так предоставьте правильный, или вы только критиковать умеете?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Ответить

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