KOCTR Опубликовано 31 июля, 2012 Поделиться Опубликовано 31 июля, 2012 (изменено) Здравствуйте. Помомгите пож. разобраться со следующим кодом. Написал программу(на си, cvavr) и она компилируется, но вот незадача, в реальном мк(Attiny2313) работать она не хочет, а все потому что я не понимаю какой тип переменной присвоить, при объявлении подпрограммы(функции). Вот конкретный пример. #define b4 PORTB.4 #define b7 PORTB.7 ... void zamer(char x, char y) { x=1; y=1; ... } void main(void) { ... zamer(b4,b7); ... } Как я понял, при выполнении подпрограммы создаются совершенно независимые переменные никак не связанные с моими пинами. Подпрограмма выполняется и этим переменным присваиваются значения 1, но на выходе реального пина ничего не происходит. Изменено 31 июля, 2012 пользователем KOCTR 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
hd44780 Опубликовано 31 июля, 2012 Поделиться Опубликовано 31 июля, 2012 Для начала - что в DDRB.4 и DDB.7? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
COKPOWEHEU Опубликовано 31 июля, 2012 Поделиться Опубликовано 31 июля, 2012 void zamer(char x, char y){ x=1; y=1; Что это? Зачем передавать что-то в процедуру если тут же меняете, к тому же вне функции это не сохранится. Попробуйте реализовать в стандартах Си а не Cvavr, посмотрите что такое на самом деле PORTB (это константа). 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
KOCTR Опубликовано 31 июля, 2012 Автор Поделиться Опубликовано 31 июля, 2012 (изменено) @hd44780 Для начала - что в DDRB.4 и DDB.7? А какая разница на выход они работают или на вход? ddrb.4 и ddrb.7 - по 1е, работают как выхода на оптопару с внешним резистором, если вам интересно. COKPOWEHEU Что это? Зачем передавать что-то в процедуру если тут же меняете, к тому же вне функции это не сохранится. Попробуйте реализовать в стандартах Си а не Cvavr, посмотрите что такое на самом деле PORTB (это константа). Я Вас правильно понимаю - что реализовать то что я задумал не получиться принципиально(?). Мне нужна именно функция, потому что по ее результатам промежуточные переменные(другие переменные ) меняют свое значения, более того в этой функции немного погодя пины возвращаются в исходное состояние. А нужно мне это потому что в течении программы подпрограмма замер вызывается 9 раз с различными пИнами. Я программирую 5й раз в жизни поэтому реализовать что либо на си это пока что сложно, нужно хотябы понять что вообще я сейчас делаю не так . Изменено 31 июля, 2012 пользователем KOCTR 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Alex Опубликовано 31 июля, 2012 Поделиться Опубликовано 31 июля, 2012 Вы передаёте в функцию значения пинов, которые присваиваются другим переменным. С какой стати, при изменении совершенно других переменных, будут меняться значения портов ? С чего Вы это взяли ? x и y - это локальные переменные функции, с другими адресами в области ОЗУ. Если бы Вы хотели поменять переменные, можно было бы передавать указатели на них, но с битами такое не прокатит. Можно передавать адрес регистра и номер изменяемого бита, а в ф-ии его менять. Лучше создать макрос, ИМХО. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Reptile Опубликовано 1 августа, 2012 Поделиться Опубликовано 1 августа, 2012 (изменено) А нельзя ли просто в конце выполнения процедуры присвоить новые значения пинам? { x=1; y=1; ... PORTB=(x<<4) | (x<<7); } И вообще почему переменные имеют тип char. Разве можно "символ" присвоить пину? На пине может быть тока 1 или 0 и тип должен быть числовой. Извеняюсь если что, просто я тож начинающий и интересен этот вопрос. Изменено 1 августа, 2012 пользователем Reptile 0 Ватт, Ватт, Киловатт... Ссылка на комментарий Поделиться на другие сайты Поделиться
Reptile Опубликовано 1 августа, 2012 Поделиться Опубликовано 1 августа, 2012 (изменено) Вообщем это "zamer(b4,b7);" работать не будет. Чтобы передать значения пинов в процедуру, можно использовать дополнительные переменные: #include <avr/io.h> //#define ba PORTB.4 //#define bb PORTB.7 void zamer(char x,char y) { //что-то делаем x=1; y=1; PORTB=(x<<4) | (x<<7);//записываем в порт новые значения } int main(void) { unsigned char a,b; a=b=0; PORTB=(a<<4 | b<<7); //записываем в переменные a и b текущее состояние пинов zamer(a, ;//вызываем процедуру return 1; } Может я не совсем понял, что требуется и моя прога кривая, но так работает. ЗЫ: Char кстати работает, если записывать только 0 или 1, а с другими значениями и символами получается ошибка: изменяются значения других разрядов регистра. ЗЫ2: Правда это в avrstudio написано, но в cvavr вроде тож должно работать. Изменено 1 августа, 2012 пользователем Reptile 0 Ватт, Ватт, Киловатт... Ссылка на комментарий Поделиться на другие сайты Поделиться
Rhime Опубликовано 1 августа, 2012 Поделиться Опубликовано 1 августа, 2012 #define b4 PORTB.4 #define b7 PORTB.7 ... void zamer(bool x, bool y) { b4=x; b7=y; ... } void main(void) { DDRB=0x84; ... zamer(0,1); ... } 0 - А совесть в курсе? - А совесть в доле! :-D Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле. Все грамматические ошибки являются авторским стилем изложения материала. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 1 августа, 2012 Поделиться Опубликовано 1 августа, 2012 #define PIN_1 PORTB.4 #define PIN_2 PORTB.7 #define ZAMER(x, y) do{PIN_1=x; PIN_2=y;}while(0) void main(void) { ... ZAMER(0,1); ... } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
KOCTR Опубликовано 1 августа, 2012 Автор Поделиться Опубликовано 1 августа, 2012 (изменено) я дико извиняюсь, это моя шибка! блин я почему то думал что меня все поймут, оказалось что все не так просто. вот что нужно! #define b2 PORTB.2 #define b3 PORTB.3 #define b4 PORTB.4 #define b5 PORTB.5 #define b6 PORTB.6 #define b7 PORTB.7 ... void zamer(char x, char y) { x=1; y=1; ... x=0; y=0; } void main(void) { ... zamer(b4,b7); zamer(b2,b7); zamer(b3,b7); zamer(b4,b6); zamer(b2,b6); zamer(b3,b6); zamer(b4,b5); zamer(b2,b5); zamer(b3,b5); ... } Подпрограмма вызывается несколько раз с различными пИнами! В подрограмме помимо включения лог1 на этих выходах идет опрос входов, и соответственно в переменные оседает результат работы, просто линейная программа занимает 96% флэша аттиньки. Значения выхода меняется тольок на время необходимое опросить вход, что бы поймать нужный мне импульс, затем значение выходов возвращается обратно в 0, а в результате(поймал я импульст или нет) глобальные переменные принимают какие-либо значения, в подпрограмме надо лишь включить пин и выключить, так наверное будет яснее. Все правльно мне нужен именно макрос, но макрос необходимо будет вызвать из подпрограммы, просто я сам не знал что мне нужно, поэтому и обратился к Вам за помощью. Изменено 1 августа, 2012 пользователем KOCTR 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Rhime Опубликовано 1 августа, 2012 Поделиться Опубликовано 1 августа, 2012 #define PINSETUP(PIN1,STATUS1,PIN2,STATUS2) PIN1=STATUS1,PIN2=STATUS2 ... #define b4 PORTB.4 #define b7 PORTB.7 ... void zamer(char x, char y) { PINSETUP(x,1,y,1); ... PINSETUP(x,0,y,0); }; main() { ... zamer(b4,b7); ... } 0 - А совесть в курсе? - А совесть в доле! :-D Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле. Все грамматические ошибки являются авторским стилем изложения материала. Ссылка на комментарий Поделиться на другие сайты Поделиться
KOCTR Опубликовано 1 августа, 2012 Автор Поделиться Опубликовано 1 августа, 2012 На другом форуме мне дали такой ответ: PORTB.4 Это расширение вашего С компилятора. Причем это расширение есть 'вещь в себе' - это вроде бы переменная, в нее можно писать и использовать в выражениях. Но в отличии от переменной она не имеет адреса (да и вообще никакого легального в рамках С объекта) и передать ее по этому самому адресу в функцию соотвественно не получится. Rhime большое спасибо за помощь, твой последний вариант тоже не работает. Буду пробовать через адрес работать, все же физ. адрес порт имеет и на него я думаю можно как то сослаться, по крайней мере мне стало яснее в каком направлении двигаться. Всем тоже спасибо, что разгадывали мой ребус в предь буду внимательнее задавать вопросы. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.