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

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

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

Сообщение blackx »

2 char,

1. Насколько я знаю, в gcc-подобных компиляторах char-ы и так выравниваются по одному байту. То есть, если в структуре только char-ы, то они будут идти в памяти один за другим и без подобных ухищрений :)
2. 1) ага
2) ага
Изображение only pure true norwegian blackx Изображение
Реклама
char
Родился
Сообщения: 5
Зарегистрирован: Пт сен 23, 2011 11:00:09

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

Сообщение char »

спасибо :)
Реклама
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение М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 Оо Что-то я явно упускаю из вида, но что - не пойму. Подскажите, плз...
Последний раз редактировалось Мikа Вт май 28, 2013 11:53:52, всего редактировалось 1 раз.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

может все таки не

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

PORTB=1<<PORTB;
, а

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

PORTB=PORTB<<1;
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Да, спасибо, дело было в этом. А что же тогда происходит с числом при 1<<PORTB?
На Асме всё проще работает :dont_know:
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Мikа писал(а):На Асме всё проще работает :dont_know:

Ха... эт как посмотреть.....
А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....
Реклама
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Говорят, холивары присутствуют между Сишниками и Ассемблерщиками... :D
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение Cheba »

Мikа писал(а):А что же тогда происходит с числом при 1<<PORTB?

Как и написано, единичка сдвигается влево на количество разрядов, записанное в PORTB. Т.е. первый раз получается двойка, второй - четверка, в третий - фигня :) ( сдвиг на восемь битов при операции над байтом - операция бессмысленная)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....

Хм... и в чём здесь прикол???
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

HHIMERA писал(а):
shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить :) ....
Хм... и в чём здесь прикол???
... Си-шник всегда напишет 0xFF вместо 0b11111111, и накатает макросов из любви к #define, чтобы сократить писанину :) . Неприязнь будет вызывать необходимость делать многие вещи "ручками", вместо того что бы взять готовую либу ....
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Это да!!!
А вот в чём прикол с СИ на АСМ переползать??? Это ж как сильно головой удариться нужно...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Dan Swano
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июл 04, 2011 13:42:43
Откуда: Тула
Контактная информация:

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

Сообщение Dan Swano »

Аlex писал(а):
А причём тут printf ? Деление с остатком не пойдёт ?

Ну я же могу написать что-то вроде sprintf(buf, "%02f", var), только сколько на это уйдет памяти МК? Деление с остатком вполне подойдёт, подскажете алгоритм?
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение 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
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

HHIMERA писал(а):А вот в чём прикол с СИ на АСМ переползать???

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

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

Сообщение blackx »

2 Cheba,
itoa - отстой, используйте strtol 8)
Ан, нет, попутал с atoi - вот ее лучше не использовать :)

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

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

part1 = source;
//...
if(part1==0 && source<0)


А так вроде даже ничего.

PS. Когда уже в этой ветке запретят неправославное слово АСМ?
Ребята, идите вы в МЯЯЯУ!!!
Изображение only pure true norwegian blackx Изображение
aleksandr5rikin
Родился
Сообщения: 1
Зарегистрирован: Ср май 29, 2013 12:25:11

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

Сообщение 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. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?
Последний раз редактировалось aleksandr5rikin Ср май 29, 2013 17:49:44, всего редактировалось 4 раза.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

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

Сообщение Cheba »

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

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

part1 = source;
//...
if(part1==0 && source<0)



Подсказка : Берем число -0.1 и ... сработает


Код проверялся и по граблям прыжки уже были. :)
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

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

Сообщение Psych »

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

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

int main(void)
{
   signed char n=-1;
   while (1)
   {   
         _delay_ms(2);
         OCR0+=n;
         if(!OCR0 || OCR0==255) n*=-1;
   }
}


Хотя возможно че то перемудрил :dont_know:
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

aleksandr5rikin писал(а):P.S. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?
решение в студию.
Ставим плюсы: )
Аватара пользователя
RomanT
Это не хвост, это антенна
Сообщения: 1335
Зарегистрирован: Ср июн 09, 2010 16:44:54
Откуда: Пермь
Контактная информация:

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

Сообщение RomanT »

Подружите меня с АЦП ADS8341
даташит http://www.ti.com/lit/ds/symlink/ads8341.pdf
Изображение
сказать что 4-ре одиночных канала и прочитать их последовательно ...
Вложения
ADS8341.jpg
(47.5 КБ) 782 скачивания
Ответить

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