Нужен приёмо\передатчик на UART интерфейс.
- Сообщения: 20
- Зарегистрирован: Вс янв 17, 2010 15:02:01
Доброго времени суток! Делаю умный дом, есть необходимость обмениваться данными между двумя устройствами по беспроводной связи. Сначала хотел использовать отдельный приёмник и передатчик, но для этого нужно много места в устройстве, что недопустимо. Узнал о таких микросхемах, как MRF49XA-I/ST, CC1101RTKR, CC1121RHMT, но все они работают на SPI интерфейсе, а с ним я не знаком, мне ближе UART/USART. Вот чего хочу спросить: Существуют ли подобные трансиверы, с подобными характеристиками, но на UART/USART интерфейс? Или может есть преобразователи UART-SPI?
- Реклама
А что там сложного-то? Он проще уарта на порядок.но все они работают на SPI интерфейсе, а с ним я не знаком
- Сообщения: 20
- Зарегистрирован: Вс янв 17, 2010 15:02:01
Я через CodeVisionAvr пишу, он всю сложность USAR'а к минимуму сбавляет, а у SPI столько параметров, что понять я их не могу, да и программу я уже под USART написал.
По этому же протоколу работают и сдвиговые регистры типа 74HC595. Протокол прост и разжеван 100 000 раз. (По собственному опыту знаю, как бесят такие фразы.)

Вот наиболее доходчивое описание протокола SPI
http://kit-e.ru/articles/interface/2009_03_53.php
Для более простого понимания (потом все равно читать то, что в 1-й ссылке):
http://avrproject.ru/publ/kak_podkljuch ... 5/2-1-0-44

Вот наиболее доходчивое описание протокола SPI
http://kit-e.ru/articles/interface/2009_03_53.php
Для более простого понимания (потом все равно читать то, что в 1-й ссылке):
http://avrproject.ru/publ/kak_podkljuch ... 5/2-1-0-44
Выпрямите спину и уберите левую руку от лица.
Мой Youtube канал
Мой Youtube канал
- Сообщения: 20
- Зарегистрирован: Вс янв 17, 2010 15:02:01
С сдвиговыми триггерами уже работал, проблем с отправкой у меня нету, проблемы с получением информации.
- Реклама
Вот это почитай : http://samou4ka.net/page/interfejs-spi- ... llerov-avr
Выпрямите спину и уберите левую руку от лица.
Мой Youtube канал
Мой Youtube канал
Ну а в чём проблема? Контроллер аппаратно всё получит, вместо того байта, который уехал, будет который приехал. Внутри стоит обычный сдвиговый регистр. С одного конца данные отправляются, с другого принимаются. Вот и вся сложность.Sergokot писал(а):С сдвиговыми триггерами уже работал, проблем с отправкой у меня нету, проблемы с получением информации.
Я в своем примере использовал программный SPI. Можно вешать на любые ноги МК. Так показалось проще, в MRF49 регистры 16-битные.
- Сообщения: 20
- Зарегистрирован: Вс янв 17, 2010 15:02:01
Спасибо всем буду разбираться.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Еще больше бесят такие:По собственному опыту знаю, как бесят такие фразы.
Т.е., "я методом тыка использую костыли ардуинового типа, и мне влом читать документацию. Сделайте это за меня и разжуйте."Я через CodeVisionAvr пишу, он всю сложность USAR'а к минимуму сбавляет, а у SPI столько параметров, что понять я их не могу
Отсутствие желания читать документацию - древнейший и самый страшный грех.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 303
- Зарегистрирован: Сб янв 08, 2011 13:48:41
Здравсвуйте посоветуйте что не так?сделал передатчик на МЕГА48 ,сделал проект на протеусе,выдает только черточки(Уже много раз проверил,непойму где нетак( Частота 8МГц,8 бит данных,один стоп.Может быть косяк в проекте ПРОТЕУС?
Красным подчеркнуто что ненадо читать)
.list
.nolist
.LISTMAC
.def temp = r16;
.def data = r17;
.def delay = r18;
.def delay1 = r19;
.def DC = R20;
.def TEMP1= R28;
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
Reset:
ldi temp,high(RAMEND) ; инициализация стека
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
ldi temp, 0xff ; инициализация порта С на выход
out DDRC, temp ; -------------------
rjmp USART_Init;
zapoln:
ldi delay,0x00;
ldi delay1,0x35;
loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret
USART_Init: ; начало инициализации USART
; скорость передачи даных 9600бод при частоте кварца 8МГц
ldi r17,0
ldi temp,0x51
sts UBRR0L,r17;
sts UBRR0H,temp; установка скорости передачи данных
ldi temp,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UCSZ02)
sts UCSR0B,temp ; разрешение приемо-передачи данных, запрет прерываний
; установка формата кадра: 8 бит данных, 1 стоповых бита
ldi temp,(0<<UMSEL01)|(0<<UMSEL00)|(0<<USBS0)|(1<<ucsz01) | (1<<ucsz00)
sts UCSR0C,temp ; посилка даных длинной 8 бит
start:
ldi r17,3
sts UDR0,r17 ; этот код мы будим пересылать в ПК
USART_Transmit:
lds temp,UCSR0A;
sbrs temp,5 ;ожидание, пока буфер данных не очистится
rjmp USART_Transmit
; передача кода
rjmp start;
; Прием кода данных из ПК
Priem_koda:
lds temp,UCSR0A;
sbrs temp,7
rjmp Priem_koda
ldi temp,UDR0 ; считываем то,что нам прислал ПК
out PORTC,temp ; принятый код с ПК выводим на выводы порта С
rjmp USART_Transmit ;конец цикла, переход на его начало
Красным подчеркнуто что ненадо читать)
Спойлер
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc".list
.nolist
.LISTMAC
.def temp = r16;
.def data = r17;
.def delay = r18;
.def delay1 = r19;
.def DC = R20;
.def TEMP1= R28;
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
Reset:
ldi temp,high(RAMEND) ; инициализация стека
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
ldi temp, 0xff ; инициализация порта С на выход
out DDRC, temp ; -------------------
rjmp USART_Init;
zapoln:
ldi delay,0x00;
ldi delay1,0x35;
loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret
USART_Init: ; начало инициализации USART
; скорость передачи даных 9600бод при частоте кварца 8МГц
ldi r17,0
ldi temp,0x51
sts UBRR0L,r17;
sts UBRR0H,temp; установка скорости передачи данных
ldi temp,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UCSZ02)
sts UCSR0B,temp ; разрешение приемо-передачи данных, запрет прерываний
; установка формата кадра: 8 бит данных, 1 стоповых бита
ldi temp,(0<<UMSEL01)|(0<<UMSEL00)|(0<<USBS0)|(1<<ucsz01) | (1<<ucsz00)
sts UCSR0C,temp ; посилка даных длинной 8 бит
start:
ldi r17,3
sts UDR0,r17 ; этот код мы будим пересылать в ПК
USART_Transmit:
lds temp,UCSR0A;
sbrs temp,5 ;ожидание, пока буфер данных не очистится
rjmp USART_Transmit
; передача кода
rjmp start;
; Прием кода данных из ПК
Priem_koda:
lds temp,UCSR0A;
sbrs temp,7
rjmp Priem_koda
ldi temp,UDR0 ; считываем то,что нам прислал ПК
out PORTC,temp ; принятый код с ПК выводим на выводы порта С
rjmp USART_Transmit ;конец цикла, переход на его начало
- Вложения
-
- Безымянный.GIF
- (36.84 КБ) 469 скачиваний
-
- Новая папка.rar
- (17.02 КБ) 214 скачиваний
Код: Выделить всё
ldi r17,0
ldi temp,0x51
sts UBRR0L,r17;
sts UBRR0H,temp; установка скорости передачи данных- Сообщения: 303
- Зарегистрирован: Сб янв 08, 2011 13:48:41
ldi r17,0
ldi temp,51
sts UBRR0L,r17;
sts UBRR0H,temp; установка скорости передачи данных
неправильно написал,нужно было 51(десятичной),но всеравно неработает(
ldi temp,51
sts UBRR0L,r17;
sts UBRR0H,temp; установка скорости передачи данных
неправильно написал,нужно было 51(десятичной),но всеравно неработает(
А что за магические числа?
Учитесь использовать именованные биты, как в даташите. И всем заодно понятно станет.
Учитесь использовать именованные биты, как в даташите. И всем заодно понятно станет.
Обычно инит скорости делают так , благо в даташит есть формулы
Это для моего кварца 0x47
Код: Выделить всё
ldi temp,HIGH((SYSCLK/(16*USARTSPEED))-1) ; для 9600 - - 0x47
outr UBRRH,temp
ldi temp,LOW((SYSCLK/(16*USARTSPEED))-1)
outr UBRRL,tempТак ведь и ещё раз неправильно написал, новый Ваш код не привожу за ненадобностью. Ошибку точно не указываю , что бы Вы сами поняли и уже никогда не забудите.неправильно написал...
- Сообщения: 303
- Зарегистрирован: Сб янв 08, 2011 13:48:41
упростил себе задачу так?:
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
ldi r17,low(bauddivider);
ldi temp,high(bauddivider);
sts UBRR0L,r17;
sts UBRR0H,temp;
всеравно непашет(
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
ldi r17,low(bauddivider);
ldi temp,high(bauddivider);
sts UBRR0L,r17;
sts UBRR0H,temp;
всеравно непашет(
Странно. Скорость теперь пришла в норму т.е записалась в положенный регистр . Правда не понятно чему соответсвует посылаемый Вами код 3 и что при этом хотите получить на экране и может ли протеус сие воспроизвести.
03 - Ascii - End of Text
03 - Ascii - End of Text
- Сообщения: 303
- Зарегистрирован: Сб янв 08, 2011 13:48:41
я думал число,или это только через Ascii ? а если просто посылать числа,они будут отражаться?
ascii такой ?
ascii такой ?
- Вложения
-
- _ASCII_code.asm
- (21.21 КБ) 243 скачивания
- Сообщения: 3784
- Зарегистрирован: Ср дек 24, 2008 09:58:58
ASCII - это вот: http://www.asciitable.com/
Хотите переслать цифру 3 - посылайте код 0х33.
Хотите переслать цифру 3 - посылайте код 0х33.
- Сообщения: 64
- Зарегистрирован: Пт ноя 18, 2011 18:43:01
Попробуй http://www.terraelectronica.ru/catalog. ... =2&PageS=1, http://www.terraelectronica.ru/pdf/SUNRAY/SRWF-1021.pdf прост в подключении, использует UART, USART, большая дальность действия. Выдерживает переплюсовку, но нужна защита от напряжения не более 5 v (проверено).Sergokot писал(а):Доброго времени суток! Делаю умный дом, есть необходимость обмениваться данными между двумя устройствами по беспроводной связи. Сначала хотел использовать отдельный приёмник и передатчик, но для этого нужно много места в устройстве, что недопустимо. Узнал о таких микросхемах, как MRF49XA-I/ST, CC1101RTKR, CC1121RHMT, но все они работают на SPI интерфейсе, а с ним я не знаком, мне ближе UART/USART. Вот чего хочу спросить: Существуют ли подобные трансиверы, с подобными характеристиками, но на UART/USART интерфейс? Или может есть преобразователи UART-SPI?


