Линии пульсируют недостаточно быстро (?))
Должен ли этот код подавать импульсы на контакты PB3 и PB4 (MOSI и MISO Arduino Uno) с интервалом 2 мс?
#include <avr/io.h>
int main(void)
{
// for (byte i = 0; i < 32; i++)
// pinMode(i, INPUT);
DDRB |= (1 << PB4);
DDRB |= (1 << PB3);
// pinMode(PB4, OUTPUT);
while (1)
{
PORTB &= ~(1 << PB4);
PORTB &= ~(1 << PB3);
// digitalWrite(PB4, LOW);
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// __asm__ __volatile__("nop");
// delayMicroseconds(10000);
delay(1);
PORTB |= (1 << PB4);
PORTB |= (1 << PB3);
// digitalWrite(PB4, LOW);
// delayMicroseconds(10000);
delay(1);
}
}
Если используется для SPI, MOSI вполне может работать на частоте 1 МГц — так говорит мой логический анализатор. MISO не будет работать при использовании SPI. MISO работает и в другом сценарии, отличном от SPI: я могу использовать Arduino для внутрисистемного программирования других плат AVR.
Но приведенный выше код не передает импульсы ни MISO, ни MOSI, как указано тем же логическим анализатором в той же настройке. Должно ли это быть?
обновление
Произошла проблема с доской. Изменил его, и теперь все работает нормально, независимо от использования только int main()
или вызова init()
в соответствии с ответом @Majенко
@kellogs, 👍0
Обсуждение1 ответ
Код content отлично работает, когда он скомпилирован как программа Arduino, то есть с использованием правильной структуры setup()
и loop()
. :
void setup() {
DDRB |= (1 << PB4);
DDRB |= (1 << PB3);
while (1) {
PORTB &= ~(1 << PB4);
PORTB &= ~(1 << PB3);
delay(1);
PORTB |= (1 << PB4);
PORTB |= (1 << PB3);
delay(1);
}
}
void loop() {
}
Однако тот же код не будет работать при использовании его в main()
. Это просто потому, что delay()
никогда не будет работать. Обычно main()
вызывает init()
, который затем настраивает TIMER0 для генерации millis()
и micros()
счетчик, используемый для функций delay()
.
Поэтому либо используйте setup()
и loop()
вместо main()
, либо вызовите в своей программе init( )
прежде всего:
int main() {
init();
DDRB |= (1 << PB4);
DDRB |= (1 << PB3);
while (1) {
PORTB &= ~(1 << PB4);
PORTB &= ~(1 << PB3);
delay(1);
PORTB |= (1 << PB4);
PORTB |= (1 << PB3);
delay(1);
}
return 0;
}
Имеет смысл. Но это не имело значения. Пробовал и вызов init()
, и переключение на setup()
. В качестве примечания: когда я уменьшаю задержки, до десятков/сотен микросекунд, в линии MISO начинают появляться сбои. Переход к еще меньшим задержкам приводит к появлению некоторых (меньших) сбоев в MOSI., @kellogs
Тогда ваша плата, вероятно, сломана или что-то в этом роде, потому что этот код *действительно* работает. Я проверил это. Это сработало., @Majenko
Да что-то подобное. Интересно, почему линии работают нормально, когда они используются в качестве интернет-провайдера на скорости 19200 бод, но не при импульсной передаче с такой же скоростью вручную. Я отправляюсь на новые расследования., @kellogs
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- При использовании ардуино в качестве ISP конденсатор требуется или нет?
- Штекерные контакты на Arduino Uno
- Последовательная связь между несколькими устройствами (или ардуино)
Код выглядит нормально. Вы уверены, что порты чем-то не закорочены и не загнаны откуда-то извне?, @smajli
@smajli, наверное, так и было. Не стесняйтесь превратить комментарий в ответ, @kellogs