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

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

Добавлено: Чт дек 04, 2014 19:14:11
t@nki$t
Программатор на 4 ком порту.А как "ресетнуть во время роботы"?

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

Добавлено: Чт дек 04, 2014 19:50:21
COKPOWEHEU
Соединить ресет контроллера с землей на пару секунд. Странный вопрос вообще-то. Если есть перемычка перепрошивки программатора можно воспользоваться ей, и на разъеме программирования соединить reset и gnd. По стандартам Atmel это соседние выводы.

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

Добавлено: Вт дек 09, 2014 23:23:14
mixon46
подскажите что не так с кодом. почему вылезает ошибка в файле acm. что не так с кодом и где мне искать
Спойлер
#include <tiny2313.h>
#include <delay.h>

void main(void)



{
unsigned int a;

DDRD.0=0;
PORTD.0=0;

DDRB=0xFF;
PORTB=0x00;



while (1)
{m1: delay_us (100);
if (PIND.0==0) {
goto m1;
};
m2: delay_us (100);
if (PIND.0==1) {
a=a+1; \\ тут было предупреждение потому что переменной не было задано первоначальное значение
goto m2;
};
if (a>94&&106>a)
{PORTB.0=1;};
if (a>194&&206>a)
{PORTB.1=1;};
if (a>294&&306>a)
{PORTB.2=1;};
if (a>394&&406>a)
{PORTB.3=1;};

delay_us (10000);
PORTB=0x00;
a=0;

goto m1;
}
}

а рядом в файле asm .SET power_ctrl_reg=mcucr
выделено мол ошибка

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

Добавлено: Ср дек 10, 2014 06:38:40
pokk
Здравствуйте, подскажите в какой последовательности codevision расставляет case и можно ли её изменить ?
К примеру есть такой switch

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

switch(spi_mode){
	case 0:{#asm("nop");break;}
	case 1:{#asm("nop");break;}
	case 2:{#asm("nop");break;}
}
тут всё понятно как написано так он и расставит

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

switch(spi_mode){
	case 2:{#asm("nop");break;}
	case 1:{#asm("nop");break;}
	case 0:{#asm("nop");break;}
}
и теперь есть такой вот switch так вот тут я хочу что бы он расставил по порядковому номеру case т.е так же как в первом switch .
Дело вот в чём когда case становится много скажем штук 10 и в этот 10тый case надо входить несколько раз(20), то происходит накрутка лишних тактов на проверке с 1 по 9 case. Что бы убрать накрутку тактов я хочу разместить его в начало. Но перенести сам case в начало не получается рушится алгоритм и читаемость кода. Выделить case в функции тоже не получается читаемость кода хуже становится.

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

Добавлено: Ср дек 10, 2014 07:07:55
ARV
дык как ни крути, у вас получится либо долго ждать 10-й case, либо, если его поставить в начале, придется ждать долго 1-й case...
в принципе, если значения case - это последовательный ряд чисел, умный компилятор может преобразовать оператор switch в таблицу переходов и тогда время вода в любой case будет одинаковым. только вот не уверен, что CVAVR относится к таким умным компиляторам...

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

Добавлено: Ср дек 10, 2014 09:22:15
pokk
дык как ни крути, у вас получится либо долго ждать 10-й case, либо, если его поставить в начале, придется ждать долго 1-й case...
1-й case я могу и подождать, так как он запускается 1 раз, а вот 10тый который запускается раз 20 лучше в начало поставить.
только вот не уверен, что CVAVR относится к таким умным компиляторам...
Походу вы правы.

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

Добавлено: Сб дек 13, 2014 17:39:09
Y.Y.
Уважаемые!
Пишу проект в CodeVision 3.10 (ATmega386) с работой с SD card и несколькими другими устройствами на SPI.
Встроенный диалог по работе с библиотекой SDcard предлагает в качестве сигнала SS биты порта B.
Работает замечательно.
Вопросы:
1. Как можно назначить SS для SDcard c другого порта?
2. В идеале как бы определить SS для SD в таком виде (а не через диалог):

#define SD_SSpin xx
.....................
#define_Slave1_SSpin xx
#define_SlaveN_SSpin xx

Подскажите.

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

Добавлено: Сб дек 13, 2014 18:30:29
COKPOWEHEU
Возможно, библиотека требует расположения всех используемых выводов на одном порту, тогда только лезть в код и править там.

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

Добавлено: Сб дек 13, 2014 19:29:36
Y.Y.
To pokk

Как-то давно делал что-то подобное...
Почитай "массив указателей функций".

Определяем действия для каждого spi_mode в отдельной функции, собираем указатели на эти функции в массив, скажем, what_to_do_with_spi_mode(void) [], где индекс - spi_mode .

Затем,
вместо switch(spi_mode) {
.......}

вызываем
( * what_to_do_with_spi_mode[spi_mode])();

т.е. сразу на исполнение, без перебора вариантов.

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

Добавлено: Сб дек 13, 2014 21:25:24
Y.Y.
Тo COKPOWEHEU

Спасибо. А другие идеи?

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

Добавлено: Сб дек 13, 2014 23:07:27
COKPOWEHEU
А какие возрадения этой идее?
В качестве решения можно написать другую библиотеку, полностью удовлетворяющую требованиям.

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

Добавлено: Вс дек 14, 2014 13:43:41
Y.Y.
To pokk & ARV

В продолжение вашего обсуждения скорости выполнения оператора Switch-Case и моего поста про массив указателей на функции.
Написал маленькую программку для сравнения скоростей этих вариантов. Исходник в архиве.
Как и писали, входной параметр называется spi_mode, исполняемое действие - #asm("nop").
Измерялось время N=10000 обращений.
CodeVision 3.10 + Proteus. Детали см. исходник.

Результаты (рис. в архиве):
Изображение
1. Время выполнения оператора Switch - от 11мсек. (первый case) до 48.7мсек. (13-й case). (за N обращений).
2. Время такого же выполнения с помощью указателей не зависит от параметра и составляет около 18мсек.
3. Трудоемкость написания вариантов примерно одинакова, читаемость кода - на высоте.
Может пригодиться.

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

Добавлено: Вс дек 14, 2014 14:35:28
ARV
Вы напрасно тратили время: результат ваших тестов был очевиден изначально.

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

Добавлено: Вс дек 14, 2014 15:00:55
Y.Y.
Конечно согласен!
Честно говоря, я думал что переход по pointers будет значительно быстрее. Но уж что получилось - тем и решил поделиться.
P.S. А если кто собирается делать длинные Case, то есть объективные данные для подумать...

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

Добавлено: Пн дек 15, 2014 01:05:54
amd9800
Можно ли в памяти МК расположить рядом две переменные типа int и при необходимости прочитать как одну long?

На примере как OCR1AH OCR1AL и OCR1A. Только тут байт и Int.

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

Добавлено: Пн дек 15, 2014 04:30:13
pokk
amd9800, Да можно с использование оператора объединения (union) всё что объявлено внутри него располагается с один адресом

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

union _union_long_int{
unsigned long int a;
unsigned int b[2]; 
}  union_long_int;

union_long_int.a=0xAABBCCDD;
union_long_int.b[0]=0x1111;  
//a=0xAABB1111
union_long_int.b[1]=0x2222;  
//a=0x22221111
либо сделать хак типа такого

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

unsigned long int aa@0xf1;
unsigned int b1@0xf1;
unsigned int b2@0xf3;
Я думал что такой вариант работает быстрее, а сейчас по протестировал оказалось что одинаково.

Y.Y., Благодарю за тестирование, но вариант с использование функций не очень подходит.
Я решил по пробовать использовать протопотоки от Adam Dunkels. Но пока только обошёлся макросами из статьи http://club.shelek.ru/viewart.php?id=338

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

#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(i,x) do { state=i; return x; case i:; } while (0)
#define crFinish }
Примерно так выглядит опрос кнопок. Если всё перенести в функции то уже всё будет по другому выглядит.

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

unsigned char Process_scan_Key_FSM(unsigned char *data){
unsigned char temp;
//------------INIT---------------
        crBegin *data=0;
        Set_but_OK
        crReturn(1,0);
//>>>>>>>>Выход>>>>>>>>>>>>>>>>>>        
        Key_code2.OK=CTR_IN;
        Set_but_ESC        
        crReturn(2,0);
//>>>>>>>>Выход>>>>>>>>>>>>>>>>>>        
        Key_code2.ESC=CTR_IN;
        Set_but_UP
        crReturn(3,0);
//>>>>>>>>Выход>>>>>>>>>>>>>>>>>>
        Key_code2.UP=CTR_IN;
        Set_but_DW
        crReturn(4,0);                
//>>>>>>>>Выход>>>>>>>>>>>>>>>>>>
        Key_code2.DW=CTR_IN;
//----------------------------------                                            
        return  Key_code2;
}


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

Добавлено: Пн дек 15, 2014 09:48:45
ARV
pokk писал(а):Примерно так выглядит опрос кнопок. Если всё перенести в функции то уже всё будет по другому выглядит.
не буду утверждать, что исключительно прав, но по-моему в любительских конструкциях просто нет таких задач, при решении которых действительно необходимо жертвовать читаемостью кода в угоду чему-то еще...

использование макросов в данном случае с моей точки зрения делает код невоспринимаемым, что безусловно плохо. с функциями, действительно, все выглядит совершенно по-другому: понятно, качественно и грамотно. даже с классическим switch лучше гораздо.

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

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

Добавлено: Пн дек 15, 2014 10:04:36
Pink-Pank
Вообще не понимаю, зачем там do while, если в условии стоит 0? Почему просто не написать в заключения в do while?
но по-моему в любительских конструкциях просто нет таких задач, при решении которых действительно необходимо жертвовать читаемостью кода в угоду чему-то еще...
Да и в коммерческих задачах довольно редко встречаются.

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

Добавлено: Пн дек 15, 2014 10:22:50
pokk
использование макросов в данном случае с моей точки зрения делает код невоспринимаемым
Ну это если не совсем понимать как они работают и смотреть на код из блокнота, если их подсветить(выделить другим цветом) то всё нормально смотрится.

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

Добавлено: Пн дек 15, 2014 11:18:14
ARV
истинно свободный человек имеет полное право зайти как угодно далеко в своих заблуждениях.
но к цели быстрее дойдет тот, кто поступает правильно.