Обсуждаем контроллеры компании Atmel.
Ответить

delay_ms(1) = 0.5mS UPD: Закрыто.

Вт июн 28, 2022 14:17:11

Всем доброго дня. Столкнулся с совершенно загадочным явлением в железе. На Atmega88 есть кусок кода, который формирует определенную последовательность с определенными временнЫми параметрами. Как видно из кода, минимальной временнОй единицей является 1 милисекунда. И в симуляторе Atmel Studio, и в Proteus нет никаких проблем. Все работает, как и должно. Но в реальном железе происходит следующее. Примерно в половине случаев (а может и больше) вызова функции, формируется последовательность с задержкой в 0,5 mS. Это очевидно видно из осциллограмм. Вопрос: че это за хрень и что с ней делать?
Код:
void send_data(uint8_t comand)
   {   
      cli();
      uint16_t buffer = 0;
         //for (uint8_t m = 0; m <=3; ++m)
         {buffer = (devices << 8)|comand;
            PORTB &= ~(1 << TXD);   // старт передачи две "1"
            _delay_ms(2);            
               for(uint8_t i=0; i<=15; i++)
                  {
                     if (buffer & 0x01) PORTB_XOR(TXD); else;
                     buffer = buffer >> 1;
                     _delay_ms(1);
                  }
            PORTB |= (1 << TXD);
            _delay_ms(2);
         }
      sei();

1 mS
Изображение
0.5 mS
Изображение
Последний раз редактировалось Land Вт июн 28, 2022 22:50:55, всего редактировалось 1 раз.

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 14:42:52

проблема не в делаях, а в выводе (передние фронты то не съехали...)

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 15:21:51

Столкнулся с совершенно загадочным явлением в железе.

Загадка видимо в коде… может кривовато написан? :dont_know:

У меня правда нет меги88, но на меге328 (16 МГц) работает вот как похожая задержка у меня… задействован вывод РВ5.
P1010390.JPG
(38.29 KiB) Скачиваний: 45

Если есть на чём проверить мою версию, вот прошивка:
Test.hex
(635 байт) Скачиваний: 49

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 15:48:17

проблема не в делаях, а в выводе (передние фронты то не съехали...)

допустим. Тогда что может прибавлять по 0,5 мС ? В коде ничего не меняется, устройство не выключается, осциллограммы сделаны с разностью в 2 минуты.

Добавлено after 3 minutes 36 seconds:
Столкнулся с совершенно загадочным явлением в железе.

Загадка видимо в коде… может кривовато написан? :dont_know:

возможно. Я для этого код и привел. Но, повторюсь, во всех симуляторах все работает как дОлжно. Без вопросов.

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 15:53:17

Так я не понимаю что там написано… :dont_know: потому делаю только предположения… :roll: я даже не понял какая должна быть у тебя последовательность… :)

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 19:33:48

можно подробнее, какое действие ожидается от этой строки?
if (buffer & 0x01) PORTB_XOR(TXD); else;
(интересует PORTB_XOR(TXD); ето функция?
и ещё, что отделено оператором else;?

Re: delay_ms(1) = 0.5mS

Вт июн 28, 2022 21:12:07

можно подробнее, какое действие ожидается от этой строки?
if (buffer & 0x01) PORTB_XOR(TXD); else;
(интересует PORTB_XOR(TXD); ето функция?

#define PORTB_XOR(x) (PORTB ^= (1 << x))
и ещё, что отделено оператором else;?

ничего. ; закрывает пустой оператор else. Да, я знаю, что его можно не писать, но мне он не мешает, а для меня делает код более читаемым.
Перепроверил дефайны. #define TXD PB4. Больше к этому пину ничто не обращается. PCINT4 не инициализируется и не используется
Стоп. Кажется сам дурак. Я это смотрю на приемной стороне после компаратора. И не вижу фронтов на входе приемника :oops:
UPD. Тема закрыта.
Ivanoff-iv, большое спасибо за подсказку!
Ответить