Рекомендую не выставлять делитель для PIO, а менять системную частоту. По умолчанию система работает на 125 МГц, с этой же частотой будет работать и PIO, если ничего не менять. При необходимости RP2040 гонится где-то до 360 МГц, но больше 200 МГц я б не рекомендовал ставить. RP2350 уже получше гонится, мой текущий проект на 600 МГц бегает.
Ваш подсчет не очень корректный, поскольку замеряет длительность клока "в нуле". Из-за согласования уровней и передачи сигнала, может оказаться, что "в нуле" сигнал проводит больше времени, чем "в единице", поэтому надёжнее делать замер между двумя фронтами.
Также замер будет не сильно точный из-за плавающей частоты PIO (125 системных МГц не делится нацело на 100 МГц, которые вы поставили для PIO, если питоновский API вообще задаёт дробную часть делителя, надо уточнить). Рекомендую не задавать конкретную частоту вовсе и исходить из clk_sys при расчетах.
Тем не менее, в цикле у вас две инструкции, при 100 МГц, выполнение каждой из них занимает один такт, но замеряете вы полупериод, поэтому надо 100_000_000 / (4 * ticks) считать. (Насчитывает вдвое меньше 100мгц поскольку две инструкции, и ещё вдвое меньше потому что полупериод)
Ещё из рекомендаций - можно включить autopull / autopush и вместо pull / mov делать out y, 32 и in x, 32. Сейчас вы не столкнулись с ограничением в 32 опкода, но в дальнейшем это может вызвать проблемы
Почему на 8 МГц не хватает - тут не слишком ясно, осциллографом бы посмотреть. Возможно генератор сигнала даёт такой логический уровень, который rp2040 не воспринимает как логическую единицу, должно работать. Но можете попробовать включить на входе pull_up (мне помогало хватать и 1.8в уровни), отключить или добавить логические драйверы (set_drive_strength на 2ma или 12ma), тоже влияет. Ну или добавить перед RPi транслятор логических уровней (рублей 50 на Али восьмиканальный level shifter от texas)