На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Ошибка в тексте программы ATtiny2313A , Не пойму где ошибка
      Код написан в AVR Studio 4.
      Тело ветки if (bit_is_set(PIND,PD3)) и if (bit_is_set(PIND,PD2)) не выполняется или работает не корректно. На PD2 или PD3 подаю +5В. Должно на выходах PORTB постепенно на нагах появляться +5В или 0В. Чего не происходит.
      Не пойму в чем дело.
      В режиме эмуляции и отладки все нормально. А на деле после заливки не работает.

      ExpandedWrap disabled
        #include <avr/io.h>
        #define F_CPU 8000000UL
         
        #include <avr/io.h>
        #include <util/delay.h>
         
        short int m[7] = {0x01, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F};
        short int t = 0, ct = 30000, h = 4286; // 7
         
        int main(void) {
          DDRB = 0xFF;
          PORTB = 0x00;
         
          DDRD = 0x00;
          PORTD = 0x00;
          
          while(1)
          {
            if (bit_is_set(PIND,PD1)) { PORTB = 0xFF; t = ct; }
            if (bit_is_set(PIND,PD0)) PORTB = t = 0x00;
            
            if (bit_is_set(PIND,PD2)) { // OPEN
              t = t + 1000;
              t = (t > ct) ? ct : t;
              if (t == ct) PORTB |= 0xFF; else PORTB = PORTB | m[t/h];
         
            }
            if (bit_is_set(PIND,PD3)) { // CLOSE
              t = t - 1000;
              t = (t > 0) ? t : 0;
              if (!t) PORTB &= 0x00; else PORTB = PORTB & m[t/h];
            }
            _delay_ms(1000);
          }
        }
      Сообщение отредактировано: Onishare -
        попробуй в фигурные скобки взять оператор второго if
        {PORTB = t = 0x00;}
          short int на 8битном контролллере какую разрядность имеет? я бы с такими числами не ставил short, всё таки размер слова равен байту вроде


          Цитата Onishare @
          Должно на выходах PORTB постепенно на нагах появляться +5В или 0В. Чего не происходит.

          30 секунд ждешь?

          Цитата Onishare @
          ExpandedWrap disabled
             PORTB = PORTB & m[t/h];

          если хотел сбросить указанные биты, то нужно
          ExpandedWrap disabled
             PORTB = PORTB & ~m[t/h];

          Если я правильно понял

          такой код работает?
          ExpandedWrap disabled
              while(1)
             {
               if (bit_is_set(PIND,PD1)) { PORTB = 0xFF; t = ct; }
                if (bit_is_set(PIND,PD0)) PORTB = t = 0x00;
             
                if (bit_is_set(PIND,PD2)) { // OPEN
                 PORTB = 0xFF;
             
               }
                if (bit_is_set(PIND,PD3)) { // CLOSE
                       PORTB = 0x00;
               }
                _delay_ms(1000);
              }
          Сообщение отредактировано: ElcnU -
            Алгоритм: при нажатие кнопки (на вход PD0 подаем +5В) через каждые 4286мс загораются последующие светодиоды на выходе от PB0, PB1... до PB8
            при нажатие кнопки (на вход PD1 подаем +5В) через каждые 4286мс тухнут последующие светодиоды на выходе от PB8, PB7... до PB0
            Но первые тухнет и последний загорается при начале и конце отсчета.
            Интервал загорания всех светодиодов 30 сек.

            В эмуляции AVR Studio все нормально.
            На деле не работает (не загорается даже один светодиод).

            ExpandedWrap disabled
              #include <avr/io.h>
              #include <util/delay.h>
               
              #define F_CPU 8000000UL
               
              int m[7] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F};
              int t = 0, ct = 30000, h = 4286;
               
              int main(void) {
                PORTD = 0x00;
                DDRD = 0x00;
                PORTB = 0x00;
                DDRB = 0xFF;
               
                while(1) {
                      
                  if (PIND &(1 << PD0)) { // OPEN
                    t = t + 300;
                    if (t >= ct) { t = ct; PORTB = 0xFF; }
                    else PORTB = PORTB | m[t/h];
                  } else
                  if (PIND &(1 << PD1)) { // CLOSE
                    t = t - 300;
                    if (t < 0) t = 0;
                    if (!t) PORTB = 0x00;
                    else PORTB = PORTB & m[t/h];
                  }
                  _delay_ms(300);
                }
              }
            Сообщение отредактировано: Onishare -
              С таким кодом 3 светодиода загораются/тухнут по кнопке?
              ExpandedWrap disabled
                    #include <avr/io.h>
                    #include <util/delay.h>
                    
                    #define F_CPU 8000000UL
                    
                    int m[7] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F};
                    int t = 0, ct = 30000, h = 4286;
                    
                    int main(void) {
                     PORTD = 0x00;
                     DDRD = 0x00;
                     PORTB = 0x00;
                     DDRB = 0xFF;
                    
                     t = 9000;
                     while(1) {
                          
                       if (PIND &(1 << PD0)) { // OPEN
                           PORTB = PORTB | m[t/h];
                        } else
                        if (PIND &(1 << PD1)) { // CLOSE
                           PORTB = PORTB & m[t/h];
                       }
                        _delay_ms(300);
                      }
                    }
              Сообщение отредактировано: ElcnU -
                Onishare, фьюзы прописаны в контроллер верные?
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0242 ]   [ 15 queries used ]   [ Generated: 28.03.24, 20:55 GMT ]