Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

кусочек из даташита правда 8меги от 16 у меня нет.
Спойлер

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

C Code Example
char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
_CLI();
EECR |= (1<<EEMWE); /* start EEPROM write */
EECR |= (1<<EEWE);
SREG = cSREG; /* restore SREG value (I-bit) */
посмотрите в даташите вашего МК
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

baghear писал(а):Добрый день, как обратиться к регистру SREG на Си, проект на меге16.
Вот все что есть в файле iom16.h
http://screenshot.su/show.php?img=ef1cc ... 08e69e.jpg
Интересно... а для чего может на Си понадоюится управление регистром SREG ?
Mishany писал(а):
Спойлер

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

C Code Example
char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
_CLI();
EECR |= (1<<EEMWE); /* start EEPROM write */
EECR |= (1<<EEWE);
SREG = cSREG; /* restore SREG value (I-bit) */
Ах да... вспомнил... я и сам так делал когдато... - например чтобы в нужном месте запомнить состояние прерываний, запретить прерывания, а потом восстановить то запомненное состояние...
Реклама
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

SREG должен для такой манипуляции быть должен быть определен в дефайнах.
Как компилятор отличает unsigned, вот кусочек кода и по дизассемблеру не видно отличий?
http://screenshot.su/show.php?img=b5a53 ... fa14a2.jpg
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Приветствую всех!
Не понимаю, почему этот код неправильно работает :

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

   volatile uint32_t asd = 0;
   volatile uint8_t qwe = 0;
   asd = asd/qwe;
   if(asd > 0xFF)
      qwe = 0 ;
При отладке, после выполнения деления, asd = 0xFFFFFFFF. Объясните пожалуйста почему так?
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Дык, на ноль то делить нельзя :) Получается максимальное число.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

:oops: че то и вправду туплю... пора отдыхать.
Ставим плюсы: )
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Если АВРовский компилятор держит регистр R1 нулевым, как он пользуется аппаратным умножителем?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Ясно.
Нигде не могу найти, как должна выглядеть "грамотная" прога на Сях (на АСМе тоже было бы неплохо).

Ну, что-то вроде универсальной. Чтобы пользователь мог залить её на "любой" МК с "любой" частотой и, например, работать по 1-Wire любой ногой.
Т.е. всё по разным файлам, с соответствующими понятными варнингами при компиляции.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в свое время я этой темой "увлекался" и, как мне кажется, достиг практически желаемого вами :)
правда, на любую частоту рассчитывать не приходится, т.к. код на Си 1-wire маловероятно будет работать при тактовой от 1 МГц и ниже... но если выше - работает, проверено на 8 и более МГц :))

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Ну, я потому и писал в кавычках "любой".
ARV писал(а):код на Си 1-wire маловероятно будет работать при тактовой от 1 МГц и ниже...
С АСМовскими вставками наверняка будет. На 1 МГц самое быстрое что требуется это всего-то через 13 тактов считать значение от слэйва. Кстати про скорость и 1-Wire: http://radiokot.ru/forum/viewtopic.php? ... 3#p2125243
ARV писал(а):поищу по закромам - выложу, если найду :)
Хорошо бы. А то я поначалу быдлокодил всё в один файл, без возможности какого-либо переноса.

Или просто на словах, что должно быть и чего-как объявлять. Например, подключаемые файлы .h и .c — что в каждом?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение ARV »

я сделал 2 хидера: в одном определил все константы, касающиеся протокола (тайминги различных этапов тайм-слотов, стандартные команды, коды устройств и т.п.), а во втором - функции для поиска девайсов, передачи байтов, приема байтов, вычисления CRC и т.п.

ну а модуль, соответственно, один.

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

т.к. от тактовой по-настоящему зависят только прием-передача бита, то в этих функциях в нужных местах использовал ATOMIC_BLOCK(RESTORE_STATE), чтобы задержки (стандартные из delay.h) не плавали от таковой. собственно, вот и все...

чтобы меньше зависеть от портов и пинов, сделал все через маски, поэтому появилась возможность иметь 8 независимых линий 1-wire на одном порту, что очень удобно для нескольких термодатчиков DS18x20: задал маску 0xFF и подаешь одновременно во все 8 линий сброс, команду старта измерения, потом в нужный момент так же точно сброс, команду чтения результата и опа-на! меняешь маску на 0x01 и считываешь температуру только с 1 датчика, потом сменил маску 0x02 и считал второй... огромный плюс - не надо абсолютно заморачиваться с адресами, т.к. каждый датчик только один на линии! для конечного пользователя намного удобнее, чем меню и инструкция, как датчики приручить :)

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Вкусно, но мало. :)
ARV писал(а):меняешь маску на 0x01 и считываешь температуру только с 1 датчика
Круче было бы одновременно и считывать с 8-ми датчиков 8)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

А интересная задачка получается. Каждый из 8 портов принял по 8 байт...
ARV писал(а):разбирать параллельно принятые данные в 8 последовательных цепочек - тот еще гемор...
Я думаю, это довольно легко решается за 8*64=512 сдвигов через перенос и дополнительных 64 байт ОЗУ.
Т.е. взяли 1-й "параллельный" байт, его первый бит сдвигом через переноС засунули в первый "последовательный" байт первого канала,
взяли тот же 1-й "параллельный" байт, его второй бит сдвигом через переноС засунули в первый "последовательный" байт второго канала,
...
взяли 64-й "параллельный" байт, его восьмой бит сдвигом через переноС засунули в восьмой "последовательный" байт восьмого канала.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Gudd-Head писал(а):Круче было бы одновременно и считывать с 8-ми датчиков 8)
А что в этом крутого ? :)
Не думаю, что при работе с какими-нибудь, например, датчиками температуры, нужна такая спешка. Ибо остальные процессы слишком медленны (например - преобразование температуры).
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Gudd-Head писал(а):Я думаю, это довольно легко решается
я не сказал, что это неразрешимая задача. просто я не сторонник ставить себе задачи, в решении которых нет никакого смысла. я уверен почти на 100%, что геморрой с разбором будет не быстрее и не меньше по объему, чем циклическое вычитывание 8 раз из датчиков.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Если кому то реально нужно параллельно читать 8 датчиков, могу заморочится... мне нравится решать подобные задачки :)...
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Попробуй :)
Только это, наверное, нужно будет постить в тему по DS-кам...
Ответить

Вернуться в «Разные вопросы по МК»