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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

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


Кому-то частный случай, а у мя практически все константы последовательные.

а вот чем хорош мой подход. допустим, я объявил тип


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

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

Сообщение ibiza11 »

че вы тут развели на 3 страницы??? письками не с кем помериться больше??? вопрос был про ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ ДАННЫХ. ВСЕ УЖЕ ОТВЕЧЕНО!!!
Ставим плюсы: )
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

Вроде идет разговор о дефайнах и перечислениях. Где вам "письки" померещились? тут не канал ТНТ :)))
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Вопрос такой: если я напишу так

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

oldState = __save_interrupt();//сохраняем регистр SREG
__disable_interrupt();             //запрещаем прерывания
считывание глобальной переменной итд 
__restore_interrupt(oldState);//восстанавливаем SREG
, то если скажем во время выполнения этого куска кода возникнет прерывание, например, совпадение счетного регистра с регистром сравнения, то после выполнения этого куска МК перейдет к возникшему прерыванию?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Эиком - электронные компоненты и радиодетали
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

если на момент __save_interrupt() был установлен флаг разрешения, то после __restore_interrupt() пойдет обработка прерывания.
Реклама
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

А как его установить?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

_SEI(), __enable_interrupt(). Странный вопрос для человека использующего предыдущие функции )
Последний раз редактировалось BerZerK-ku Вт янв 17, 2012 15:42:28, всего редактировалось 1 раз.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

__enable_interrupt() ещё в самом начале установлен)))) Спасибо))
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

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

Сообщение kreygen »

Народ, помогите, буду очень благодарен.
Вопрос нубский.
Нужно заставить работать ЦАП на микроконтроллере. Контроллер STM32F100RB, на плате stm32vldiscovery
Вот написал я код:

DAC_InitTypeDef DAC_InitStructure;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_2, &DAC_InitStructure);

DAC_Cmd(DAC_Channel_2, ENABLE);
DAC_SetChannel2Data(DAC_Align_12b_R, 0x0AA);

По идеи последняя команда должна менять напряжение, которое выдаёт ЦАП. Но ноль эмоций. Пробовал разные варианты из примеров - не пашет. Спаял всё верно, если просто выдать 1 на ногу, то светодиод горит.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

kreygen писал(а):Вот написал я код:

DAC_InitTypeDef DAC_InitStructure;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_2, &DAC_InitStructure);

DAC_Cmd(DAC_Channel_2, ENABLE);
DAC_SetChannel2Data(DAC_Align_12b_R, 0x0AA);
Первый раз вижу такой маленький исходник. Даже main нет, не говоря уж об основном цикле.
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

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

Сообщение kreygen »

Первый раз вижу такой маленький исходник. Даже main нет, не говоря уж об основном цикле.


Я его не приводил полностью. Смысл? Вся работа с DAC здесь, функция вызывается в main.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

kreygen писал(а): Смысл?
Т.е. Вы считаете здесь телепаты собрались ? Тогда Вы не туда попали.
Хотя... может и найдётся какой-нибудь экстрасенс и угадает.
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

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

Сообщение kreygen »

Снимаю вопрос, разобрался.
Просто сделал не через структуры, а побитово. Заработало.
Спасибо за внимание
evil0o
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Чт мар 31, 2011 21:26:39

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

Сообщение evil0o »

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

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

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

evil0o писал(а):подскажите как сделать опрос портов ввода всех сразу atmega 8. цель в том что есть 5 кнопок и от того какая кнопка будет нажата первой будет зависеть следующие действие. заранее спасибо за помощь.

всех портов сразу никак - их 4 штуки, а за один раз можно работать только с одинм портом

правда, что-то мне подсказывает, вы имели ввиду всех пинов одного порта (в одном порту 8 пинов) - то это дело другое, и делается это очень просто: PINB содержит состояние сразу всех 8-и своих пинов. просто считываете в переменную значение PINB в нужный момент и затем анализируете.
битва с дураками проиграна, победители торжествуют. слава победителям!
evil0o
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Чт мар 31, 2011 21:26:39

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

Сообщение evil0o »

спасибо хотя бы стало понятнее.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Теперь у меня возникла ещё проблема-в ниже перечисленном коде, если сделать задержку(не которая опрос кнопок, а между управлением состояния портов) меньше 170000 тактов(частота тактирования МК составляет 4 МГц), то появляется баг - если, например, в верхнем ряду зажжен 1 светодиод, а в нижнем-2, то иногда на секунду-две погасает то верхний(1) светодиод, то нижний (2). И так при любой комбинации, кроме верхний-1, нижний-1. Вот код:

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

#include <intrinsics.h>
#include <iotiny2313.h>
volatile unsigned long second=0;
volatile unsigned char hours=0,fiveminute=0,takt=0;
__flash unsigned char timeb[12]={1,2,4,8,16,32,64,128,0,0,0,0};
__flash unsigned char timed[12]={0,0,0,0,0,0,0,0,1,2,4,16};
unsigned char old;
int main( void )
{
  __enable_interrupt();
DDRB=255;
DDRD|=((1<<0)|(1<<1)|(1<<2)|(1<<4));
DDRD=(~((1<<6)|(1<<3)|(1<<5)));
DDRA=3;
TIMSK|=(1<<OCIE0A);
TCCR0B|=(1<<2);
TCCR0B&=(~(1<<1)|(1<<0));
OCR0A=125;
while(1)
{
old= __save_interrupt();
__disable_interrupt(); 
if(PIND_Bit6==0)
{
__delay_cycles(20000);
if(PIND_Bit6==0)
fiveminute++;
}
if(PIND_Bit5==0)
{
__delay_cycles(20000);
if(PIND_Bit5==0)
hours++;
}
PORTA_Bit1=1;
PORTA_Bit0=0;
PORTB=timeb[fiveminute];
PORTD=timed[fiveminute];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt(); 
PORTA_Bit0=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=0;
PORTD=timed[hours];
PORTB=timeb[hours];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
}
}
#pragma vector=TIMER0_COMPA_vect
__interrupt void TimerCompA(void)
{
TCNT0=0;
takt++;
if(takt==125)
{
takt=0;
second++;
}
if(second==300)
{
second=0;
fiveminute++;
}
if(fiveminute==12)
{
fiveminute=0;
hours++;
}
if(hours==12)
{
hours=0;
fiveminute=0;
}
}

Схема в приложении.
Вложения
avrka.PNG
(117.7 КБ) 331 скачивание
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Ну так поможет кто-нибудь?)
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

Суровый код. Для начала могу сказать только то , что __restore_interrupt и __save_interrupt тут лишние. У них несколько иное предназначение )
old = ...; можно выкинуть. __restore_...; заменить на __enable_interrupt();

У вас случаем нет проекта для протеуса? Лень рисовать, чтобы понять что горит, а что нет :)))
Туплю, картину не посмотрел, выложите проект плз.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Pika4u писал(а):Теперь у меня возникла ещё проблема-в ниже перечисленном коде, если сделать задержку(не которая опрос кнопок, а между управлением состояния портов) меньше 170000 тактов(частота тактирования МК составляет 4 МГц), то появляется баг - если, например, в верхнем ряду зажжен 1 светодиод, а в нижнем-2, то иногда на секунду-две погасает то верхний(1) светодиод, то нижний (2). И так при любой комбинации, кроме верхний-1, нижний-1.
А как по вашему мнению должно быть? мы же не знаем какая логика задумана в вашем мозге :)
Pika4u писал(а):while(1)
{
old= __save_interrupt();|
__disable_interrupt(); |
if(PIND_Bit6==0) |
{ |
__delay_cycles(20000); |
if(PIND_Bit6==0) |Я бы заменил эту часть на switch
fiveminute++; |
} |
if(PIND_Bit5==0) |
{ |
__delay_cycles(20000);|
if(PIND_Bit5==0) |
hours++; |
}
PORTA_Bit1=1;
PORTA_Bit0=0;
PORTB=timeb[fiveminute];
PORTD=timed[fiveminute];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit0=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=0;
PORTD=timed[hours];
PORTB=timeb[hours];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
}
}

old= __save_interrupt();|
__disable_interrupt(); |
in_pins=~(pind$BUTTONS_MASK);
switch(in_pins){
case:(1<<Bit6){ваши действия;break;}
case:(1<<Bit5){ваши действия;break;}
default :break;
}

Правка
или так:
old= __save_interrupt();|
__disable_interrupt(); |
in_pins=get_pins();
switch(in_pins){
case:(1<<Bit6){ваши действия;break;}
case:(1<<Bit5){ваши действия;break;}
default :break;
}
int get_pins(void){
old_pins=~(pind&BUTTONS_MASK);
__delay_cycles(20000);
if (old_pins==(~(pind&BUTTONS_MASK))){
return old_pins;
break;
}
else return 0;}
Последний раз редактировалось vitalik_1984 Пт янв 20, 2012 17:19:33, всего редактировалось 2 раза.
В поисках истины человек развивается.
Ответить

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