Помогите, не понимаю Switch case

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Вод так не ругается.
Так правильно аль нет?
#define R24V 6 //
#define R48V 4 //
#define R96V 7 //
#define R192V 5 //

PORTA|=0<<R24V||1<<R24V||1<<R96V||0<<R192V;
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

#define OUT_PORT    PORTA
#define R24V        6 //
#define R48V        4 //
#define R96V        7 //
#define R192V       5 //

const unsigned char     out_mask[4]={
    (0<<R24V) | (1<<R48V) | (1<<R96V) | (0<<R192V),  // R24V=0; R48V=1; R96V=1; R192V=0;
    (1<<R24V) | (1<<R48V) | (1<<R96V) | (0<<R192V),  // R24V=1; R48V=1; R96V=1; R192V=0;
    (1<<R24V) | (0<<R48V) | (1<<R96V) | (0<<R192V),  // R24V=1; R48V=0; R96V=1; R192V=0;
    (1<<R24V) | (0<<R48V) | (1<<R96V) | (1<<R192V),  // R24V=1; R48V=1; R96V=1; R192V=1;
};


void __init(void)
{

OUT_PORT&=~((1<<R24V) | (1<<R48V) | (1<<R96V) | (1<<R192V));
OUT_PORT|=out_mask[(PINC>>2)&0x03];

}

Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Я, что то начал понимать. Спасибо.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Я Вам дал готовое решение, вместо портянки из switch-case'ов.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Да, я , понял спасибо. Но у меня таких проблем с полным кодом - разбираться и разбираться. Все дело в том что я сам пишу на ассемблере. Человек который мне писал программу на CVAVR умер. И мне теперь приходится разбираться с кодом и переносить его в AStudio т.к. CVAVR рабочего у меня нет. Вот такие проблемы.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Ну если человек знаком с ассемблером, то чем трактовать эти взбрыки разных версий компиляторов - не проще ли переписать на асм абсолютно четко прописанный алгоритм, т.е. поработать "живым компилятором" ?
Изображение
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Я переписал бы . Но меня пугает одно в этом коде, это обработка CRC16 для ModBus RTU. Я так и не нашел внятного объяснения как подсчитать CRC16 на ассемблере.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Если табличный метод не пугает (512 байт таблица), могу дать готовый вариант ( как раз делалось и работало на Modbus RTU ). По бестабличному методу когда-то давно пробовал, но что-то результаты отличались, видимо, неправильно понимал алгоритм. Если переписать с Си на асм, 512 "лишних" байт флеши, думаю, появятся.
СпойлерПредвижу возмущенный гул Сишников. Но что поделать - остаюсь при мнении, что писать для небольшого камня на Си - это пахать дачный участок однокорпусным плугом, прицепленным к трактору Беларус.
Последний раз редактировалось Jack_A Ср май 24, 2017 15:16:35, всего редактировалось 1 раз.
Изображение
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Jack_A писал(а): писать для небольшого камня на Си - это пахать дачный участок однокорпусным плугом, прицепленным к трактору Беларус
нееееее :))) в этом есть особое удовольствие! когда на тини13 работает сишный код, например, "лампы настроения", аналоги которого в интернете все на меге8 сделаны - это ли не оргазменноть? :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Jack_A если не жаль скиньте на msv0712(гав)ya.ru

Добавлено after 1 minute 18 seconds:
Решился переписать код на ASM. Заодно и с кодом разберусь.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Отправил на мейл.
Изображение
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Jack_A Спасибо выручил все работает. С кодом разобрался.

Добавлено after 5 minutes 35 seconds:
Есть еще вопрос
Почему так все работает
lds r16,rx_buffer
cp r16,r10
brne Error_ID

а, так нет
lds r16,rx_buffer
lds r17,Modbus_ID
cp r16,r17
brne Error_ID
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Рецепт, как переползти с асма на си. Скачиваем книги по си. Читаем. Не понимаем, делаем паузу. Опять читаем. Что то начинаем понимать. Начинаем пробовать. Притом пробуем переносить наработки на асме. Так постепенно начнет получаться. Главное, отучиваться от наследия асма. Мы теперь оперируем "объектами". Но знание асма помогает понять что там компилятор накомпилировал. И миримся с тем, что на си выхлоп объемнее, чем на асме.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

RUNA писал(а):
Почему так все работает

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

lds r16,rx_buffer
.......
[/color]
Вопрос, наверно, ко мне ? И что значит "не работает" ? Не компилируется? Или компилится, но работаeт не так?
В первом коде не знаю, что загружено в r10. Во втором: я так понимаю, дивайс принял пакет и хочет узнать - ему ли эта мессага адресована. В таком случае, он сравнивает со своим ID, который константа, потому должно д.быть:

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

ldi r17,Modbus_ID
или еще проще - вместо последних двух - одна команда :

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

cpi r16,Modbus_ID
Изображение
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Дело в том что в первом варианте я сравниваю полученный ID с сохраненным ID в r10, а, во втором я свой ID сохранил в RAM и пытаюсь сравнить. В первом все отлично, а во втором постоянный косяк.

Добавлено after 2 minutes 48 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3118861#p3118861"]Рецепт, как переползти с асма на си.[/uquote]
Нет у меня желания переходить на С.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

RUNA писал(а):я сравниваю полученный ID с сохраненным ID в r10
Не понимаю. Если этот дивайс - слейв, то он имеет свой физический адрес - перемычками, DIP-переключателями или записью в EEPROM заданный. И куда его считывать для сравнения - в r10 или r17 - абсолютно безразлично. Телепатия мне подсказывает, что возможная причина косяка - портится r17 в прерывании из-за криво написанного обработчика. Иначе - влияние кометы Галея. :(
Изображение
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3119967#p3119967"]Не понимаю. Если этот дивайс - слейв, то он имеет свой физический адрес - перемычками, DIP-переключателями или записью в EEPROM заданный. И куда его считывать для сравнения - в r10 или r17 - абсолютно безразлично. Телепатия мне подсказывает, что возможная причина косяка - портится r17 в прерывании из-за криво написанного обработчика. Иначе - влияние кометы Галея. :([/uquote]

Видимо реально глюк. Надо попробовать в другой версии программы.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3119080#p3119080"]или еще проще - вместо последних двух - одна команда :

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

cpi r16,Modbus_ID
[/uquote]
Эта команда сравнивает с константой, а та - с переменной, расположенной то тому адресу.
Jack_A писал(а):Телепатия мне подсказывает, что возможная причина косяка - портится r17 в прерывании из-за криво написанного обработчика.
Вот это вероятная причина. Используются ли прерывания? Где идет запись в r10 в первом варианте кода?
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

COKPOWEHEU писал(а): Эта команда сравнивает с константой, а та - с переменной, расположенной то тому адресу
Ясно дело. Но при первом подходе ID был бы прописан во флеш-памяти прграмм, что, конечно, было бы абсурдом - для каждого экземпляра прибора - свой экземпляр прошивки. :(
Изображение
Прорезались зубы
Аватара пользователя
Сообщения: 249
Зарегистрирован: Ср дек 31, 2008 01:55:19
Откуда: Санкт-Петербург

Сообщение RUNA »

Я пробовал запретить прерывания-та же фигня. Пробовал указать в Z адрес и скидывать в R16. В общем все перепробовал. Работает только если при старте программы ID сохраняю в регистре общего назначения.
Никогда не бойся делать то, что ты не умеешь. Ковчег был сооружен любителем. Профессионалы построили "Титаник".
Я всегда делаю то, что не умею, иначе как я научусь?! Когда Муза приходит ко мне, то застает меня за работой! - Пикассо.
Ответить

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