ipf 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Ув. электронщики. в данный момент изучая AVR столкнулся с проблемой, значится так. Если условие выполняется то выполняется код PORTC.0=1; wait1(); PORTC.1=1; wait1(); PORTC.2=1; wait1(); PORTC.3=1; wait1(); PORTC.4=1; wait1(); PORTC.5=1; wait1(); PORTC.6=1; wait1(); PORTC.7=1; wait1(); { Подскажите как можно сократить данный код, смысл в том чтоб все лампы зажигались по очереди, затем гасли, спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба смысл в том чтоб все лампы зажигались по очереди, затем гасли, спасибо uint8_t Tmp = 0; for(;;) { if(Tmp & (1<<7)) Tmp = Tmp << 1; else Tmp = (Tmp << 1) | 1; PORTC = Tmp; delay_1s(); } Но при чем тут С++? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба unsigned char mask; for (mask = 0x01; mask; mask <<= 1) { PORTC=mask; wait1(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ipf 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба извините, зря дописал ++ Теперь ругается missing ( в этой строчке uint8_t Tmp = 0; unsigned char mask; for (mask = 0x01; mask; mask <<= 1) { PORTC=mask; wait1(); } Так то работает но смысл в том чтоб загорелся первый, затем второй но первый продолжал гореть и.т.д . а вконце задержка и в обратном порядке потух первый остальные горят, за ним второй, остальные горят .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Может вам сразу весь курсовик написать? Своими мозгами не пошевелить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Так то работает но смысл в том чтоб загорелся первый, затем второй но первый продолжал гореть и.т.д . а вконце задержка и в обратном порядке потух первый остальные горят, за ним второй, остальные горят .... unsigned char mask; for(;;) // бесконечный цикл { // сначала зажигаем все for (mask = 0x01; mask; mask <<= 1) { PORTC |= mask; wait1(); } // задержка wait1(); wait1(); wait1(); // теперь гасим (в том же направлении) for (mask = 0xF7; mask; mask <<= 1) // этот вариант для противоположного направления // for (mask = 0x7F; mask; mask >>= 1) { PORTC &= mask; wait1(); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ipf 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Может вам сразу весь курсовик написать? Своими мозгами не пошевелить? к сожалению универ уже закончил ) + это не курсовик, на досуге увидел у друга как подсветка на машине поочередно включается, сначала, стрелки, затем в кнопочках свет, затем приборы и решил повторить unsigned char mask; for(;;) // бесконечный цикл { // сначала зажигаем все for (mask = 0x01; mask; mask <<= 1) { PORTC |= mask; wait1(); } // задержка wait1(); wait1(); wait1(); // теперь гасим (в том же направлении) for (mask = 0xF7; mask; mask <<= 1) // этот вариант для противоположного направления // for (mask = 0x7F; mask; mask >>= 1) { PORTC &= mask; wait1(); } } Вам огромное спасибо, теперь есть от чего оттолкнутся в дальнейшем. Спасибо Моделирую в протеусе ) теперь столкнулся с проблемой for (mask = 0xF7; mask; mask <<= 1) светодиоды тухнут не поочередно а как попало, если сделать for (mask = 0xFF; mask; mask <<= 1) то тухнут поочередно но последний остается гореть ) в чем может быть подвох Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Моделирую в протеусе ) теперь столкнулся с проблемой for (mask = 0xF7; mask; mask <<= 1) светодиоды тухнут не поочередно а как попало, если сделать for (mask = 0xFF; mask; mask <<= 1) то тухнут поочередно но последний остается гореть ) в чем может быть подвох Да, поторопился. Вот так правильно: // теперь гасим (в том же направлении) for (mask = 0x01; mask; mask <<= 1) // для противоположного направления: //for (mask = 0x80; mask; mask >>= 1) { PORTC &= ~mask; wait1(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ipf 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Еще раз спасибо, пошел искать книжку ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба А - так? for(uint16_t mask = 0x00ff; mask; mask <<= 1) { PORTC = (uint8_t)(mask>>8); wait1(); } upd. Здесь есть ошибочка, остается единица в старшем бите порта. Тогда так: uint16_t mask = 0x01fe; do { PORTC = (uint8_t)(mask >> 8); wait1(); } while (mask <<= 1); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 34 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба PORTC=1; do wait1() while ((PORTC+=PORTC+1) <= 0xff); :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба Для Xenia Красивенько, только вот так правильнее будет: PORTC = 1; do wait1(); while ((PORTC += PORTC + 1) < 0xff); И это еще полдела. И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :)Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок! PORTC = 0; do // on loop { wait1(); } while ((PORTC = (PORTC<<1)^1) < 0xff); do // off loop { wait1(); } while ((PORTC >>= 1) > 0x00); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба Теперь ругается missing ( в этой строчке uint8_t Tmp = 0;missing что? Вам тяжело скопировать все сообщение целиком а мы тут должны телепатировать - что же там написано после missing? замените uint8_t на unsigned char или впишите в начале файла #include <stdint.h> Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок!Но считывается он дважды, что в общем случае - источник граблей. В конкретно этом случае, когда используется весь порт целиком - да, безопасно. Но чревато предупреждением компилятора о неопределенном порядке доступа к volatile - переменным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба Но считывается он дважды, что в общем случае - источник граблейС этим согласен. Поэтому и привёл свой пример без граблей (в надежде что порт будет не 6-ти битный:)). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться