0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
1 | |
Помогите реализовать передачу данных по UART или SPI06.04.2017, 13:58. Показов 3939. Ответов 21
Метки нет (Все метки)
Доброго времени суток, обращаюсь к вам форумчане за помощью. Требуется передать число с переменной с одного мк на другой мк и записать его в переменную 2го мк по SPI или UART (желательно по SPI) число в переменной имеет диапазон от 0 до 99999.Перепробовал уже практически все заготовки и гайды из интернета зачастую мне удавалось достичь лишь вывода данных с 1го мк, но 2й мк во всех случаях отказывался принимать данные, видимо я что-то упустил.Уповаю на вашу помощь. Из проектов с кодом даже не знаю что приложить ибо их около 10 и в каждом дикая неразбериха.
0
|
06.04.2017, 13:58 | |
Ответы с готовыми решениями:
21
SPI, не могу реализовать передачу хотя бы одного бита Как реализовать передачу функции ключа или не передачу ILI9341 SPI DMA, SPI, UART библиотеки ILI9341 SPI DMA, SPI, UART библиотеки |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
06.04.2017, 15:21 | 2 |
И в чем проблема? где не получается? какие МК, какое подключение т.п.
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
06.04.2017, 16:03 | 3 |
Сообщение от myshomy984
Схема в протэусе [406 байт] [3.21 Кб] [3.02 Кб]
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
06.04.2017, 16:58 | 4 |
Т.к. UART ворочает только 8bit, то перед отправкой надо разбить передаваемое число на 3 байта и отправлять этот паровозик, на приемной стороне принять и собрать.
Весь код на несколько строчек 99999 это не int, это уже будет 32 битная переменная. создать массив на четыре однобайтных элемента unsykned char temp[4]; uint32_t value; переменная для передачи value temp[0] = (value>>24)&0xFF; temp[1] = (value>>16)&0xFF; temp[2] = (value>>8)&0xFF; temp[3] = value&0xFF; вот этот массив и передать, на приемной собрать массив в число. Код
#define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #define _9600_kbps 103 #define _19200_kbps 51 #define _38400_kbps 25 #define _76800_kbps 10 #define _250000_kbps 3 unsykned char buf_UART[4]; unsykned char count_buf=0; void UART_init(void) { DDRD|=(1<<1); PORTD|=(1<<1)|(1<<0); UBRRH=0; UBRRL=_38400_kbps; //38400 UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); UCSRB|=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); sei(); } void transmit_UART(unsykned char value) { while((UCSRA&(1<<UDRE))==0); UDR=value; } ISR(USORT_RXC_vect) { buf_UART[count_buf++] = UDR; if (count_buf > 3) { count_buf = 0; } }
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
06.04.2017, 17:09 | 5 |
Сообщение от myshomy984
while(1){ if(UCSRA&(1<<RXC)){ number[i]=RXC; i++; } }
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
06.04.2017, 17:16 | 6 |
нет вот последняя функция прерывания для ловли
Код
ISR(USORT_RXC_vect) { buf_UART[count_buf++] = UDR; if (count_buf > 3) { count_buf = 0; //конец посылки, можно собирать принятое } } Есть прерывание по приему, если посылок нет МК занимается своими делами, что то пришло отвлекся... зачем циклы на ожидания и проверки бестолковые
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
06.04.2017, 17:42 | 7 |
В деле с АВР я новичок поэтому я многого еще не знаю но задачу выполнить нужно.Плюс к этому сижу я уже 7й час за пк и ищу информацию и пытаюсь что то написать, мозги уже кипят.
Код
#define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #define _9600_kbps 103 #define _19200_kbps 51 #define _38400_kbps 25 #define _76800_kbps 10 #define _250000_kbps 3 unsykned char buf_UART[4]; unsykned char count_buf=0; void UART_init(void) { DDRD|=(1<<1); PORTD|=(1<<1)|(1<<0); UBRRH=0; UBRRL=_38400_kbps; //38400 UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); UCSRB|=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); sei(); } void transmit_UART(unsykned char value) { while((UCSRA&(1<<UDRE))==0); UDR=value; } ISR(USORT_RXC_vect) { buf_UART[count_buf++] = UDR; if (count_buf > 3) { count_buf = 0; } } int main (void){ unsykned char temp[4]; uint32_t value; value=84651; int count=0; temp[0] = (value>>24)&0xFF; temp[1] = (value>>16)&0xFF; temp[2] = (value>>8)&0xFF; temp[3] = value&0xFF; UART_init(); while(1){ if(count<4){ transmit_UART(temp[count]); count++; } } } Эту часть я что то вообще не понял.Как ее использовать. Код
ISR(USORT_RXC_vect) { buf_UART[count_buf++] = UDR; if (count_buf > 3) { count_buf = 0; //конец посылки, можно собирать принятое } }
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
06.04.2017, 19:45 | 8 |
отправка:
Код
transmit_UART(число 8бит); часть Код
ISR(USORT_RXC_vect) работает сама по себе, если что приходит по уарту она аппаратно сама вызовется внутри нее счетчик на принятие 4 байта. принятые байты складываются в массив Код
buf_UART[] Код
if (count_buf > 3) { count_buf = 0; //конец посылки, можно собирать принятое //здесь пишем что делать после принятия 4 байт по UART }
0
|
0 / 0 / 0
Регистрация: 27.03.2012
Сообщений: 57
|
|
06.04.2017, 19:55 | 9 |
а как будете синхронизироваться с началом посылки? Вдруг приемник начал принимать с третьего байта?
Может в старшем нибле передавать номер цифры, а в младшем саму цифру от 0 до 9 ?
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
06.04.2017, 20:04 | 10 |
я показал самый простой путь по обмену. а синхронизация и контроль ошибок это уже отдельная тема.
добавить код начала пару байт, код конца, контрольную сумму и т.п.
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 01:19 | 11 |
Есть еще такой вопрос как мне убедиться в том что 2й мк словил нужное число как мне дебагать все это дело(вывести визуально переменную)?
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
07.04.2017, 01:30 | 12 |
как душе угодно, хоть на LCD, хоть на семисегментник диодный, хоть на лампы, хоть терминалом контролировать.
Можно прикрутить еще контрольную сумму и если сумма сошлась моргнуть диодом, и т.п. Код
transmit_UART(253); transmit_UART(254); for(i=0;i<4;i++) { transmit_UART(temp[i]); } transmit_UART(temp[0]^temp[1]^temp[2]^temp[3]): //контрольная сумма, седьмым байтом для контроля //на приемной стороне целосности посылки Код
ISR(USORT_RXC_vect) { buf_UART[count_buf++] = UDR; if((buf_UART[count_buf-1] == 253)&&(buf_UART[count_buf] == 254)) //значит словили начало передачи { count_buf = 0; //обнуляем счетчик flag_nachalo = 1; } if ((count_buf > 4)&&(flag_nachalo == 1)) { count_buf = 0; flag_nachalo = 0; if(buf_UART[5] == buf_UART[0]^buf_UART[1]^buf_UART[2]^buf_UART[3]) { //моргаем диодом сообщая что пакет принят целый и без ошибок } } }
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 14:35 | 13 |
Почему то выходит кривая передача ну или я кривой.Передаю простое число 253, а на терминале вижу или "х" или "Ў" а бывает и вовсе пусто, причем в терминале выставил baud 38400 как и в проекте. Порты подключил след образом RXD>TXD | TXD>RXD.
Настройки мк в протеусе Код
UART_init(); //инициализировал юарт _delay_ms(100); //сделал задержку чтоб режим установился transmit_UART(253); // передаю число
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
07.04.2017, 17:53 | 14 |
в терминале в какой кодеровке прием? явно не в DEC))) ASCII либо?
и fuse под внешний кварц на 16MHz?
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 18:40 | 15 |
Срабатывает прерывание но не выполняется условие
Код
if((buf_UART[count_buf-1] == 253)&&(buf_UART[count_buf] == 254))
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
07.04.2017, 18:52 | 16 |
это условие отлавливания последовательности 253,254 что бы отловить начало передачи
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 18:54 | 17 |
Сообщение от myshomy984
кварца внешнего нет, разве нельзя задать в настройках мк 16Мгц? если я правильно понял то Clock frequency задает частоту мк в протэусе как на скрыне
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 19:14 | 18 |
Сообщение от myshomy984
само прерывание срабатывает, проверку выполнил втыканием команды на включение диода в разные части условий в прерывании.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 155
|
|
07.04.2017, 19:26 | 19 |
Протеус не знаю, я в железе только
0
|
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 43
|
|
07.04.2017, 20:05 | 20 |
А с spi можете помочь?
Как реализуется инициализация для mostir, slave? Как отправить число, как словить число?
0
|
07.04.2017, 20:05 | |
07.04.2017, 20:05 | |
Помогаю со студенческими работами здесь
20
Реализовать передачу данных Реализовать передачу - прием информации. С одного ПК на другой, реализовать нужна с помощью (winapi с++). Нужна информация или книги Не получается реализовать передачу данных в БД со страницы Как реализовать передачу данных между БД? Реализовать прием/передачу данных по последовательному COM порту Как реализовать передачу данных между аккаунтами? Как реализовать передачу данных между клиентом и сервером Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества
Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
|
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов.
. . .
|
С чего начать программировать микроконтроллеры
raxper 06.01.2025
Введение в мир микроконтроллеров
Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
|
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
|
Обновление сайта www.historian.by
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
|
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
|
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list):
s=^y]
p=x and y
for i in range(1,len(x)):
s. append((x^y)^p)
p=(x and y)or(p and (x or y))
return s
x=list()
y=list()
|
Это мы не проходили, это нам не задавали...(асихронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
|
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
|