Страница 178 из 421

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

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

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

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

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

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

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

Добавлено: Сб янв 28, 2012 06:39:21
John-RADIST
Мастер Ломастер писал(а):
John-RADIST писал(а):
Подскажите пожалуйста, char stroka[6]="Hello"; например в квадратных скобках размер строки. Этоя понял, а как описывать здесь stroka[][] {"Hello","Display","Massiv"}. Пробовал по разному компилятор ругается.
Спасибо!!!

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

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

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

Спасибо за помощь!!!!

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

Добавлено: Сб янв 28, 2012 09:23:05
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;
}

и т.д.

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

Добавлено: Сб янв 28, 2012 12:22:55
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 на вход с подтягивающим резистором.

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

Добавлено: Сб янв 28, 2012 18:55:40
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
}

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

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

Добавлено: Сб янв 28, 2012 19:28:00
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 '('

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

Добавлено: Сб янв 28, 2012 19:40:18
vitalik_1984
добавьте

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

#define _BV(x) (1<<(x))
просто я привык уже что все знают что это такое:)
в студии вроде есть всегда такой дефайн
Обновление
в предыдущем варианте функции ошибка вот переработанный вариант и доработанный.

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

Добавлено: Вс янв 29, 2012 17:38:12
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;
}

и т.д.

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

Добавлено: Вс янв 29, 2012 23:30:47
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 *'

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

Добавлено: Вс янв 29, 2012 23:37:14
demiurg301
temp = atoi(string);

Вот так...

Вы туда строку должны передать в виде указателя на эту строку, а передаёте третий элемент строки.

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

Добавлено: Вс янв 29, 2012 23:39:50
Upgrader
Не понял, а как выбрать конкретный символ из длинной строки?

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

Добавлено: Вс янв 29, 2012 23:56:36
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),
Понятно? :)))

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

Добавлено: Пн янв 30, 2012 01:11:09
Upgrader
demiurg301 писал(а):Понятно? :)))
Ага, спасиб. :)))
А что это за странные "0x30", первый раз о таком способе слышу :shock:

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

Добавлено: Пн янв 30, 2012 01:17:02
demiurg301
Это код символа "ноль" в таблице ASCII. код 1 0x31 9ки -0x39.

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

ЗЫ Скачайте Керниган и Ритчи - там УСЁ написано.

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

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

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

Добавлено: Пн янв 30, 2012 09:26:43
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 то там еще дополнительные символы передаются,правильно ?Поделитесь с нами,а то мы так и будем неучами...

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

Добавлено: Пн янв 30, 2012 10:13:00
demiurg301
Мастер Ломастер писал(а):1. это не строка!
2. второй массив НЕ ЭКВИВАЛЕНТЕН первому!
НУ не те кавычки поставил - премного извиняюС-с. :))
Да не эквивалентен. Нада было так char S[6]="12345"; Или так char S[6]={'1','2','3','4','5',0}; Ну пропарил.
"1" совсем не 0x31!
А так '1' ? :)))

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

Добавлено: Пн янв 30, 2012 12:26:07
Upgrader
Наверное будете смеяться... В общем, я не нашел ни в справке CVAVR, ни в гугле касаемо языка Си, что из себя представляет тип переменной WORD... ? Как так?

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

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

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

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

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

#define WORD unsigned int

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

Добавлено: Пн янв 30, 2012 14:23:06
demiurg301
Насколько я знаю: word - это 2 байта, он же int - зачем он нужен?