Страница 155 из 386

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

Добавлено: Пн май 27, 2013 18:57:04
blackx
2 char,

1. Насколько я знаю, в gcc-подобных компиляторах char-ы и так выравниваются по одному байту. То есть, если в структуре только char-ы, то они будут идти в памяти один за другим и без подобных ухищрений :)
2. 1) ага
2) ага

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

Добавлено: Пн май 27, 2013 21:54:47
char
спасибо :)

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

Добавлено: Вт май 28, 2013 11:40:45
Мikа
Привет, Коты! Щас мигаю диодами, но уже на Си. Происходит нечто непонятное.

Вот простецкий код.
Спойлер

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

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


int main(void)
{
	DDRB=0b11111111;
	DDRD=0b01110000;
	PORTB=0b11111110;
	PORTD=0b01110000;

    while(1)
    {
		if (PORTB!=0b01111111)
		{
			
			PORTB=~PORTB;	//0b11111110 ---> 0b00000001
			PORTB=1<<PORTB; //0b00000001 ---> 0b00000010
			PORTB=~PORTB;   //0b00000010 ---> 0b11111101
			_delay_ms(500);
		} 
		else
		{
			PORTB=0b11111110;
			
		}
	}
}		
В схеме участвует тройной 7ми сегментный индикатор с общим анодом, поэтому зажигание происходит при сброшенном бите в порту. ДУмаю, не вам рассказывать.
По моим ожиданиям огонек должен бегать по a-b-c-d-e-f. Фактически же его маршрут a-b-c-f Оо Что-то я явно упускаю из вида, но что - не пойму. Подскажите, плз...

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

Добавлено: Вт май 28, 2013 11:50:56
ibiza11
может все таки не

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

PORTB=1<<PORTB;
, а

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

PORTB=PORTB<<1;

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

Добавлено: Вт май 28, 2013 11:56:58
Мikа
Да, спасибо, дело было в этом. А что же тогда происходит с числом при 1<<PORTB?
На Асме всё проще работает :dont_know:

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

Добавлено: Вт май 28, 2013 12:54:38
shads
Мikа писал(а):На Асме всё проще работает :dont_know:
Ха... эт как посмотреть.....
А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....

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

Добавлено: Вт май 28, 2013 13:04:23
Мikа
Говорят, холивары присутствуют между Сишниками и Ассемблерщиками... :D

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

Добавлено: Вт май 28, 2013 13:09:19
Cheba
Мikа писал(а):А что же тогда происходит с числом при 1<<PORTB?
Как и написано, единичка сдвигается влево на количество разрядов, записанное в PORTB. Т.е. первый раз получается двойка, второй - четверка, в третий - фигня :) ( сдвиг на восемь битов при операции над байтом - операция бессмысленная)

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

Добавлено: Вт май 28, 2013 13:37:34
HHIMERA
shads писал(а): А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....
Хм... и в чём здесь прикол???

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

Добавлено: Вт май 28, 2013 14:00:12
ChipKiller
HHIMERA писал(а):
shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....
Хм... и в чём здесь прикол???
... Си-шник всегда напишет 0xFF вместо 0b11111111, и накатает макросов из любви к #define, чтобы сократить писанину :) . Неприязнь будет вызывать необходимость делать многие вещи "ручками", вместо того что бы взять готовую либу ....

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

Добавлено: Вт май 28, 2013 15:33:28
HHIMERA
Это да!!!
А вот в чём прикол с СИ на АСМ переползать??? Это ж как сильно головой удариться нужно...

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

Добавлено: Вт май 28, 2013 22:37:32
Dan Swano
Аlex писал(а):
А причём тут printf ? Деление с остатком не пойдёт ?
Ну я же могу написать что-то вроде sprintf(buf, "%02f", var), только сколько на это уйдет памяти МК? Деление с остатком вполне подойдёт, подскажете алгоритм?

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

Добавлено: Ср май 29, 2013 01:05:55
Cheba
Число обязательно должно быть вещественным ? В МК вообще лучше избегать вещественной арифметики.
целая часть получается присваиванием вещественного целому достаточной длины, а потом вычисляется дробная достаточной точности.

Реализация вобще без printf

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

/* как пример */
	long part1, part2;
	float source = -66780.015;
	char buf[20], *pp;
	part1 = source;
	part2 = labs((source - part1 + (part1>0 ? 0.00501 : -0.00501)) * 100); /* 100 - два знака после запятой */
	pp=buf;
	if(part1==0 && source<0) *pp++='-';
	ltoa(part1, pp, 10);
	strcat(buf, ".");
	pp = buf + strlen(buf);
        if(part2<10) *pp++='0'; /* зависит от точности, для более двух знаков нужно более сложный код */
	ltoa(part2,pp,10);
/* Ну у теперь в buf сформирована строка и с ней можно что угодно делать */
	puts(buf);
ltoa я брал за образец itoa из Кернигана, если есть в используемой среде в библиотеках, то тоже неплохо. В любом случае расход памяти вообще минимален, по сравнению с использованием sprintf

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

Добавлено: Ср май 29, 2013 06:48:11
Psych
HHIMERA писал(а):А вот в чём прикол с СИ на АСМ переползать???
Прикол в том, что лучше то и то знать.

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

Добавлено: Ср май 29, 2013 09:57:52
blackx
2 Cheba,
itoa - отстой, используйте strtol 8)
Ан, нет, попутал с atoi - вот ее лучше не использовать :)

А вы уверены что у вас эта проверка срабатывать будет? Если нужно сконвертить в строку отрицательное число,
то itoa сама добавит "-":

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

part1 = source;
//...
if(part1==0 && source<0)
А так вроде даже ничего.

PS. Когда уже в этой ветке запретят неправославное слово АСМ?
Ребята, идите вы в МЯЯЯУ!!!

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

Добавлено: Ср май 29, 2013 12:35:21
aleksandr5rikin
Добрый день, возникла проблема при написании программе (AVR Studio 4), нужно изменять яркость светодиода, код:

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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
	
int main(void)
{
	DDRB = 0xff;
	PORTB = 0x00;
	OCR0 = 0xff;
	TCCR0 = (1 << WGM01) | (1 << WGM00) | (1 << COM01) | (1 << COM00) | (1 << CS00);
	TCNT0 = 0x00;
	while (1)
	{
		while(OCR0 != 0xff)
		{
			_delay_ms(2);
			OCR0++;
		}
		while(OCR0 != 0x00)
		{
			_delay_ms(2);
			OCR0--;
		}
	}
}
Присваиваю OCR0 значение 255 а он всеравно остается равным 0, в чем проблема ?
И еще в цикл while(OCR0 != 0xff) вы полняется не 255 раз а гораздо больше, как такое может быть, регистр 8-битный же ?

P.S. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?

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

Добавлено: Ср май 29, 2013 16:41:15
Cheba
blackx писал(а): А вы уверены что у вас эта проверка срабатывать будет? Если нужно сконвертить в строку отрицательное число,
то itoa сама добавит "-":

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

part1 = source;
//...
if(part1==0 && source<0)
Подсказка : Берем число -0.1 и ... сработает


Код проверялся и по граблям прыжки уже были. :)

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

Добавлено: Чт май 30, 2013 13:17:59
Psych
aleksandr5rikin писал(а):возможно ктонибуть подскажет более более качественую реализацию задания ?

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

int main(void)
{
   signed char n=-1;
   while (1)
   {   
         _delay_ms(2);
         OCR0+=n;
         if(!OCR0 || OCR0==255) n*=-1;
   }
}
Хотя возможно че то перемудрил :dont_know:

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

Добавлено: Чт май 30, 2013 15:40:18
ibiza11
aleksandr5rikin писал(а):P.S. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?
решение в студию.

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

Добавлено: Чт май 30, 2013 19:51:44
RomanT
Подружите меня с АЦП ADS8341
даташит http://www.ti.com/lit/ds/symlink/ads8341.pdf
Изображение
сказать что 4-ре одиночных канала и прочитать их последовательно ...