Jump to content

    

Как сократить код на C++

Ув. электронщики. в данный момент изучая 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();

{

 

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

Share this post


Link to post
Share on other sites
смысл в том чтоб все лампы зажигались по очереди, затем гасли, спасибо

 

uint8_t Tmp = 0;
for(;;)
{
   if(Tmp & (1<<7))
       Tmp = Tmp << 1;
   else
       Tmp = (Tmp << 1) | 1;
   PORTC = Tmp;
   delay_1s();
}

 

Но при чем тут С++?

 

Share this post


Link to post
Share on other sites

unsigned char mask;
for (mask = 0x01; mask; mask <<= 1)
{
    PORTC=mask;
    wait1();
}

 

Share this post


Link to post
Share on other sites

извините, зря дописал ++

 

Теперь ругается missing ( в этой строчке uint8_t Tmp = 0;

 

 

unsigned char mask;
for (mask = 0x01; mask; mask <<= 1)
{
    PORTC=mask;
    wait1();
}

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

Share this post


Link to post
Share on other sites

Может вам сразу весь курсовик написать? Своими мозгами не пошевелить?

Share this post


Link to post
Share on other sites
Так то работает но смысл в том чтоб загорелся первый, затем второй но первый продолжал гореть и.т.д . а вконце задержка и в обратном порядке потух первый остальные горят, за ним второй, остальные горят ....

 

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();
    }
}

 

Share this post


Link to post
Share on other sites
Может вам сразу весь курсовик написать? Своими мозгами не пошевелить?

к сожалению универ уже закончил ) + это не курсовик, на досуге увидел у друга как подсветка на машине поочередно включается, сначала, стрелки, затем в кнопочках свет, затем приборы и решил повторить

 

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) то тухнут поочередно но последний остается гореть ) в чем может быть подвох

Share this post


Link to post
Share on other sites
Моделирую в протеусе ) теперь столкнулся с проблемой 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();
    }

Share this post


Link to post
Share on other sites

Еще раз спасибо, пошел искать книжку )

Share this post


Link to post
Share on other sites

А - так?

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);

Share this post


Link to post
Share on other sites

Для Xenia

Красивенько, только вот так правильнее будет:

PORTC = 1; do wait1(); while ((PORTC += PORTC + 1) < 0xff);

И это еще полдела.

И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :)

 

 

Share this post


Link to post
Share on other sites
И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :)
Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок!

 

PORTC = 0;
do // on loop
{
    wait1();
}
while ((PORTC = (PORTC<<1)^1) < 0xff);

do // off loop
{
    wait1();
} while ((PORTC >>= 1) > 0x00);

Share this post


Link to post
Share on other sites
Теперь ругается missing ( в этой строчке uint8_t Tmp = 0;
missing что? Вам тяжело скопировать все сообщение целиком а мы тут должны телепатировать - что же там написано после missing?

замените uint8_t на unsigned char или впишите в начале файла

#include <stdint.h>

 

 

Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок!
Но считывается он дважды, что в общем случае - источник граблей. В конкретно этом случае, когда используется весь порт целиком - да, безопасно. Но чревато предупреждением компилятора о неопределенном порядке доступа к volatile - переменным.

Share this post


Link to post
Share on other sites
Но считывается он дважды, что в общем случае - источник граблей
С этим согласен. Поэтому и привёл свой пример без граблей (в надежде что порт будет не 6-ти битный:)).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this