Цитата Сообщение от esl Посмотреть сообщение
зачем 8, дочтаточно 1го

проверка ведь на равенство/неравенство, т.е. нас интересует что он изменился
а конкретно какие биты за что отвечают - не важно
остальные то точно не изменятся (их некому менять)
Так это...

Во-первых (на правах зануды, ты уж извини) portb вообще не поменяется никогда, пока сам его не запишешь. Если пин настроен на ввод (DDRB=0), то он определяет только состояние резистора подтяжки. Данные читают из PINB. Но это так, к слову.

А по существу вот что. У тебя dataptr - указатель в массиве передаваемых данных. Он пробегает все значения от 00 до FF. PINB - у него подключен только младший пин. Он принимает занчения 0 или 1. Поэтому, например, при dataptr=5, условие dataptr==pinb НИКОГДА не выполнится. Ни разу. Ибо dataptr будет равен 5, а pinb при этом = 1. Твоя программа просто вытолкнет на максимально возможной скорости все 256 байтов в порт А, пролетая уловие dataptr==pinb за один машинный цикл. Без всякой синхронизации с корветом.

Правильным будет такой вариант - while (pinb == (dataptr&1)); Вот так оно действительно будет работать. При этом мы просто от обработки адреса по прерыванию перешли на обработку по программному опросу. Ну, это нам сэкономит несколько тактов AVR, ибо вход в прерывание происходит достаточно медленно. Однако мы тут вроде посчитали, что у нас времени на выставление данных заложено с запасом. Так что, я думаю, можно делать хоть по прерыванию, хоть по опросу. Как легче писать.

Или я не прав и просто неправильно понял твою идею? Поправь, если ошибаюсь...