Страница 1 из 1
delay_ms(1) = 0.5mS UPD: Закрыто.
Добавлено: Вт июн 28, 2022 14:17:11
Land
Всем доброго дня. Столкнулся с совершенно загадочным явлением в железе. На 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

Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 14:42:52
Ivanoff-iv
проблема не в делаях, а в выводе (передние фронты то не съехали...)
Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 15:21:51
VNS
[uquote="Land",url="/forum/viewtopic.php?p=4252007#p4252007"]Столкнулся с совершенно загадочным явлением в железе.[/uquote]
Загадка видимо в коде… может кривовато написан?
У меня правда нет меги88, но на меге328 (16 МГц) работает вот как похожая задержка у меня… задействован вывод РВ5.
Если есть на чём проверить мою версию, вот прошивка:
Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 15:48:17
Land
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4252017#p4252017"]проблема не в делаях, а в выводе (передние фронты то не съехали...)[/uquote]
допустим. Тогда что может прибавлять по 0,5 мС ? В коде ничего не меняется, устройство не выключается, осциллограммы сделаны с разностью в 2 минуты.
Добавлено after 3 minutes 36 seconds:
[uquote="VNS",url="/forum/viewtopic.php?p=4252029#p4252029"][uquote="Land",url="/forum/viewtopic.php?p=4252007#p4252007"]Столкнулся с совершенно загадочным явлением в железе.[/uquote]
Загадка видимо в коде… может кривовато написан?

[/uquote]
возможно. Я для этого код и привел. Но, повторюсь, во всех симуляторах все работает как дОлжно. Без вопросов.
Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 15:53:17
VNS
Так я не понимаю что там написано…

потому делаю только предположения…

я даже не понял какая должна быть у тебя последовательность…

Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 19:33:48
Ivanoff-iv
можно подробнее, какое действие ожидается от этой строки?
if (buffer & 0x01) PORTB_XOR(TXD); else;
(интересует PORTB_XOR(TXD); ето функция?
и ещё, что отделено оператором else;?
Re: delay_ms(1) = 0.5mS
Добавлено: Вт июн 28, 2022 21:12:07
Land
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4252153#p4252153"]можно подробнее, какое действие ожидается от этой строки?
if (buffer & 0x01) PORTB_XOR(TXD); else;
(интересует PORTB_XOR(TXD); ето функция?[/uquote]
#define PORTB_XOR(x) (PORTB ^= (1 << x))
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4252153#p4252153"]и ещё, что отделено оператором else;?[/uquote]
ничего. ; закрывает пустой оператор else. Да, я знаю, что его можно не писать, но мне он не мешает, а для меня делает код более читаемым.
Перепроверил дефайны. #define TXD PB4. Больше к этому пину ничто не обращается. PCINT4 не инициализируется и не используется
Стоп. Кажется сам дурак. Я это смотрю на приемной стороне после компаратора. И не вижу фронтов на входе приемника

UPD. Тема закрыта.
Ivanoff-iv, большое спасибо за подсказку!