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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Мастер Ломастер писал(а):с точки зрения построения надежных программ в условии цикла необходимо как раз контролировать диапазон допустимости значения, а не равенство или неравенство "краю" диапазона.

Согласен. Я как-то отловил багу и получил рукояткой от граблей по лбу. Спалил MOSFET. (Был такой проект с трёхфазным мостом для асинхронника) Цикло не кончалось (применил RTOS) а потом вступил другой процесс, который открыл другой МОСФЕТ и в итоге, я поймал сквозняка в мосту.
По дурости сделал так:

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

for (unsigned char a = 0 ; a != 125 ; a++) {....} \\Ну не придурок, а?

А ведь надо было проще:

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

for (unsigned char a = 0 ; a < 125 ; a++) {.....}

К ассемблеру это тоже относится:

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

MAIN:         ldi r16, 0
MAIN_L:         inc r16
            //Операции с использованием r16 в качестве индекса к указателю.
            cpi r16, -245-1
            brlo MAIN_L
I am DX168B and this is my favourite forum on internet!
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

levaclaus писал(а):Вопрос 1
Все порты заняты, но позарез надо заюзать прерывание INT0.

Используйте сдвиговый регистр могу скинуть код как использовать
levaclaus писал(а): Можно ли одновремено настроить порт на выход (к порту подключен сегмент матрицы) и использовать прерывания?
:shock: Можно, но с большими ограничениями и предостережениями. :))
Мой совет лучше не надо.См ответ Парой строчек выше.
levaclaus писал(а):Вопрос 2
Собственно, на портD подключено всего 4 разряда, ещё 4 пина остаются непригодны для использования, т.к. в коде ниже мы отключаем весь портD.
Зачем?:dont_know:
levaclaus писал(а):Как сделать отключение только 4 пинов? Т.е. PORTD.0 = 0; PORTD.1 = 0; PORTD.2 = 0; PORTD.3 = 0; Так? Или есть вариант покомпактнее?
Конечно есть постом выше
IfoR писал(а):Великие носители истин vitalik_1984, Мастер Ломастер и ut1wpr сошлись в одном месте.

Да какой из меня носитель истины? Просто какой то информации
IfoR писал(а):Такое не часто увидишь.
Да зато новичкам быстро отвечаем :)
В поисках истины человек развивается.
Реклама
Аватара пользователя
Uragan90
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

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

Сообщение Uragan90 »

Привет всем!
Есть такой вот вопросик:
У меня в программе вызывается прерывание по переполннению таймера, через каждые 0,000256сек. а мне нужно написать код чтоб в переменной "count" изменялись значения от 0 до 5 и от 5 до 0 (счётчик с инверсией) с тиком счёта каждые 10мин.
Помогите разобраться как это можно сделать, плиз!!!!
Я мог бы изменить весь Мир, но бог зажал исходники :(
Аватара пользователя
Pavel V.
Мявтор!
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва
Контактная информация:

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

Сообщение Pavel V. »

Инкрементируй в прерывании таймера 32-разрядную переменную и проверяй ее значение..

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

volatile uint32_t acc = 0;
volatile uint32_t count = 0;
volatile uint32_t dir = 0; // 0 - UP, 1 - DOWN

interrupt
{
  ++acc;
  if(acc > 2343750) // 2343750 = 10 min * 60 / 0.000256
  {
    if(dir)
    {
      --count;
    }
    else
    {
      ++count;
    }
    if((count == 5) && (dir == 0))
    {
      dir = 1;
    }
    if((count == 0) && (dir == 1))
    {
      dir = 0;
    }
    acc = 0;
  }
}


Код из головы, не проверял.
acc - 32-разрядная, остальные по архитектуре.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Uragan90
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

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

Сообщение Uragan90 »

Спасибо огромное!!!!
Я мог бы изменить весь Мир, но бог зажал исходники :(
Реклама
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

vitalik_1984 писал(а):
levaclaus писал(а):Вопрос 1
Все порты заняты, но позарез надо заюзать прерывание INT0.

Используйте сдвиговый регистр могу скинуть код как использовать
levaclaus писал(а): Можно ли одновремено настроить порт на выход (к порту подключен сегмент матрицы) и использовать прерывания?
:shock: Можно, но с большими ограничениями и предостережениями. :))
Мой совет лучше не надо.См ответ Парой строчек выше.



скидывайте конечно)
Но регистр стоит денег, в чём ограничения?
Реклама
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

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

union
{
 unsigned char data[8];
   struct
      {
      unsigned char lvl:6 ;
      unsigned char adr:2 ;
      }VL[0];
   struct
      {
      unsigned char lvl:5 ;
      unsigned char adr:3 ;
      }LR[1];
   struct
      {
      unsigned char lvl:5 ;
      unsigned char adr:3 ;
      }RR[2];
   struct
      {
      unsigned char lvl:5 ;
      unsigned char adr:3 ;
      }LF[3];
   struct
      {
      unsigned char lvl:5 ;
      unsigned char adr:3 ;
      }RF[4];
   struct
      {
      unsigned char swh:2 ;
      unsigned char lod:1 ;
      unsigned char gan:2 ;
      unsigned char adr:3 ;   
      }AS[5];
   struct
      {
      unsigned char lvl:4 ;
      unsigned char adr:4 ;
      }BC[6];
   struct
      {
      unsigned char lvl:4 ;
      unsigned char adr:4 ;
      }TC[7];

} TDA7313;

Как можно правильно объединить data[8]; и VL..TC без квадратных скобок?
Чтоб доступ был примерно таким.
TDA7313.VL.lvl = 10;
и можно ли в структуре некоторым элементам присваивать значение при создании
если можно то как?

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

   struct 
      {
      unsigned char lvl=10:4 ; 
      unsigned char adr=5:4 ;
      }TC[7];

спасибо.
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

Как можно правильно объединить data[8]; и VL..TC без квадратных скобок?

Вот так:

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

union
{
   unsigned char data[8];
   struct
   {
      struct
      {
         unsigned char lvl:6 ;
         unsigned char adr:2 ;
      }VL;
      struct
      {
         unsigned char lvl:5 ;
         unsigned char adr:3 ;
      }LR;
      struct
      {
         unsigned char lvl:5 ;
         unsigned char adr:3 ;
      }RR;
      struct
      {
         unsigned char lvl:5 ;
         unsigned char adr:3 ;
      }LF;
      struct
      {
         unsigned char lvl:5 ;
         unsigned char adr:3 ;
      }RF;
      struct
      {
         unsigned char swh:2 ;
         unsigned char lod:1 ;
         unsigned char gan:2 ;
         unsigned char adr:3 ;   
      }AS;
      struct
      {
         unsigned char lvl:4 ;
         unsigned char adr:4 ;
      }BC;
      struct
      {
         unsigned char lvl:4 ;
         unsigned char adr:4 ;
      }TC;
   };

} TDA7313;

Аватара пользователя
svetl1928
Потрогал лапой паяльник
Сообщения: 305
Зарегистрирован: Пт сен 03, 2010 19:29:56
Откуда: Планета Земля

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

Сообщение svetl1928 »

Мужики, объясните мне пожалуйста один простой вопрос, я себе уже мозг сломал.
Есть различные среды разработки, Байском, CV AVR, AVR GCC, AVR STUDIO и т.д. Так вот в чем вопрос. Если язык Си для АВР один, то по чему же тогда программа в разных средах пишется по разному?
То есть в коде визион инклуды присоединяются вот так #include <tiny2313.h>
в AVR studio вот так #include <avr/io.h>
в Байском так $regfile = "attiny13.dat"
Получается я сначала разбирался много времени с коде визион, а затем открыл AVR studio и упал в ступор, там мастер создал совсем другой файл. Вот хоть плачь, не пойму что делать, объясните если можете.
Заранее спасибо!
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

BorisSPB писал(а):

Я так пробовал, в таком случае все структуры друг друга перекрывают и находятся в data[0] ..
а нужно чтоб каждая находилась в отдельной части data[0..7]
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

svetl1928
На BASCOM-е приграммы пишутся на Си? Улыбнуло. :))
Вперёд марш учить Си и что такое BASIC!

Я не пойму, чего разного в GCC-AVR и CVAVR? Что там #include <>, что здесь #include <>.
Единственное отличие, что в GCC-AVR подключается макрохидер, который в свою очередь, в зависимости от настроек компиляции, подключает нужной хидер, а CVAVR нужно сразу подключать конкретный хидер.
Ну ещё только что CVAVR славится своими фирменным диалектом, дополняющий стандартный, который, понятное дело, не принимается другими компиляторами.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
UA0QQE
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср янв 12, 2011 13:10:37
Откуда: Якутск

где ошибка

Сообщение UA0QQE »

сильно не пинайте в програмировании МК недавно, вопрос вот в чем, вроде с инициализацией LCD разобрался, текст выводить тоже получается, немогу считать информацию с АЦП и передать на экран
компилятор CCS C Compiler, IDE тот же. Далее 2 текста: 1 конфиг, 2 сама прога, что не так ?
1)
#include <16F716.h>
#device adc=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES NOBROWNOUT //No brownout reset
#FUSES RESERVED //Used to set the reserved FUSE bits

#use delay(clock=16000000)


2)

#include "D:\proba\22.h"
#define LCD_TYPE 2
#include <lcd.c>
unsigned int8 i;

void main()
{
lcd_init();
lcd_putc("\f");
lcd_gotoxy ( 5, 2);
lcd_putc("Hello");
delay_ms ( 100);

setup_port_a(ALL_ANALOG);
setup_adc_ports(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
long duty;
setup_timer_2(T2_DIV_BY_16, 127, 1);

unsigned int8 i;

i = read_adc();

delay_ms ( 10);
lcd_gotoxy ( 5, 1);
lcd_putc(i);

}
I=U/R :)))
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

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

Сообщение BorisSPB »

phanis писал(а):Я так пробовал, в таком случае все структуры друг друга перекрывают и находятся в data[0] ..
а нужно чтоб каждая находилась в отдельной части data[0..7]

Объявляется объединение в котором:
массив
структура.
Эта структура в свою очередь состоит из других структур (с битовыми полями).

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

union
{
   unsigned char data[8];
   struct
   {
      struct
      {
         unsigned char lvl:6 ;
         ...
      }....;
      ....
    };
}TDA7313;

Структуры будут перекрываться если будет объединение состоящее из массива и структур с битовыми полями.
Или компиллятору не нравится безымянная структура, значит надо дать ей имя (хотя должно понимать и без имени).
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

Виноват , не заметил еще одну структуру, все работает спасибо..
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

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

Сообщение AaNnDdRrEeYy »

Подскажите пожалуйста, как посчитать сколько RAM сожрет программа.
допустим я объявляю массив вне какой либо функции

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

unsigned char mass[5]; 

компилятор (GCC + AVRStudio 4) говорит что использовано 5 байт RAM.
но если я объявлю в функции

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

void fun(void)
{
   unsigned char mass[5];
}

компилятор говорит что использовано 0% RAM.
дело в том что могут быть переходы из одной функции в другую и в каждой будут добавляться по несколько переменных, как избежать переполнение стека?
рекурсии нет.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

компилятор показывает, сколько RAM занято под СТАТИЧЕСКИЕ перменные, а сколько потребуется под динамические - он не знает и не может знать. а локальные переменные - это подвид динамических переменных (если они не статические, конечно).
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

Ну можно по "дереву" прикинуть примерно...
UA0QQE
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср янв 12, 2011 13:10:37
Откуда: Якутск

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

Сообщение UA0QQE »

ну и что ? ни кто не поможет с длинными числами ?
I=U/R :)))
UA0QQE
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср янв 12, 2011 13:10:37
Откуда: Якутск

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

Сообщение UA0QQE »

пробовал всяко разно, выводит если ("abc") abc , если (abc) причем abc = цифре, выводит всякие буквы, числа, знаки
как это побороть ?
I=U/R :)))
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

Попробуйте так

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

unsigned int8 i,buff[3];

i = read_adc();
buff[0] =( (i/100)%10) +0x30;
buff[1] =( (i/10 )%10) +0x30;
buff[2] =( (i/1  )%10) +0x30;
delay_ms ( 10);
lcd_gotoxy ( 5, 1);
lcd_putc(buff);

или

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

unsigned int8 i;

i = read_adc();
lcd_gotoxy ( 5, 1);
lcd_putc(( (i/100)%10) +0x30);
lcd_putc(( (i/10 )%10) +0x30);
lcd_putc(( (i/1  )%10) +0x30);
delay_ms ( 10);


Не зная как у вас работают функции дисплея lcd_putc lcd_gotoxy и остальные трудно точно ответить.
Ответить

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