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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

ADCSRAs->[вот тут должен вывалиться список...]
Это только в Keil-ARM работает, судя по всему. Пытался то же сделать в Keil C51 - аналогично, никак. Об этом и в хелпе писано.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

uk8amk писал(а):И вообще что сейчас годное есть?
можно попробовать Микрософт VS Code
https://code.visualstudio.com/
компиляцию можно организовать через маке и пр., GDB отладка простенько тоже работает.
Тут разбирался: http://mcu.goodboard.ru/viewtopic.php?id=7
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Eclipse классный, но по enum автоподсказку вытащить не получилось.
Может делаю не так?

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

typedef enum{
	STOP=0,
	UP=1,
	DOWN=2
} DEV_STA_t;


void main(void)
{
	DEV_STA_t s;

	s = ?
}
По Ctr+Space конечно вываливается всё подряд(сотни имён). Но так и в Keil оно работает.
Кажется в древней VisualC или Borland было неплохое автозаполнение. Надо поставить и посмотреть.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

нажимайте Ctrl-Space после ввода первых символов константы. лично я для удобства всегда константам даю имена, начинающиеся со смыслового префикса, например:

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

enum{
   CMD_STOP,
   CMD_UP,
   CMD_DN
};
тогда ввожу CMD_ и получаю ограниченный список имен. enum в Си не тип вообще, есличо (ну, может последние версии что-то поменяли... не в курсе)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Более менее вопрос прояснился. Спасибо за советы.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Можете ещё Qt Creator попробовать, он достаточно легковесный, по сравнению с тем же Eclipse:
Изображение Изображение

Не совсем то, что Вы заказывали, но автодополнение с учётом препроцессора (а ADCSRAs это всё же макрос) - это посложнее будет и, если и реализовано где-то, то вряд ли много где.

Мне ещё в Qt Creator нравится его способ работы с несколькими файлами исходного кода. Можно рядом открыть даже один и тот же файл в нескольких "окнах".
Изображение
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Почитал тут заголовок файла, что мне сгенерил мплаб и вычитал интересную фразу:
Use project enums instead of #define for ON and OFF.
.Погуглил. Показалось интересным. Правда для моего проекта это мало интересно - слишком прост, чтобы в дебаггере ковыряться. Но, решил попробовать. Нашел в исходнике кучу #define и решил их превратить в enum.

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

#define KEY_SET 0x40
#define KEY_MODE 0x10
#define KEYMASK (KEY_SET | KEY_MODE)
#define HOLDED (1<<0)
#define KEY_RELEASE (1<<1)    
С первыми двумя, вроде как проблем нет: Это биты соответствующие нажатым кнопкам. В принципе, еще в ту же группу можно добавить KEY_RELEASE - этот код функция выдаёт при отпущенной клавише. Так что можно бы написать:

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

typedef enum KEY_DEFINITION {
    KEY_SET  = 0x40,
    KEY_MODE = 0x10,
    KEY_RELEASE = 0x02
} keys_t; 
Тогда я бы мог переменной, куда читаю кнопки присвоить тип keys_t, да вот беда в том, что у них может быть аттрибут "повторения". И чтобы это работало корректно, надо определить еще по одному варианту для каждой кнопки (и еще вариант возврата "пустоты" - 0x00).

Можно ли это как сделать корректно или ну его нафиг? Причем, просто сейчас сделав такое изменение (заменил так #define на enum) компилятор проглотил и не подавился. Правда еще не проверил в работе. Переменной тип keys_t не назначал.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

uldemir писал(а):Тогда я бы мог переменной, куда читаю кнопки присвоить тип keys_t, да вот беда в том, что у них может быть аттрибут "повторения". И чтобы это работало корректно, надо определить еще по одному варианту для каждой кнопки (и еще вариант возврата "пустоты" - 0x00).
Можно ли это как сделать корректно или ну его нафиг?
А в чём некорректность? Неудобство обработки? Как вариант:

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

[...]
case KEY_SET_REPEAT:
  repeat = true;
  // no break
case KEY_SET:
  // обрабатываем с учётом флага
  break;
[...]
Использование enum типов позволяет компилятору не позволять заведомо [и потенциально] некорректные присвоения переменных - т.е. все возможные варианты в enum должны быть перечислены. Некоторые компиляторы настолько мудры, что и в switch-ах предупреждают нас если какое-то значение остаётся необработанным - default: при этом, понятное дело, должен отсутствовать. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Просто много писанины. Так функция обработки кнопок может вернуть значение

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

return readkey; 
или

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

return readkey | HOLDED; 
Т.е. в enum придется отдельно вводить KEY_SET_HOLDED, KEY_MODE_HOLDED. И еще третий вариант возможен (и четвертый...) когда обе кнопки нажаты и/или удерживаются... что-то много становится сущностей для двух кнопок. А стоит добавить третью - число вариаций начнет расти как снежный ком. Кажется, что в данном случае эти enum для меня не рациональны.
Спойлер

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

// Функция опроса клавиатуры
// kbddelay = 448 - соответствует 1с. 1/488 = 2ms
#define DEBOUNCE_DELAY 6  // 6*2=12ms - подавление дребезга
#define REPEAT_DELAY (SCANPERSECOND/3*2) // 0.66c - задержка перед повтором
#define REPEAT_PERIOD (SCANPERSECOND/3) // 0.33c - период автоповтора

unsigned char kbdread(void) {
  unsigned char readkey;
  static unsigned char repeated, prevkey;
    
  readkey = (PORTC ^ KEYMASK) & KEYMASK;
  if (readkey == 0) {  // not pressed
    repeated = 0;
    prevkey = 0;
    kbddelay = 0;
    return KEY_RELEASE;
  } else {
    if (prevkey != readkey){ // now pressed
      prevkey = readkey;
      repeated = 0;
      kbddelay = DEBOUNCE_DELAY;
      return 0;
    }
    else {
      if (readkey == prevkey) {
        if (kbddelay == 0) {
          if (repeated) {
            kbddelay = REPEAT_PERIOD;
            return readkey | HOLDED;
          }
          else { 
            kbddelay = REPEAT_DELAY;
            repeated = 1;
            return readkey;
          }
        }
      }
    } 
  } 
  return 0;
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Всем привет. Друзья, помогите, пожалуйста. Учу CVAVR, он основан на C++, пишу простенькую программку для переключения поворотов и включения аварийки. Применяю побитовый сдвиг, и собсно проблема - когда переключаю по одному порту, то все работает, если же задествую два порта одновременно, программа виснет. Код под спойлером. Не могу понять, в чем причина, по логике должно работать.
Спойлер

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

#include <mega8.h>
#include <io.h>

volatile unsigned char numl=0, nump=0, num_al=0, switch_arr[3]={1,2,3}, flag;

#define poworoty PORTB

#define left_sig 0
#define right_sig 1

#define left_butt PIND.0
#define right_butt PIND.1
#define alarm_butt PIND.2
 
#define left_on poworoty |= (1<<left_sig)
#define left_off poworoty &= ~ (1<<left_sig)  

#define right_on poworoty |= (1<<right_sig)
#define right_off poworoty &= ~ (1<<right_sig) 

#define alarm_on poworoty |= (1<<left_sig)|(1<<right_sig)
#define alarm_off poworoty &= ~ ((1<<right_sig)|(1<<left_sig))

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    num_al++; //счетчик аварийки
    nump++;  //счетчик правого
    numl++;  //счетчик левого
TCNT1H=0;
TCNT1L=0; 
}

void switcher () {  //функция включения соответствующих портов
    if (flag==1){
        switch (numl){ 
            case 0: left_off; break;
            case 1: left_on; break;
            case 2: numl=0; break;
                    } 
            } 
     else if (flag==2) {                
            switch (nump){            
            case 0: right_on; break;
            case 1: right_off; break; 
            case 2: nump=0; break;
                        }  
            }          
      else if (flag==3) {                
            switch (num_al){                  
            case 0: alarm_on; break;
            case 1: alarm_off; break; 
            case 2: num_al=0; break;
                        }
            }           
            

}

void main(void)
{
// Declare your local variables here

DDRD = 0x00; // порт D на вход
PORTD = 0xFF; // подключаем внутренние подтяг. резисторы

DDRB = 0xFF; // порт B на выход
PORTB = 0x00; // устанавливаем нули на выходе

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1H=0x0B;
TCNT1L=0xDC;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);


// Global enable interrupts
#asm("sei")

while (1)
      {
      
      if (!left_butt) {flag=switch_arr[0]; switcher ();} else if (left_butt) {left_off; numl=0;}
      //Правый указатель
      if (!right_butt) {flag=switch_arr[1]; switcher ();} else if (right_butt) {right_off; nump=0;}
      //Аварийка.
      if (!alarm_butt) {flag=switch_arr[2]; switcher ();}  else if (alarm_butt) {alarm_off; num_al=0;} ///через ету строку не работает все, то есть контроллер начинает переключать выводы на высокой частоте.
      }   
}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

что ж у вас так сложно-то все и запутанно? массивы, флаги какие-то... проще быть надо... как-то так:

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

typedef enum{
   STATE_OFF,
   STATE_LEFT,
   STATE_RIGHT,
   STATE_ALARM
} states;

states state;
volatile int counter;

interrupt [TIM1_COMPA] void timer1_compa_isr(void){
   counter++;
}

void main(void){
   // тут добавить настройки таймера и портов

   if(!alarm_butt) state = STATE_ALARM;
   else if(!left_butt) state = STATE_LEFT;
   else if(!right_butt) state = STATE_RIGHT;
   else state = STATE_OFF;

   switch(state){
   case STATE_OFF:
      left_off;
      right_off;
      break;
   case STATE_LEFT:
      if(counter & 1)
         left_on;
      else
         left_off;
      break;
   case STATE_RIGHT:
      if(counter & 1)
         right_on;
      else
         right_off;
      break;
    case STATE_ALARM:
      if(counter & 1){
         right_on;
         left_on;
      } else {
         right_off;
         right_off;
      }
      break;
  }
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение Starmarik »

Я еще только учусь :))) Спасибо большое, буду пробовать.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

даже еще проще нужно быть :)))

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

typedef enum{
   STATE_OFF,
   STATE_LEFT,
   STATE_RIGHT,
   STATE_ALARM
} states;

states state;
volatile int counter;

interrupt [TIM1_COMPA] void timer1_compa_isr(void){
   counter++;
}

void main(void){
   // тут добавить настройки таймера и портов
   while(1){
      if(!alarm_butt)      state = STATE_ALARM;
      else if(!left_butt)  state = STATE_LEFT;
      else if(!right_butt) state = STATE_RIGHT;
      else                 state = STATE_OFF;

      if(counter & 1)
         switch(state){
            case STATE_LEFT:   left_on;             break;
            case STATE_RIGHT:  right_on;            break;
            case STATE_ALARM:  right_on;  left_on;  break;
         } 
      else {
         left_off;
         right_off;
      }
   }
}
я в прошлый раз главный цикл пропустил :))) не могу код писать без нормального редактора...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 301
Зарегистрирован: Вс ноя 07, 2010 14:48:55
Откуда: Москва

Сообщение ximik »

Всем привет, может кто помочь дописать код в этом проекте? http://arduino-diy.com/arduino-svetodiodnyy-kub-4x4x4
затея такая к имеющемуся коду добавить ручное управление через терминал, смысл такой подрубаю терминал отправляю команду 1 куб переходит в ручное управление, все светодиоды гаснут (0 возвращает в мануал в котором гоняеет эффекты) в ручном управлении я посылаю команды формата (x1 y1 z1 q1) где загорается 1 светодиод по координатам x1y1z1, q1 это включение светодиода q0 выключение, ну как то так, все переменные примерно условно, вроде бы максимально просто, файл с кодом прилагаю(в статье тоже самое в скетче)за помощь накину сотни три рублей на вискас :hunger:
Вложения
прошивка.h
(16.24 КБ) 716 скачиваний
Если болит голова, значит она есть!)
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Сегодня залез в один проект микрочиповский - решил прилизать и несколько шероховатостей сгладить... ПОка колупался, смотрю, предлагает поставить более свежие версии. Ну я и поставил. В результате, почему-то компилятор стал придираться сильнее чем раньше. Т.е. выдаёт целую толпу предупреждений. И все одного типа:
main.c:767: warning: (373) implicit signed to unsigned conversion
Целую толпу заборол понаставив буковок "u" у числовых констант. Но вот одну не могу забороть. Самое обидное, связано с тем, что я на предыдущей странице описывал, как попытался заменить дефайны на энумы. Вобчем код:

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

typedef enum KEY_DEFINITION {
    KEY_NO_DATA = 0u,
    KEY_SET  = 0x40u,
    KEY_MODE = 0x10u,
    KEY_RELEASE = 0x02u
} keys_t;

#define KEYMASK (unsigned char)(KEY_SET | KEY_MODE)

unsigned char kbdread(void) {
  unsigned char readkey;
  static unsigned char repeated, prevkey;
    
  readkey = (PORTC ^ KEYMASK) & KEYMASK;
Вышепомянутую ошибку выдаёт на вот эту, последнюю строчку. PORTC в хедерах определен как

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

#define PORTC PORTC
extern volatile unsigned char           PORTC               @ 0x007;
Не могу понять, где еще тут что знаковое?
Пробовал написать #define KEYMASK ((unsigned char)KEY_SET | (unsigned char)KEY_MODE) - не помогло.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Какой компилятор и проц ?
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="uldemir",url="/forum/viewtopic.php?p=3108891#p3108891"]Не могу понять, где еще тут что знаковое?[/uquote]
Компилятор любит все приводить к int, например, это

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

(PORTC ^ KEYMASK) & KEYMASK
Если бы переменные были unsigned int, то результат таким бы и остался, но если размерность меньше, то будет int.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

[uquote="Reflector",url="/forum/viewtopic.php?p=3108946#p3108946"]Компилятор любит все приводить к int, например, это

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

(PORTC ^ KEYMASK) & KEYMASK
[/uquote]Вообще, странно. На каком бы вдруг основании, компилятору приводить это выражение к int. При том, что все части выражения - unsigned char.
Мало того, в левой части присваивания, тоже unsigned char.
:dont_know:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="uldemir",url="/forum/viewtopic.php?p=3108891#p3108891"]main.c:767: warning: (373) implicit signed to unsigned conversion

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

  readkey = (PORTC ^ KEYMASK) & KEYMASK; 
Вышепомянутую ошибку выдаёт на вот эту, последнюю строчку.
Не могу понять, где еще тут что знаковое?[/uquote]
Разбейте строчку на две:

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

  int tmp = (PORTC ^ KEYMASK) & KEYMASK;
readkey = tmp; 
На вторую точно должен ругнуться, а вот ругнётся-ли на первую? Ещё в дизасм листинг можно глянуть какие деяния он с операндами сотворить пытается.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Проблема явно в typedef enum {}. Потому как стоит эти маски задать просто через #define, как ошибки нет.

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

#define KEY_SET (1u<<6)
#define KEY_MODE (1u<<4)
#define KEY_RELEASE (1u<<1)
#define KEYMASK (KEY_SET | KEY_MODE)
Какой компилятор и проц ?
XC8 v1.42 pic16f723a

погуглил... понял, что в данном случае применять enum, действительно плохая идея:
1. Избегайте логических операций с константами enum, иначе могут появляться предупреждения несоответствия типа Warning[Pe188]. Причина в том, что операторы логики дают в результате своей работы целый тип, а не тот тип, который определен в typedef enum. Задавать битовый маски константами enum тоже плохая идея.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ответить

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