Страница 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
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт май 28, 2013 11:56:58
Мikа
Да, спасибо, дело было в этом. А что же тогда происходит с числом при 1<<PORTB?
На Асме всё проще работает

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт май 28, 2013 12:54:38
shads
Мikа писал(а):На Асме всё проще работает

Ха... эт как посмотреть.....
А вы заставьте это сказать того кто после Си пытается АСМ освоить

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

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 
Ан, нет, попутал с 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;
}
}
Хотя возможно че то перемудрил

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-ре одиночных канала и прочитать их последовательно ...