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

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

Сообщение 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!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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 писал(а):Такое не часто увидишь.
Да зато новичкам быстро отвечаем :)
В поисках истины человек развивается.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

Сообщение Uragan90 »

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

Сообщение 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-разрядная, остальные по архитектуре.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

Сообщение Uragan90 »

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

Сообщение levaclaus »

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

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

Сообщение 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];
спасибо.
Контактная информация:
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение 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;

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

Сообщение svetl1928 »

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

Сообщение phanis »

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

Сообщение IfoR »

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

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

OS: openSUSE 13.2 (x86_64)
Контактная информация:
Открыл глаза
Сообщения: 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 :)))
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

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

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

union
{ 
   unsigned char data[8];
   struct
   {
      struct 
      {
         unsigned char lvl:6 ;
         ...
      }....;
      ....
    };
}TDA7313;
Структуры будут перекрываться если будет объединение состоящее из массива и структур с битовыми полями.
Или компиллятору не нравится безымянная структура, значит надо дать ей имя (хотя должно понимать и без имени).
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

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

Сообщение 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
Откуда: Цветочный город

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

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

Сообщение demiurg301 »

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

Сообщение UA0QQE »

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

Сообщение UA0QQE »

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

Сообщение 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 и остальные трудно точно ответить.
Контактная информация:
Ответить

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