Зарегистрирован: Пн сен 29, 2008 21:47:32 Сообщений: 34
Рейтинг сообщения:0
Привет,
Приходится часто иметь дело со связкой TFDU4101+ТOIM4232 (кто не в курсе, это ИК UART приёмо-передатчик и формирователь импульсов) Перед установкой в устройство желательно удостоверится, что модуль работает. Так как приемопередатчик может ловить свой собственный отраженный сигнал, то алгоритм проверки очень простой - посылаем информацию с атмеги на ТOIM4232 Тх и представляем принятый сигнал простым миганием светодиода. Логически реализуемо, чтобы UART атмеги обрабатывал свои-же закольцованные данные с Тх на Rх? Как можно доработать на сигнализацию приёма светодиодом код, который раз в некоторый интервал времени посылает на UART"Hello World"?
char String[]="Hello world!!"; //String[] is in fact an array but when we put the text between the " " symbols the compiler threats it as a String and automatically puts the null termination character in the end of the text
int main(void){ USART_init(); //Call the USART initialization code
while(1){ //Infinite loop USART_putstring(String); //Pass the string to the USART_putstring function and sends it over the serial _delay_ms(5000); //Delay for 5 seconds so it will re-send the string every 5 seconds }
делаете обработчик прерывания по приему байта USART, в этом обработчике складываете полученные байты в массив. когда отработает ваша функция USART_putstring(String), в этом массиве должна собраться копия строки - производите сравнение этой строки с содержимым массива и мигаете светодиодом, если совпали. само собой, перед очередной передачей-приемом надо проинициализировать массив и вспомогательные переменные.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Пн сен 29, 2008 21:47:32 Сообщений: 34
Рейтинг сообщения:0
ARV писал(а):
делаете обработчик прерывания по приему байта USART, в этом обработчике складываете полученные байты в массив. когда отработает ваша функция USART_putstring(String), в этом массиве должна собраться копия строки - производите сравнение этой строки с содержимым массива и мигаете светодиодом, если совпали. само собой, перед очередной передачей-приемом надо проинициализировать массив и вспомогательные переменные.
Прерывание должно быть как RXCIE: UART Receive Complete Interrupt Enable ?
ISR(USART_RXC_vect) { // Get data from the USART in register data_in [data_count] = UDR;
// End of line! if (data_in[data_count] == '\n') { // Reset to 0, ready to go again data_count = 0; } else { data_count++; } }
char String[]="Hello"; //String[] is in fact an array but when we put the text between the " " symbols the compiler threats it as a String and automatically puts the null termination character in the end of the text
int main(void){ DDRB = 0xFF; PORTB = 0x00; USART_init(); //Call the USART initialization code sei();
while(1){ //Infinite loop USART_putstring(String);//Pass the string to the USART_putstring function and sends it over the serial
if (strcmp(data_in, "Hello") == 0) { PORTB |= (1 << PB0); } else { PORTB &= ~(1 << PB0); } _delay_ms(1000); //Delay for 1 seconds so it will re-send the string every 1 seconds }
мне показалось, у вас есть ошибки. возможно, показалось... 1. вы отправляете строку "Hello", а в прерывании проверяете принятый символ на равенство '\n' - в посылаемой строке такого символа нет, и ваш алгоритм не сработает. 2. strcmp может сравнивать строки с нулем на конце, а функция передачи не передает терминальный ноль. да и в прерывании ноль в массив не попадет ни при каких условиях. соответственно, strcmp с большой вероятностью будет всегда сообщать, что строки не равны (если вообще будет что-то сообщать, а не вешать всю программу)
смотрите, что могу предложить вам я
Код:
volatile uint8_t is_ok; volatile uint8_t ch;
ISR(USART_RXC_vect){ is_ok = (UDR == ch); }
int main(void){ // инициализация периферии не показана
for(ch=0; ; ch++){ UDR = ch; _delay_ms(1); // тут задержка должна быть соответствующая скорости USART - больше, чем надо для передачи байта if(is_ok){ // отображаем успешную приемопередачу } else { // отображаем ошибку приемопередачи } _delay_ms(50); } }
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Пн сен 29, 2008 21:47:32 Сообщений: 34
Рейтинг сообщения:0
Спасибо за подсказки! К сожалению я совсем далек от программирования на Си Здесь задержка для того, чтобы успеть сравнить, то что приняли с UDR на передачу, перед тем как он опустеет ?
задержка нужна, чтобы USART смог передать байт. так как UDR по факту представляет из себя 2 независимых регистра (один на запись для передачи, другой для чтения на приеме), то после того, как UDR "опустеет" при передаче, он немедленно в то же мгновение "наполнится" принятым байтом.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
char String[]="Hello"; //String[] is in fact an array but when we put the text between the " " symbols the compiler threats it as a String and automatically puts the null termination character in the end of the text
int main(void){ DDRB = 0xFF; PORTB = 0x00; USART_init(); //Call the USART initialization code sei();
while(1){ //Infinite loop USART_putstring(String); //Pass the string to the USART_putstring function and sends it over the serial
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 69
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения