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

Обсуждаем контроллеры компании Atmel.
t@nki$t
Грызет канифоль
Сообщения: 289
Зарегистрирован: Ср дек 01, 2010 23:24:16

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

Сообщение t@nki$t »

Программатор на 4 ком порту.А как "ресетнуть во время роботы"?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Соединить ресет контроллера с землей на пару секунд. Странный вопрос вообще-то. Если есть перемычка перепрошивки программатора можно воспользоваться ей, и на разъеме программирования соединить reset и gnd. По стандартам Atmel это соседние выводы.
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение 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
выделено мол ошибка
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение 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 в функции тоже не получается читаемость кода хуже становится.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

дык как ни крути, у вас получится либо долго ждать 10-й case, либо, если его поставить в начале, придется ждать долго 1-й case...

1-й case я могу и подождать, так как он запускается 1 раз, а вот 10тый который запускается раз 20 лучше в начало поставить.
только вот не уверен, что CVAVR относится к таким умным компиляторам...

Походу вы правы.
Y.Y.
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

Сообщение 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

Подскажите.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Возможно, библиотека требует расположения всех используемых выводов на одном порту, тогда только лезть в код и править там.
Y.Y.
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

Сообщение 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])();

т.е. сразу на исполнение, без перебора вариантов.
Y.Y.
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

Сообщение Y.Y. »

Тo COKPOWEHEU

Спасибо. А другие идеи?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

А какие возрадения этой идее?
В качестве решения можно написать другую библиотеку, полностью удовлетворяющую требованиям.
Y.Y.
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

Сообщение 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. Трудоемкость написания вариантов примерно одинакова, читаемость кода - на высоте.
Может пригодиться.
Вложения
Switch_vs_Pointers.rar
(51.66 КБ) 179 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Y.Y.
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

Сообщение Y.Y. »

Конечно согласен!
Честно говоря, я думал что переход по pointers будет значительно быстрее. Но уж что получилось - тем и решил поделиться.
P.S. А если кто собирается делать длинные Case, то есть объективные данные для подумать...
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Можно ли в памяти МК расположить рядом две переменные типа int и при необходимости прочитать как одну long?

На примере как OCR1AH OCR1AL и OCR1A. Только тут байт и Int.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение 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;
//----------
        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;
}

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

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

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

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

Да и в коммерческих задачах довольно редко встречаются.
Fucking static initialization order fiasco
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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

Ну это если не совсем понимать как они работают и смотреть на код из блокнота, если их подсветить(выделить другим цветом) то всё нормально смотрится.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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