Страница 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]
Загадка видимо в коде… может кривовато написан? :dont_know:

У меня правда нет меги88, но на меге328 (16 МГц) работает вот как похожая задержка у меня… задействован вывод РВ5.
P1010390.JPG
(38.29 КБ) 59 скачиваний
Если есть на чём проверить мою версию, вот прошивка:
Test.hex
(635 байт) 61 скачивание

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]
Загадка видимо в коде… может кривовато написан? :dont_know:[/uquote]
возможно. Я для этого код и привел. Но, повторюсь, во всех симуляторах все работает как дОлжно. Без вопросов.

Re: delay_ms(1) = 0.5mS

Добавлено: Вт июн 28, 2022 15:53:17
VNS
Так я не понимаю что там написано… :dont_know: потому делаю только предположения… :roll: я даже не понял какая должна быть у тебя последовательность… :)

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 не инициализируется и не используется
Стоп. Кажется сам дурак. Я это смотрю на приемной стороне после компаратора. И не вижу фронтов на входе приемника :oops:
UPD. Тема закрыта.
Ivanoff-iv, большое спасибо за подсказку!