CodeVision AVR в вопросах и ответах

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

Re: CodeVision AVR в вопросах и ответах

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

John-RADIST писал(а):
vitalik_1984 писал(а):Чтобы выводить разные строки создать массив stroka[][] {"Hello","Display","Massiv"}потом просто обращаться к нему stroka[1] (Hello)или stroka[i]

Подскажите пожалуйста, char stroka[6]="Hello"; например в квадратных скобках размер строки. Этоя понял, а как описывать здесь stroka[][] {"Hello","Display","Massiv"}. Пробовал по разному компилятор ругается.
Спасибо!!!

не надо лишних скобок, не надо знать размер строк (они могут быть разными). надо просто маленько изучать Си

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

char *stroka[] = {"Hello", "Display", "Massiv"};
по-моему я уже где-то показывал пример, как выводить разные строки по номеру...
битва с дураками проиграна, победители торжествуют. слава победителям!
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Мастер Ломастер писал(а):
John-RADIST писал(а):
vitalik_1984 писал(а):Чтобы выводить разные строки создать массив stroka[][] {"Hello","Display","Massiv"}потом просто обращаться к нему stroka[1] (Hello)или stroka[i]

Подскажите пожалуйста, char stroka[6]="Hello"; например в квадратных скобках размер строки. Этоя понял, а как описывать здесь stroka[][] {"Hello","Display","Massiv"}. Пробовал по разному компилятор ругается.
Спасибо!!!

не надо лишних скобок, не надо знать размер строк (они могут быть разными). надо просто маленько изучать Си

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

char *stroka[] = {"Hello", "Display", "Massiv"};
по-моему я уже где-то показывал пример, как выводить разные строки по номеру...[/quote

Спасибо за помощь!!!!
Аватара пользователя
Solyara
Открыл глаза
Сообщения: 61
Зарегистрирован: Пн окт 11, 2010 08:08:38
Откуда: Алматы

Re: CodeVision AVR в вопросах и ответах

Сообщение Solyara »

Господа приветствую. Начинаю осваивать программирование. На Tiny13 пишу код под ШИМ:
По нажатию кнопки выполняется переключение режимов работы ШИМ от максимального до минимального - реализовано. Загвоздка у меня в следующем, необходимо при удержании кнопки в 3 секунды выключить ШИМ. Не могу понять как данное реализовать в жизнь. Подскажите пожалуйста алгоритм, а лучше код.

Прошу сильно не пинать - это второй мой код, правил написания не знаю. Вот, что я навоял:

while (1)
{
#asm("wdr"); //Сброс сторожевого таймера

count++; //Считаю время на выкл
if (count==10000) {
Step=0x00;
OCR0A=Step;
count=0;
}

st=PINB & 0b001000; // Cостояние кнопки
delay_us(50); // Ждем


if (!st) { // Нажал кнопку
delay_ms(50);
if (!st) { //Дребезг кнопки устранить.
countst++; // счетчик режимов работы +1

if (!st) { //ЗДЕСЬ ПЫТАЮСЬ РЕАЛИЗОВАТЬ НЕ ВЫХОДИТ КАМЕННЫЙ ЦВЕТОК
delay_ms(3000);
OCR0A=0x00;

if (countst>4) { // проверка переполнения счетчика режима
countst=1; // Назад
}


if (countst==1) { // 100% нагрева
Step=0xFE;
OCR0A=Step;
count=0; // счетчик вырубить на 0
}

if (countst==2) { // 75% нагрева
Step=200;
OCR0A=Step;
count=0;
}

и т.д.
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение a.garkin »

Народ подскажите плиз как можно переделать подключение кнопок, раньше было все на один порт, и в зависимости от напряжения выбиралось условие:

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

        if                      (key_adc <=   3)  return KEY_LEFT; 
        if ((key_adc >= 124) && (key_adc <= 130)) return KEY_RIGHT;
        if ((key_adc >= 167) && (key_adc <= 173)) return KEY_UP;
        if ((key_adc >= 188) && (key_adc <= 194)) return KEY_DOWN;
        if ((key_adc >= 201) && (key_adc <= 207)) return KEY_MENU;
        if ((key_adc >= 210) && (key_adc <= 215)) return KEY_ESC;


А мне бы надо просто кнопки повешены отдельно. Т.е одна кнопка один порт, к примеру PORTC биты 2.3.4.5.6.7
Посмотрел статейку http://chipenable.ru/index.php/programm ... s-avr.html
Сделал у себя что-то вроде:

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

 
//порт, к которому подключены кнопки
#define PORT_BUTTON     PORTC
#define PIN_BUTTON     PINC
#define DDRX_BUTTON     DDRC

//номера выводов, к которым подключены кнопки
#define DOWN         6
#define ESC         7
#define UP        5
#define MENU         2
#define LEFT         3
#define RIGHT         4


//коды, которые будут записываться в буфер
#define KEY_NULL      0
#define KEY_MENU     1
#define KEY_ESC    2
#define KEY_UP        3
#define KEY_DOWN      4
#define KEY_LEFT         5
#define KEY_RIGHT         6

 if (BitIsClear(PIN_BUTTON, MENU))     
    key = KEY_MENU;
  else if (BitIsClear(PIN_BUTTON, ESC))   
    key = KEY_ESC;
  else if (BitIsClear(PIN_BUTTON, UP))       
    key = KEY_UP;       
  else if (BitIsClear(PIN_BUTTON, DOWN))     
    key = KEY_DOWN;


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

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

a.garkin писал(а):
Спойлер

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

 if (BitIsClear(PIN_BUTTON, MENU))     
    key = KEY_MENU;
  else if (BitIsClear(PIN_BUTTON, ESC))   
    key = KEY_ESC;
  else if (BitIsClear(PIN_BUTTON, UP))       
    key = KEY_UP;       
  else if (BitIsClear(PIN_BUTTON, DOWN))     
    key = KEY_DOWN;



По моему плохой пример слишком много неопределенностей при нажатии двух клавиш.

почему бы не сделать
Спойлер

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

//номера выводов, к которым подключены кнопки
#define DOWN         6
#define ESC         7
#define UP        5
#define MENU         2
#define LEFT         3
#define RIGHT         4
#define  _BV(x) (1<<(x))
#define BUTTON_MASK (_BV(DOWN)|_BV(ESC)|_BV(UP)|_BV(MENU)|_BV(LEFT)|_BV(RIGHT)) //маска для кнопок

DDR_BUTTON&= ~BUTTON_MASK;//Наводим порты
PORT_BUTTON |= BUTTON_MASK;


unsigned char BUT_GetKey(void){ //функция получения кода кнопок
    unsigned char temp=0, key=0;   
      temp = (~PIN_BUTTON) & BUTTON_MASK;//тут ~ показывает, что используем низкий уровень порта
   switch (temp){
      case (_BV(DOWN)):
         { key = KEY_DOWN;break;}
      case (_BV(ESC)):
          {key = KEY_ESC;break;}
      case (_BV(UP)):
          {key = KEY_UP;break;}
      case (_BV(MENU)):
         { key = KEY_MENU;break;}
      case (_BV(LEFT)):
         { key = KEY_LEFT;break;}
      case (_BV(RIGHT)):
          {key = KEY_RIGHT;break;}
      default:{key=0;break;}
           return key;
             }//конец свитча
}//конец функции

//потом используем например для антидребезга:
old_key=BUT_GetKey();
_delay_us(200);
new_key=BUT_GetKey();
if (old_key==new_key){
       //Делаем тут все что нужно с new_key
}



Но можно и от дребезга сначала считать порт как есть, а потом уже вызвать подпрограмму обработки, еслли нужно.Так меньше места будет занято во флеш.
Последний раз редактировалось vitalik_1984 Вс янв 29, 2012 15:34:57, всего редактировалось 3 раза.
В поисках истины человек развивается.
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение a.garkin »

vitalik_1984 писал(а):
a.garkin писал(а):
Спойлер

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

 if (BitIsClear(PIN_BUTTON, MENU))     
    key = KEY_MENU;
  else if (BitIsClear(PIN_BUTTON, ESC))   
    key = KEY_ESC;
  else if (BitIsClear(PIN_BUTTON, UP))       
    key = KEY_UP;       
  else if (BitIsClear(PIN_BUTTON, DOWN))     
    key = KEY_DOWN;



По моему плохой пример слишком много неопределенностей при нажатии двух клавиш.

почему бы не сделать
Спойлер

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

//номера выводов, к которым подключены кнопки
#define DOWN         6
#define ESC         7
#define UP        5
#define MENU         2
#define LEFT         3
#define RIGHT         4

#define BUTTON_MASK (_BV(DOWN)|_BV(ESC)|_BV(UP)|_BV(MENU)|_BV(LEFT)|_BV(RIGHT)) //маска для кнопок

DDR_BUTTON&= ~BUTTON_MASK;//Наводим порты
PORT_BUTTON |= BUTTON_MASK;


unsigned char BUT_GetKey(void){ //функция получения кода кнопок
    unsigned char temp=0, key=0;   
      temp = (~PIN_BUTTON) & BUTTON_MASK;//тут ~ показывает, что используем низкий уровень порта
   switch (temp){
                case (temp&_BV(DOWN)):
         { key = KEY_DOWN;break;}
      case (temp&_BV(ESC)):
          {key = KEY_ESC;break;}
      case (temp&_BV(UP)):
          {key = KEY_UP;break;}
      case (temp&_BV(MENU)):
         { key = KEY_MENU;break;}
      case (temp&_BV(LEFT)):
         { key = KEY_LEFT;break;}
      case (temp&_BV(RIGHT)):
          {key = KEY_RIGHT;break;}
      default:{key=0;break}
           return key;
             }//конец свитча
}конец функции

//потом используем например для антидребезга:
old_key=BUT_GetKey();
_delay_us(200);
new_key=BUT_GetKey();
if (old_key==new_key){
       //Делаем тут все что нужно с new_key
}



Но можно и от дребезга сначала считать порт как есть, а потом уже вызвать подпрограмму обработки, еслли нужно.Так меньше места будет занято во флеш.

что-то не получается:
Error: C:\project\buttons.h(40), included from: main_programm.c: undefined symbol '_BV'
а также:
если ниже срока не закоментирована валится.
DDR_BUTTON&= ~BUTTON_MASK;//Наводим порты
Error: C:\project\buttons.h(34), included from: main_programm.c: missing '('
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

добавьте

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

#define _BV(x) (1<<(x))

просто я привык уже что все знают что это такое:)
в студии вроде есть всегда такой дефайн
Обновление
в предыдущем варианте функции ошибка вот переработанный вариант и доработанный.
Вложения
Main.c
(4.17 КБ) 253 скачивания
В поисках истины человек развивается.
Аватара пользователя
Solyara
Открыл глаза
Сообщения: 61
Зарегистрирован: Пн окт 11, 2010 08:08:38
Откуда: Алматы

Re: CodeVision AVR в вопросах и ответах

Сообщение Solyara »

Народ, а мне кто нибудь ответит?

Solyara писал(а):Господа приветствую. Начинаю осваивать программирование. На Tiny13 пишу код под ШИМ:
По нажатию кнопки выполняется переключение режимов работы ШИМ от максимального до минимального - реализовано. Загвоздка у меня в следующем, необходимо при удержании кнопки в 3 секунды выключить ШИМ. Не могу понять как данное реализовать в жизнь. Подскажите пожалуйста алгоритм, а лучше код.

Прошу сильно не пинать - это второй мой код, правил написания не знаю. Вот, что я навоял:

while (1)
{
#asm("wdr"); //Сброс сторожевого таймера

count++; //Считаю время на выкл
if (count==10000) {
Step=0x00;
OCR0A=Step;
count=0;
}

st=PINB & 0b001000; // Cостояние кнопки
delay_us(50); // Ждем


if (!st) { // Нажал кнопку
delay_ms(50);
if (!st) { //Дребезг кнопки устранить.
countst++; // счетчик режимов работы +1

if (!st) { //ЗДЕСЬ ПЫТАЮСЬ РЕАЛИЗОВАТЬ НЕ ВЫХОДИТ КАМЕННЫЙ ЦВЕТОК
delay_ms(3000);
OCR0A=0x00;

if (countst>4) { // проверка переполнения счетчика режима
countst=1; // Назад
}


if (countst==1) { // 100% нагрева
Step=0xFE;
OCR0A=Step;
count=0; // счетчик вырубить на 0
}

if (countst==2) { // 75% нагрева
Step=200;
OCR0A=Step;
count=0;
}

и т.д.
Аватара пользователя
Upgrader
Друг Кота
Сообщения: 26671
Зарегистрирован: Пт май 18, 2007 22:56:58

Re: CodeVision AVR в вопросах и ответах

Сообщение Upgrader »

Подскажите пожалуйста в чем ошибка.
Нужно один символ из строки (там цифра) преобразовать в цифру.
Пытаюсь так:
char string[10];
int temp;
temp = atoi(string[2]);

На это компилятор ругается: Error: File.c(240): function argument #1 of type 'unsigned char' is incompatible with required parameter of type 'unsigned char *'
Не променяю медь на ржавую несгорайку!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

temp = atoi(string);

Вот так...

Вы туда строку должны передать в виде указателя на эту строку, а передаёте третий элемент строки.
Аватара пользователя
Upgrader
Друг Кота
Сообщения: 26671
Зарегистрирован: Пт май 18, 2007 22:56:58

Re: CodeVision AVR в вопросах и ответах

Сообщение Upgrader »

Не понял, а как выбрать конкретный символ из длинной строки?
Не променяю медь на ржавую несгорайку!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Какой символ?
О чём вы.

У вас есть строка {"1","2","3","4","5",0,0,0,0,... } или она же {0x31,0x32,0x33,0x34,0x35, 0x00,0x00,x00,x00....}
Эта функция берёт строку( она же массив их ASCII символов) , вычитывает её до символа конца строки 0x00 и записывает в temp значение 12345. Если там будет {"9","9","9","9","9",0,0,0,0,... }, то в temp оно не влезет, а обрежется до 99999-65536.

Если вам нужно перевести один символ ЧИСЛА из ASCII проще вычесть из него 0x30, т.е.

temp= string[2]-0x30. НО вы должны быть уверены что там точно цифра в ASCII от 0( 0x30) до 9( 0x39),
Понятно? :)))
Аватара пользователя
Upgrader
Друг Кота
Сообщения: 26671
Зарегистрирован: Пт май 18, 2007 22:56:58

Re: CodeVision AVR в вопросах и ответах

Сообщение Upgrader »

demiurg301 писал(а):Понятно? :)))
Ага, спасиб. :)))
А что это за странные "0x30", первый раз о таком способе слышу :shock:
Не променяю медь на ржавую несгорайку!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Это код символа "ноль" в таблице ASCII. код 1 0x31 9ки -0x39.

данная функция atoi так и делает - перебирает символы и вычитает из них 0x30.

ЗЫ Скачайте Керниган и Ритчи - там УСЁ написано.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

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

demiurg301 писал(а):У вас есть строка {"1","2","3","4","5",0,0,0,0,... } или она же {0x31,0x32,0x33,0x34,0x35, 0x00,0x00,x00,x00....}
1. это не строка!
2. второй массив НЕ ЭКВИВАЛЕНТЕН первому! "1" совсем не 0x31!
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Мастер Ломастер писал(а):
demiurg301 писал(а):У вас есть строка {"1","2","3","4","5",0,0,0,0,... } или она же {0x31,0x32,0x33,0x34,0x35, 0x00,0x00,x00,x00....}
1. это не строка!
2. второй массив НЕ ЭКВИВАЛЕНТЕН первому! "1" совсем не 0x31!

мастер везде залезет: Нет, не так не то! Взял бы да сказал что то и что правильно.
Вы наверно хотели сказать,что вместо строки {"1","2","3","4","5",0,0,0,0,... } должна быть строка{"12345"} а если передается по usart то там еще дополнительные символы передаются,правильно ?Поделитесь с нами,а то мы так и будем неучами...
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Мастер Ломастер писал(а):1. это не строка!
2. второй массив НЕ ЭКВИВАЛЕНТЕН первому!


НУ не те кавычки поставил - премного извиняюС-с. :))
Да не эквивалентен. Нада было так char S[6]="12345"; Или так char S[6]={'1','2','3','4','5',0}; Ну пропарил.

"1" совсем не 0x31!


А так '1' ? :)))
Аватара пользователя
Upgrader
Друг Кота
Сообщения: 26671
Зарегистрирован: Пт май 18, 2007 22:56:58

Re: CodeVision AVR в вопросах и ответах

Сообщение Upgrader »

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

Re: CodeVision AVR в вопросах и ответах

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

vitalik_1984 писал(а):мастер везде залезет: Нет, не так не то! Взял бы да сказал что то и что правильно.
а чего я ждал: что мне спасибо скажут?! :(
vitalik_1984 писал(а):Поделитесь с нами,а то мы так и будем неучами...
не такие вы неучи, как прибедняетесь. а по стопицот раз повторять одно и то же я забодался.
demiurg301 писал(а):А так '1' ?
другое дело.
Upgrader писал(а):В общем, я не нашел ни в справке CVAVR, ни в гугле касаемо языка Си, что из себя представляет тип переменной WORD... ? Как так?
да вот так: нет такого стандартного типа. если сильно приспичило, можно сделать самому:

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

typedef unsigned int WORD;
или иначе (на мой взгляд - менее правильно):

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

#define WORD unsigned int
битва с дураками проиграна, победители торжествуют. слава победителям!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: CodeVision AVR в вопросах и ответах

Сообщение demiurg301 »

Насколько я знаю: word - это 2 байта, он же int - зачем он нужен?
Ответить

Вернуться в «AVR»