Мой полный код находится здесь .
По сути, я передаю на Arduino и не получаю правильное значение (вы заметите, что я пытаюсь отправить d'22'). Вот метод, в котором я на самом деле отключил передачу:
// Method for transmitting value using serial bit banging
void uart_tx_bit_bang(unsigned char val) {
unsigned char i;
Tx_Pin = 0; // Start bit
uart_time_delay();
for ( i = 8 ; i != 0 ; --i ) {
if (val & 0x01) Tx_Pin = 1; // Begin with LSB
else Tx_Pin = 0;
val >>= 1;
uart_time_delay();
}
Tx_Pin = 1; // Stop bit
uart_time_delay();
}
Поскольку задержка должна быть 1/бод, uart_time_delay()
задержка должна быть 104 мкс. Я использую __delay_us(104)
из библиотек PIC. Любая помощь в этом очень ценится.
Я уверен, что использую правильную скорость передачи данных на обоих концах.
Хотя ваш расчет 104 мкс верен для 9600 бит/с, ваш цикл и различные операции, которые он выполняет, добавят дополнительную задержку. Есть несколько способов настроить время:
Вычтите константу из вашей задержки в США, пока она не начнет работать. Вероятно, было бы лучше определить минимальное/максимальное число, с которым он работает, и выбрать среднее значение.
Сделайте что-то подобное, используя прицел, чтобы проверить окончательное время, если он у вас есть.
Посмотрите на ассемблерный вывод компилятора и определите, сколько циклов занимает цикл.
Я также вижу, что вы используете радиоуправляемые часы. Обычно я предпочитаю поддерживать последовательную синхронизацию в пределах 2% для надежной работы, поэтому также проверяйте, чтобы деталь обладала такой же стабильностью при использовании часов RC для надежной работы.
uart_time_delay()
рутина вообще задерживается. Я использую встроенный __delay_us()
метод. Есть мысли по этому поводу? Как я могу сделать более надежную задержку в C? Мне нужно, чтобы это было 1/бод
Питер Джей
пометки
Горлот
Виллем Эллис
Питер Джей
Виллем Эллис
ангелбольшой
ангелбольшой
Виллем Эллис
ангелбольшой
Виллем Эллис
Tx_Pin
PIC, подключенный к Rx на Arduino.пометки
ангелбольшой