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

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

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

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

Сообщение COKPOWEHEU »

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

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

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

Сообщение ARV »

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

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

Сообщение pokk »

дык как ни крути, у вас получится либо долго ждать 10-й case, либо, если его поставить в начале, придется ждать долго 1-й case...
1-й case я могу и подождать, так как он запускается 1 раз, а вот 10тый который запускается раз 20 лучше в начало поставить.
только вот не уверен, что CVAVR относится к таким умным компиляторам...
Походу вы правы.
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Ср мар 13, 2013 19:43:22

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

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

Сообщение COKPOWEHEU »

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

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

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

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

Тo COKPOWEHEU

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

Сообщение COKPOWEHEU »

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

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

Сообщение ARV »

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

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

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

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

Сообщение amd9800 »

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

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

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

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

Сообщение ARV »

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

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

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

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

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

Вообще не понимаю, зачем там do while, если в условии стоит 0? Почему просто не написать в заключения в do while?
но по-моему в любительских конструкциях просто нет таких задач, при решении которых действительно необходимо жертвовать читаемостью кода в угоду чему-то еще...
Да и в коммерческих задачах довольно редко встречаются.
Fucking static initialization order fiasco
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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