-
Notifications
You must be signed in to change notification settings - Fork 7
Description
Так, это у меня тинька26 щучья, или это ядро так себя странно ведёт?
Банальнейший код:
void setup() {
pinMode(PA0, OUTPUT);
pinMode(PB6, INPUT_PULLUP);
}
void loop() {
digitalWrite(PA0, digitalRead(PB6));
}
Результат - постоянная единичка, либо постоянный 0 на PA0 без зависимости от состояния входа.
В целом - то же самое можно сделать и через PORTA/PORTB |=, битвайзы и т.п.
Особые спецэффекты были, когда пробовал залить нечто подобное, но тут я сам мог накосячить, конечно:
конфигурим прерывание и выходы в сетапе:
DDRA = 0xFF; // Порт А - все выходы.
DDRB &= ~(1 << 6); // Порт Б - конфигурим как вход пин 6.
GIMSK |= (1 << PCIE1); // Настраиваем канал Pin Change 1
GIFR &= ~(1 << PCIF); // Снимаем флаг прерывания
sei(); // Разрешаем прерывания
Код прерывания:
ISR(IO_PINS_vect) {
if (PINB & (1 << 6)) { // Проверяем источник прерывания. Пинаем его только если у нас источник - пин PB6.
digitalWrite(PA0, digitalRead(PB6));
}
}
И в итоге, это работает, но как-то невероятно медленно - и с 16МГц PLL, и с внешним камушком на 8.
Подаю импульсы с периодом в 1...10 миллисекунд на PB6 - на PA0 по идее должна быть та же картина, но тиня часть импульсов просто теряет и не видит часть фронтов/спадов. Ощущение такое, что возврат из прерывания занимает какое-то совсем уж конское время...
Всяческая банальщина типа блинка при этом работает. Но если писать прям сразу, условно гворя, 0x00 и 0xFF попеременно в порт а - начинаются некоторые галюны - на всём порту А на выходах появляется меандр частотой чуть больше 100 килогерц.
А если убрать запись в PA3 - то всё норм.
И было бы странно, если бы это было у всех, и ни кто бы так и не пожаловался. Так что, подозреваю, что мои китайские тиньки такие странные. Они ещё и прошиваются только медленным аспом.
Может, была у кого такая дичуга?