KOCTR 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба Здравствуйте. Помомгите пож. разобраться со следующим кодом. Написал программу(на си, cvavr) и она компилируется, но вот незадача, в реальном мк(Attiny2313) работать она не хочет, а все потому что я не понимаю какой тип переменной присвоить, при объявлении подпрограммы(функции). Вот конкретный пример: #define b4 PORTB.4 #define b7 PORTB.7 ... void zamer(char x, char y) { x=1; y=1; ... x=0; y=0; ... } void main(void) { ... zamer(b4,b7); ... } Как я понял, при выполнении подпрограммы создаются совершенно независимые переменные никак не связанные с моими пинами. Подпрограмма выполняется и этим переменным присваиваются значения 1, но на выходе реального пина ничего не происходит. В подпрограмме zamer имеются промежуточные глобальные переменные которые меняют свое значение по результату работы пинов которые хочу включать и выключать таким образом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба Перенос в подпрограмму, в качестве параметра, имя конткретного пина И подпрограмма к нему по имени будет обращаться? Как я понял, при выполнении подпрограммы создаются совершенно независимые переменные никак не связанные с моими пинами. Подпрограмма выполняется и этим переменным присваиваются значения 1, но на выходе реального пина ничего не происходит. Примерно так. В функцию можно передать адрес порта (если нужна работа с несколькими портами) и номер вывода (или маску по которой можно устанавливать нужное состояние на выходе). void SetPort(unsigned char volatile *port, unsigned char pin) { *port|=(1<<pin); } void main() { while (1) { SetPort(&PORTB, 1); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 1 августа, 2012 Опубликовано 1 августа, 2012 · Жалоба PORTB.4Это расширение вашего С компилятора. Причем это расширение есть 'вещь в себе' - это вроде бы переменная, в нее можно писать и использовать в выражениях. Но в отличии от переменной она не имеет адреса (да и вообще никакого легального в рамках С объекта) и передать ее по этому самому адресу в функцию соотвественно не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 1 августа, 2012 Опубликовано 1 августа, 2012 · Жалоба Самое простое - ввести понятие логического канала и отделить промежуточной функцией этот логический канал от физических пинов. Как-то так: void Channel_Set (char ch) { switch (ch) { 1: PORTB.4 = 1; break; 2: PORTB.7 = 1; break; 3: PORTC.1 = 1; break; } } void Channel_Clr (char ch) { // тут аналогично } Тогда в эту вашу zamer() надо передавать не номер пина, а номер канала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 1 августа, 2012 Опубликовано 1 августа, 2012 · Жалоба ...ввести понятие логического канала...надо передавать не номер пина, а номер канала. лучше оперировать тогда сущностью логического канала, и его же передавать в функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться